⚡
フローでApexアクションとして使用するApexの引数指定
はじめに
フローではApexアクション要素としてApexクラスを呼び出すことができます。
その際にフロー変数をApex側の変数として渡したりApexの返却値をフローで受け取ることができますが、Apex側の変数の型を正しく指定しないとフロー側で入力、出力値の指定ができなくなったりします。
ここの指定に悩んだので、メモとして調べた内容を記載します。
入力
以下、レコードID(フロー側変数では「テキスト」)をフローからApexに渡すときの変数の型です。
使用アノテーション | フロー側の変数の型 | Apex変数の型 |
---|---|---|
@InvocableMethod |
単一変数 | List<Id> |
@InvocableMethod |
コレクション変数 | List<List<Id>> |
@InvocableVariable |
単一変数 | Id |
@InvocableVariable |
コレクション変数 | List<Id> |
文章で書くと、以下のイメージです。
-
@InvocableMethod
アノテーションを使って、メソッドの引数で変数を指定する場合は、Apex変数の型はListでくくる。 -
@InvocableVariable
アノテーションを使って、別クラスで変数を指定する場合は、Apex変数の型は想像通り(単一変数ならListなし、コレクション変数ならListあり)。-
@InvocableMethod
側は、InvocableVariable用別クラスをListでくくった型とする。
-
実例
@InvocableMethod
アノテーションのみの場合
@InvocableMethod
アノテーションの場合は単一変数、コレクション変数どちらでも get
メソッドで欲しいデータを取得します。
単一変数を渡す
public class flowToApexSample{
@InvocableMethod(label='flowToApexSample')
public static List<Id> sample1(List<Id> requests){
for(Id requestId : requests){
//以下requestIdを使って処理を行う
//...
}
}
}
コレクション変数を渡す
public class flowToApexSample{
@InvocableMethod(label='flowToApexSample')
public static List<Id> sample1(List<List<Id>> requests){
for(List<Id> request : requests){
for(Id requestId : request){
//以下requestIdを使って処理を行う
//...
}
}
}
}
@InvocableVariable
アノテーション用別クラスを作成する場合
public class flowToApexSample{
//入力変数用のクラスを作り、変数を入れる
public class sampleInputInfo{
//単一変数&必須
@InvocableVariable(required=true)
public Id contextId;
//コレクション変数&任意
@InvocableVariable
public List<Id> selectedIds;
}
@InvocableMethod(label='flowToApexSample')
public static List<Id> sample1(List<sampleInputInfo> inputInfos){
for(sampleInputInfo inputInfo : inputInfos){
Id contextId = inputInfo.contextId;
List<Id> selectedIds = inputInfo.selectedIds;
//以下contextIdとselectedIdsを使って処理を行う
//...
}
}
}
出力
出力(Apex→フロー)も、入力と同様の変数の型を指定した変数をreturn文で指定すればフローに渡せます。
実例
@InvocableMethod
アノテーションのみの場合
単一変数を返す
public class flowToApexSample{
@InvocableMethod(label='flowToApexSample')
public static List<Id> sample1(List<Id> requests){
List<Id> returnIdList = new List<Id>();
for(Id requestId : requests){
//以下requestIdを使って処理を行う
//...
returnIdList.add(/*ここに返したいId変数を指定*/);
}
return returnIdList;
}
}
コレクション変数を返す
public class flowToApexSample{
@InvocableMethod(label='flowToApexSample')
public static List<List<Id>> sample1(List<List<Id>> requests){
List<List<Id>> returnIdLists = new List<List<Id>>();
for(List<Id> request : requests){
List<Id> returnIdList = new List<Id>();
for(Id requestId : request){
//以下requestIdを使って処理を行う
//...
returnIdList.add(/*ここに返したいId変数を指定*/);
}
returnIdLists.add(returnIdList);
}
return returnIdLists;
}
}
@InvocableVariable
アノテーション用別クラスを作成する場合
public class flowToApexSample{
//出力変数用のクラスを作り、変数を入れる
public class sampleOutputInfo{
//単一変数
@InvocableVariable
public Id contextId;
//コレクション変数
@InvocableVariable
public List<Id> selectedIds;
}
@InvocableMethod(label='flowToApexSample')
public static List<sampleOutputInfo> sample1(List<Id> requests){
List<sampleOutputInfo> returnInfos = new List<sampleOutputInfo>();
for(Id requestId : requests){
//以下requestIdを使って処理を行う
//...
sampleOutputInfo returnInfo = new sampleOutputInfo();
//sampleIdはId型、sampleIdsはList<Id>型の変数
returnInfo.contextId = sampleId;
returnInfo.selectedIds = sampleIds;
returnInfos.add(returnInfo);
}
return returnInfos;
}
}
Discussion