Apex を呼び出すフロー、コレクション変数を渡すことができません


入力パラメータをList型で定義していますが、フローから呼び出そうとするとコレクション変数が選択できないですね。
困った。だからフローは使いたくない。　ヘルプを見てコードを書いたけど機能しない。


```
@InvocableMethod(label='sendRport')
    public static List<String>  test004(List<String> inputStringList) {
```


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/24455205-6f62-0919-4423-3603d8a33eca.png)


１日探して回答かなぁって思ったけど違う。
[Flow calling Apex, can't pass Collection Variable](https://salesforce.stackexchange.com/questions/205654/flow-calling-apex-cant-pass-collection-variable)

Listを重ねた不細工な定義しましたが、コレクション変数は出てきませんね。

```
@InvocableMethod(label='sendRport')
    public static List<String>  test004(List<List<String>> inputStringList) {
```

このようにはならんなぁ
[How to pass Salesforce Flow variables into Apex Class with correct scope?](https://stackoverflow.com/questions/69322019/how-to-pass-salesforce-flow-variables-into-apex-class-with-correct-scope)


一旦フローの編集ページを抜けて、再度開いて確かめたら、おおおお出てきたよ。やっと。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/c7680fda-be1c-0df2-fc03-146fbe645194.png)

しかし、以下の「入力で使用可能」の設定がないとエラーになりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/0d126e31-6c04-dd26-ac87-198205cdf169.png)

------------------------------------------

+ [How to call invocable method from flow](https://www.apexhours.com/how-to-call-invocable-method-from-flow/)

There can be at most one input parameter and its data type must be a list of the following: primitive data type, sObject type, generis sObject type, user-defined type containing variables of the supported types above, or user-defined Apex types.

sObjectならできる？

```
@InvocableMethod(label='sendRport')
    public static List<String>  test004(List<sObject> inputStringList) {
```

ああああ、できませんね。選択できるのがオブジェクトになっただけ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/7f37d385-7989-5860-2cd1-3e039f4f9128.png)

# 結果数は、1 つの一括実行要求で実行されたインタビュー数と一致しません。

コレクション変数を渡せるようになったので、Apexの中でメールを複数送信してみました。
どうもフローのApexアクションの中でメールを送信できるのは１通だけかもしれませんね。

シングルメールがダメかな？

```
Messaging.SingleEmailMessage email = new Messaging.SingleEmailMessage();     
EmailService service = new EmailService(email);
```

英語のエラーメッセージで言えば、これのようです。

The number of results does not match the number of interviews that were executed in a single bulk execution request.


[Flow Error: The number of results does not match ....](https://developer.salesforce.com/forums/?id=906F0000000g0PyIAI)

この回答を読むと入力でList変数のサイズが２なら、出力でもList変数のサイズは2にしないといけないようです。
入力と出力のサイズを同じにする必要がありますです。

+ [Error Occurred: The number of results does not match the number of interviews that were executed in a single bulk execution request.](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000A8xXeSAJ)

I believe the error was on the input parameter being an sobject not a list . Changing the request type and the logic within the method to handle list of sobjects did the trick!

しかし、リストの結果はサイズ２を返しているけどエラーになりますね。よく分からん。


# 解決方法がみつかりました。

```
Apexのコードですが入力時の変数はフローから見てコレクション変数として扱えるようにList<List<String>>と定義していましたが、戻り値はList<String>でした。　入力と同じようにList<List<String>>で返すと、このエラーは無くなりました。
```

入力と出力の変数の型をそろえておくということでしょうか？

# 恰好悪ですが、以下のように複数のApexアクションを書けば動きました。Maxがあるかとやってみましたが6アクションでも問題ないようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/7144d928-3a34-41e9-f1bb-d6ce433a3ddf.png)