フローで乱数を扱いたい!!(唐突)
という状況があるとします。(実際にあるかあ別として)
Summer'21現在、フローではRAND()に相当する関数がありませんので、これを実現するためにはApexを呼び出す必要性があります。
この際にInvocableアノテーションを使用して、Apexを記述していくことになるのですが…
見事、落とし穴にはまってしまいました。
間違ったコード
最初の画面で入力した数を引数として、その数の分だけ乱数を生成して、そのリストを返す…
こういうコードを記述したくて、最初に書き上げたのがこちら↓
global class CreateRandomNumber {
    @InvocableMethod
    global static List<Integer> getRandomNumber(List<Integer> sizeInput){
        List<Integer> randomNumbers = new List<Integer>();
        for(Integer size : sizeInput){
            for(Integer counter = 1; counter <= size; counter++){
            Integer rand = Math.round(Math.random() * 1000);
            randomNumbers.add(rand);    
          }
        }
        return randomNumbers;
    }
}
一応テストもして、コードカバレッジも100%にしました。
そして、画面フロー組んで早速デバッグしたら…
エラーが発生しました。
Apexをコールした直後の話です。
(|)おやおやおやおやおやおやおや
何がいけなかったのか
少しHelpの方から記述を引用します。
戻り値の型が Null 以外の場合は、メソッドによって返されるデータ型が次のいずれかである必要があります。
- プリミティブデータ型のリスト、またはプリミティブデータ型のリストのリスト – 汎用 Object 型はサポートされていません。
 - sObject 型のリスト、または sObject 型のリストのリスト。
 - 汎用 sObject 型のリスト (List)、または汎用 sObject 型のリストのリスト (List>)。
 - 前述のサポートされている型の変数、またはユーザ定義の Apex 型を含み、InvocableVariable アノテーションが付加されているユーザ定義型のリスト。各自のデータ型を実装するカスタムのグローバルまたは公開 Apex クラスを作成し、そのクラスに呼び出し可能な変数アノテーションが付加されているメンバー変数が少なくとも 1 つ含まれていることを確認します。
 
先ほどのコードはこれを守っています。はてさて、何がいけなかったのか…
結論から言うと、__メソッドの戻り型が間違っていた__です。
引数の部分はList<Integer>型となっていますが、実際にフロー側では__数値のコレクション変数を引数に渡すことができません__。__数値の単一変数のみ__渡せました。
戻り値についても同じことが言えます。
先ほどのコードのように戻り型をList<Integer>としていると、実際に__フロー側に返されるのは数値の単一変数__です。__リストが1段階はがされている__のですね。
ですがApexコード上では、戻り値の例としては、
[53, 169, 39, 765, 346](引数として5が渡された場合)
ここからリストが1段階はがされるので、5つの数値がコレクションではない形でフロー側に渡されるわけです。
…そりゃ、エラーになるわな。
エラーの出ないコード
以上を受けて直したコードはこちらです。
global class CreateRandomNumber {
    @InvocableMethod
    global static List<List<Integer>> getRandomNumber(List<Integer> sizeInput){
        List<Integer> randomNumbers = new List<Integer>();
        List<List<Integer>> output = new List<List<Integer>>();
        for(Integer size : sizeInput){
            for(Integer counter = 1; counter <= size; counter++){
            Integer rand = Math.round(Math.random() * 1000);
            randomNumbers.add(rand);    
        	}
        }
        output.add(randomNumbers);
        return output;
    }
}
最適なコードかと言われれば__そうではない__のですが、思い通りに動いたのでヨシ!です。
これで望むだけの個数の乱数をフローで扱えるようになりました。
(|)素晴らしい…素晴らしい…!