Salesforce フローの選択オプションの改善(動的に選択肢をつくる)


月度と文字列を選択肢としてセットしたいと思います。月度は年度が替わるたびに2023/04...というように動的にセットしたいです。
初めはApexクラスでセットしたリスト変数（コレクション変数）をセットしようと思っていました。
変数にApex定義の変数をセットしてコレクション選択肢を使うつもりでしたが、うまくいかなかったです。
そこで、色々検索するとやっと見つけたかもしれない。
+ [Improving Salesforce Flow selection options](https://www.fluidogroup.com/improving-salesforce-flow-selection-options/)

何でもいいのでオブジェクトのコレクション変数を作ると、コレクション選択肢にセットできるようです。
オブジェクトの変数に値をセットして、コレクション変数に追加していきます。
そうすると、選択肢として表示できる感じです。

あれ、年月度が２重に追加されている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/a902aab5-eb21-126e-c346-7cdaf7f19094.png)


何で？
以下を読むと追加でなくて次の文字列と一致するを選べばいいみたい。

For this, we’ll use the Equals assignment type because as we have multiple records, when we later do another round of iteration, we’ll get the exact value of the particular record we’re parsing. If we used Add, on the next iteration, the record variable would have two records’ ID values in the field, three on the next iteration, and so on – not good.

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/cdb7b715-dc32-1e99-587d-b7f0fb84ef65.png)

コレクション変数なので並び替えもできる。しかし数値項目を指定したらエラーになりますね。
テキスト項目に変えたら、機能しました。よく分からんけど


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

# フローを介してエンド ユーザー向けにカスタマイズされた動的な選択肢を作成する方法。

まだ多くの制限がある特定の領域の 1 つは、Choice セットアップです。Spring 22 リリースで、Salesforce は Choice Collection Set を導入しました。これにより、レコードのコレクションを使用して選択肢のセットを生成できます。たとえば、ユーザーにオプションを選択させることができます。これは、以前のオプションよりも大幅に改善されました。

ただし、1 つの欠点があります。エンド ユーザーに表示するレコードの 1 つのフィールド (ラベル) のみを選択でき、選択したアイテムごとに 1 つのタイプと 1 つの値のみを選択できます。また、制限がある場合は、それを回避するためにちょっとしたトリックが必要になる場合があります。

# ユースケース 1

私がこのソリューションを思いついた最初のユースケースは、Experience Cloud サイトの画面フローを開発していたときでした。そこでは、エンドユーザーは、私が Experience Cloud サイトを開発していた会社に動的に連絡することができました。どのような種類の連絡を取りたいか、会社のどの支店に連絡するかを選択するためです。

現在、会社はオフィスをレコードとして独自のオブジェクトにきちんと配置していますが、すべてのオフィスは次のように都市ごとに同じ方法でラベル付けされています。

+ 会社ヘルシンキ
+ 会社ヘルシンキ
+ 会社 ストックホルム
+ 会社 ストックホルム

標準の Trailhead 組織で作成した例を次に示します。オブジェクト Office だけで、1 つの選択リスト項目 Office Type が追加され、オブジェクトのユース ケースと一連のレコードが強調表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/fbd5f03f-7944-82ec-b0c3-626d83a51e69.png)

現在、各オフィスには独自のレコードがあるため、フロー内のそれらの選択を作成するのはほとんど簡単です。レコード選択セットを作成し、オフィス オブジェクトを選択し、必要に応じてリストに不要なオフィスを除外し、それらを挿入するだけです。画面選択要素、ラジオ ボタン、またはピックリストに追加して、簡単に選択できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/ebe0294b-dc54-21c0-454d-b8a8505aa569.png)


ただし、Choice 要素では、エンド ユーザーに表示するフィールドを 1 つしか選択できないため、最適なフィールド (名前フィールド) を選択します。貧弱なエンド ユーザーは、連絡先が営業かサービスかを知ることができません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/e09c9198-fbe0-1f73-99e1-30629f5054ee.png)


簡単な解決策は、オフィスの種類に基づいてそれらを 2 つの異なる選択レコード セットにプッシュし、最初に販売またはサービスのいずれかを選択する選択肢をユーザーに提示し、次に画面コンポーネントの可視性を介してそれに基づいて、販売オフィスまたはサービス オフィスのみを表示することでした。 .

私はその解決策に完全に満足していませんでしたが、急いでいなかったので、休憩を利用できると考え、昼食を取りに行き、その間に悪意のある計画を立ててから戻ってきましたそれがうまくいくなら。

選択要素に関することは、それらから何を求めているかです。この場合、および他のほとんどのレコード選択のケースでは、それはレコードまたはレコードの ID です。基本的に、そうでない場合を除いて、他のすべては自明です。

ユーザーの選択の特定のレコード ID が返されてさらに処理される限り (元のユース ケースでは、コンタクト ケースを適切なキューに割り当てるため)、必要に応じて他の値を自由に操作できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/84c144e6-0e08-8d74-31da-0c96c8b1b54a.png)

# ユースケース 1: ソリューション

さて、私が思いついたよこしまな計画を見てみましょう。

オフィス名を自由に更新することはできなかったので、実際のレコードではなく、レコード変数を作業に使用できると考えました。そこで、異なるレコード変数のセットを使用して、必要な 2 つの出力 (更新された名前と各オフィスの実際の ID) を生成するという概念を思いつきました。

**動的レコード セット**

まず、Office オブジェクト用の "TempCollection" というレコード コレクション セットと、これも Office オブジェクト用の "TempOffice" という新しい単一レコード変数の 2 つの新しい変数を作成しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/3a071742-1abb-5656-13dc-21e045185d78.png)

次に、選択内容がエンド ユーザーに表示される画面の前のフロー パスに Get Records 要素を挿入しました。この要素では、前に行ったように、Madrid レコードを除くすべての Office レコードをフェッチします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/1cf10b7b-5334-0725-af77-1fc21cd7fbe3.png)


これもまた些細なことです。次に、魔法が起こる領域であるループに入ります。

**ループ**

ループでは、Get Records 要素から取得した office レコード コレクションを解析し、ご想像のとおり、いくつかの割り当てを行います。

最初の Assignment 要素 (AssignDetails) では、コレクション内の各 Office レコードの詳細を TempOffice レコード変数に割り当てます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/162857c8-dcf7-79ab-5952-0a4d7dd112bf.png)


各レコードに対して、いくつかの割り当てを行います。1 つ目は、ユーザーの選択から取得したいもの、つまり Office レコードの ID です。

これには、 Equals割り当てタイプを使用します。これは、複数のレコードがあるため、後で別の繰り返しを行うときに、解析している特定のレコードの正確な値を取得するためです。Add を使用すると、次の反復でレコード変数のフィールドに 2 つのレコードの ID 値が含まれ、次の反復では 3 つというようになり、良くありません。

次に、エンド ユーザーに表示するテキストを割り当て、修正します。

まず、ID で行ったのと同じ理由で、Equals演算子を使用します。その後、TempOffice 変数の Name フィールドは、現在のループ項目の Name フィールド値の Name フィールドと等しくなります。

ただし、次の割り当てでは、名前フィールドにテキストを追加する必要があるため、追加割り当て演算子を使用します。既に名前の値があるので、次に区切り記号 (単純な " – " スペース ダッシュ スペース) を追加して、オフィス名の値とオフィスの種類の値を区切ります。この目的のために、任意の文字列を使用できます。元のケースで使用したように、これを使用しました。

次に、レコード コレクション内の各項目の Office Type 値を追加して、再度 Add 操作を実行します。

これにより、次のような値を持つ TempOffice レコード変数が得られます。

ID: <現在のループ レコードのレコード ID>

名前: <現在のループ レコードの名前の値>" – "<現在のループ レコードのオフィス タイプの値>

たとえば、London Service ブランチの場合は次のようになります。

ID: a0068000005uFbhAAE

名称: Acme London – サービス

2 番目の割り当て要素 (PushToCollection) では、TempOffice レコードとそのすべての詳細を TempCollection コレクション変数にプッシュするだけです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/2ca4d6d8-5b70-32c1-6719-a6c40de25dd4.png)


前述のように、Equals 演算子を使用すると、ラウンドごとに TempOffice レコード変数の値がリセットされます。または、3 番目の代入を行って、空白の値をレコードに代入することもできます。

**コレクションチョイスセット**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/e2eea3b3-e9da-5f2e-0ee3-a3b4e9f23e33.png)


Office レコードの Name アイテムを引き続き使用していることに注意してください。「Acme City」の代わりに「Acme City – Service」（またはセールス）が含まれることがわかったのは今だけです。

新しい選択肢コレクションが設定されたので、それを画面要素に追加して、元のレコード コレクションを置き換えることができます。 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/dbd970cf-d043-659a-736e-69178b2d93ab.png)


# 結果 – パート 1

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/2e9b5223-1e69-aaee-24b9-9320a26f1b1b.png)

もちろん、「Service – Acme London」や「Sales – Acme London」など、テキストを別の方法で修正するなどの巧妙なトリックを実行してから、レコード コレクションを名前のアルファベット順に並べ替えて、最初に営業所を取得することもできます。 、サービス オフィスの 2 番目、または式を使用して「Acme」を解析し、短いリスト「London – Sales」および「London – Services」などを取得します。

# ユースケース 2

今それはクールでした。しかし、セレクションに関する多くの情報を提示する必要があり、場合によってはそれを少し並べ替えて、そこからきちんとしたセレクション リストを提供する必要がある場合はどうすればよいでしょうか?

心配はいりません。同じ顧客が、少し前に別の画面フロー用にそのような選択リストを要求したので、それを行う方法も考え出しました。

ロジックは同じです。上で行ったように、ソース オブジェクトから必要な情報を取得して結合します。この目的のために特別にそのオブジェクトを作成しましたが、データがあまりないため、連絡先オブジェクトとレコードを使用します。

ここに示すのは、Trailhead 組織の United Oil & Gas Corp の連絡先を解析したフローのスクリーン キャプチャです。前に行ったように、Phone フィールドと Email フィールドの値を FullName フィールドに追加し、それぞれの間にスペースのみを追加しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/8cc56bd8-9df8-79bf-d74b-8acc190ea155.png)


フィールドの前に電話番号と電子メールのラベルを追加するなど、少し整理したい場合はどうすればよいでしょうか? 簡単にできます。スペースの後に割り当てに追加するだけです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/a41fff14-64ea-d210-6cc9-5ee812d9d3a0.png)


それだけでは解決しません。さらに混乱を招くだけです。しかし、それらを行にプッシュできたらどうでしょうか?

# ユースケース 2: ソリューション

残念ながら、Name などのテキスト フィールドは改行をサポートしていません。基本的に、これは複数の行に分割できない文字列です。

幸いなことに、ほぼすべてのオブジェクトには 1 つまたは複数のテキスト エリアまたはロング テキスト エリア タイプのフィールドがあります。この調整により、テキスト フィールドだけに限定されなくなりました。

この例では、Contact オブジェクトに Description フィールドがあり、これを使用できるので便利です。レコードをコレクションにプッシュする前に、TempObject の Description フィールドにこれらすべての詳細を追加します。

したがって、Label コンテンツを FullName などのテキスト フィールドに割り当てる代わりに、Description フィールドにプッシュします。Description フィールドを Collection Choice Set の Label フィールドに更新することを忘れないでください。そうしないと、TempObject の FullName フィールドに何も割り当てられないため、選択するコンテンツが得られません。

**改行の問題**

これは、割り当て要素の詳細なスクリーン キャプチャです。前と同様に、最初に ID を割り当ててから、説明フィールドの内容を追加します。

行の変更をプッシュするために LineBreak 要素を追加したことに注意してください。通常の BR() 数式の改行がここでは機能しないため、これはトリッキーなものでした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/ef41d971-0a97-1bb4-8232-b5c22cfc4cfd.png)

改行については、動作する 2 つの異なるセットアップを発見しました。どちらもフローで TextTemplate 要素を使用します。

1 つ目は簡単です。新しいテキスト テンプレートを作成し、たとえば LineBreak という名前を付け、本文にスペースを 1 つ入力して保存しますが、必ずリッチ テキスト形式で保存してください。

もう 1 つはより複雑で、しばらく前から存在しており、より一般的に役立つ可能性があります。

まず、空の文字列 {!$GlobalConstant.EmptyString} の値を持つ定数を作成する必要があります。これを EmptyString と呼びましょう。

次に、テキスト テンプレートを定義し、その本文に、Enter で区切られた 2 つの EmptyString 定数値を挿入し、次のようにリッチ テキスト形式で保存します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/5241f2eb-c8a2-ba87-a318-7a99e11f3ddd.png)


# ユースケース 2: 結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/41c39d82-0279-e66e-e378-1ea1daeaa722.png)

課題の段階で、たとえば <b></b> などの HTML タグを 1 つまたは 2 つ追加して、たとえば電話フィールドと電子メール フィールドをもう少し目立たせることができます。
これで、使用する改行設定に関係なく、フローを実行すると、きちんと整理されたリストが得られます。