SalesforceからJavascriptボタンを追放する！アクションボタンとフロービルダーを組み合わせた（後編）

こちらは[SalesforceからJavascriptボタンを追放する！アクションボタンとフロービルダーを組み合わせた（前編）](https://qiita.com/DEKA_PIYO/items/70aa47c4f6d651b189ff)の続きの内容になります。まだの方は前編からご確認ください。



![行動一括作成全体像.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510376/09496dd0-f7c7-cee9-7de8-98a1be3ae940.png)


１．現在表示している取引先と商談の情報を取得（前編解説済み）
２．画面にデータを入力（前編解説済み）
**３．条件分岐で親取引先がない場合は最初の取引先の活動だけ作成**
**親取引先がある場合は親に関連している全ての取引先を取得**
**４．３．で取得した情報をループに渡し最新の商談を取得後、行動を作成**
**５．取得した行動の件名がないものは削除し、ループに戻る。**
**件名はあるものはループにもどり取引先の数だけ繰り返す**

後編は３．の条件分岐からの解説です。

##④条件分岐「決定」
アイコンでは「決定」とありますが、**分岐の条件を決めて場合わけするために使う**ものです。決定のラベル、API名を入力し「結果」と呼ばれる場合分けを決めていきます。「＋」で追加すれば多くの結果を作成することができます。

プロセスビルダーでいうと◇マークの条件ノードの部分となります。
その条件に合致した場合のアクションはこの後の**レコードの取得や更新などの要素につなげていきます**。

今回結果は取得した取引先に親取引先が紐づいているかどうかの判定になります。
場合分けは以下のようになります。
![決定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510376/6878e045-e30f-30e8-d41c-883a3dbb34d8.png)

結果の順序の一番下が「デフォルトの結果」とありますが、こちらのラベルも変更することができますのでこちらは「あり」に変更します。

##親取引先が「なし」の場合
###⑤親なしの行動作成
「レコードを作成」から以下のように入力します。基本的に画面で入力してあるものをそのまま項目にいれていきます。**ポイントはSubject（件名）**となります。こちらは取得した取引先に紐づいている**商談のフェーズにより自動的に件名をいれる数式を作成**します。

![フロービルダーのレコード作成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510376/4af5183b-9391-3ed8-0b0f-b7f30fa53877.png)

基本的にカスタム項目の数式で作成するものと同様に作成することができます。

![フロービルダーの数式.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510376/efca891f-2331-2114-d65f-876d42b27644.png)


ここで気を付けるべきは**この段階で数式にエラーがあってもすぐわからずフローを保存しようとしたときにエラーが発生**してしまいます。

慣れないうちはカスタム項目の数式を仮に作成してエラーがないかどうか確認してからこちらにコピペすればスムーズでしょう。

⑤親なしの行動作成は作成したことをユーザに伝える画面⑬を表示させて終了となります。

##親取引先が「あり」の場合
###⑥親に関連する取引先取得
まずは親取引先に紐づいている子の取引先を全て取得していきます。
次の条件で取得することができます。

項目：`ParentId`
演算子：`次の文字列と一致する`
値：`{!get_Account(最初の「レコードを取得」で設定したAPI名).ParentId}`

（「手動割り当て変数(詳細)」にチェックが入っていない場合）

###⑦各取引先処理
続いて「ループ」の設定です。詳細がわからない人は次の記事を読まれたほうがスムーズかと思います。
[プロセスビルダーとFlowBuilderを組み合わせた（応用）](https://qiita.com/DEKA_PIYO/items/51d800f79eec1cbc215b)

コレクション変数は直前の「レコードを取得」で設定したAPI名を選択します。
ループ変数は任意のループ変数を設定します。

ループのラベル：各取引先処理(任意の名前)
ループのAPI名：`roop_Account`(任意の名前)
コレクション変数：`{!get_related_parent_acount}`（任意の名前）
ループ変数：`{!related_Account}`(任意の名前、データ型：レコード、オブジェクト：取引先)

###⑧最新の商談取得
「レコードを取得」でループ中の取引先の最新の商談を取得します。
行動は各取引先の**最新の作成日の商談のフェーズをベースに行動の件名を取得**していきます。

レコードの取得のラベル：最新の商談取得（任意の名前）
レコードのAPI参照名：get_new_Opp（任意の名前）
レコードを絞り込み
項目：`AccountId`
演算子：`次の値に一致する`
値：`{!related_Account（ループ変数の名前）.Id}`

レコードを並び替え
並び替え順：`降順`
並び替え：`CreatedDate`

条件自体は複数の商談が該当する場合でも、並び替える基準の項目や順序を決めた上で「最初のレコードのみ」保存すればほしい一つだけのレコードを取得することができます。ここではフェーズも商談項目として保存します。

###⑨行動作成

続いて行動の作成をしていきます。**親取引先がなしの場合と同様**に項目を保存していきます。
**違いは件名の数式のリソースだけ**となりますので新しく数式を作成します。
(あるいはif文を組み合わせて、ない場合・ある場合で数式を作成し一つにまとめるのも良いと思います。）

Caseの数式
TEXT({!get_Opp.StageName})から`TEXT({!get_new_Opp.StageName})`へ変更

###⑩件名の取得

続いて行動の情報を取得します。
オブジェクト：行動
項目　：`Id`
演算子：`次の文字列と一致する`
値　　：`{!make_Event}`(⑨で作成した行動のAPI参照名)


###⑪件名があるか
続いて「決定」となります。
先ほど取得した行動の情報をもとに判定していきます。

結果：`なし`
リソース：`{!get_Subject(先ほど作成した行動のAPI参照名).Subject}`
演算子：`null`
値：`{!$GlobalConstant.True}`

デフォルトの結果を「あり」に変更します。
結果「あり」の場合は「ループ」につなげます。

結果「なし」の場合
件名がないということは商談がないということなので、今回の前提として行動を作成しないようにします。

###⑫行動削除
「レコードを削除」で以下のように設定します。
レコードの絞り込み
項目：`Id`
演算子：`次の文字列と一致する`
値：`{!make_Event}`（⑨で作成した行動のAPI参照名）

その後ループにもどるようにつなげます。

ループが終わってからも処理を続けたい場合は続けることができます。今回は行動が作成したことをユーザに伝える画面につなげて処理を終えます。

##フローをデバッグして動作を確認する
2,3個までの要素のフローであれば特別デバッグをしなくても実際に動かしてテストすれば十分かもしれません。しかし今回のように数多くの要素を組み合わせると、実際に有効化してテストを繰り返すのはなかなか骨の折れる作業になります。作成途中でテストして動作を確認したいときもあるので、こういうときはフロービルダー上でデバッグすることができます。

![フローをデバッグ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510376/406147d8-d373-5bb7-0350-0c7be9d8ec6a.png)


入力変数として出てくるのは変数の作成時に「フロー外部での可用性」で「入力で使用可能」にチェックが入っているとデバッグの際に出てきます。フローアクションをするときは自動的にIDを取得してくれますが、**デバッグのときは自分で対象のIDを入れなければいけません。**今回は取引先IDを入力します。また**デバッグで作成されたレコードは実際に作成されます**ので、不要であれば後程削除する必要があります。

![フロービルダーのデバッグ実行.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510376/590440fd-bdf8-25e5-8652-5613023ae7df.png)

作成したフローに従って右側の「デバッグの詳細」に記録が残ります。補足すると「高速検索」とはフロービルダーの「レコードを取得」にあたります。旧クラウドフローデザイナーの名残として残っているのだと思います。

ここで動作を十分確認してから、有効化し、前編で解説したようにフローアクションを追加すれば完成です。

##レコード画面にもフローを追加してみる
またLightningアプリケーションビルダーからレコードにフローを追加することもできます。

![Lightningアプリケーションビルダーでレコード画面にフローを追加.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510376/a4069428-180b-e036-268a-958586a574c2.png)

簡単に解説すると、Lightningアプリケーションビルダーではレイアウトの編集が可能です。
フローは1列か2列かを選択できます。また動的なレコードを表示する際は「レコードIDをこの変数に渡す」にチェックを入れます。

##ループの修正版
こちらを記事にした当時はこのループが正しいものだと思っておりましたが、厳密にはこの方法だと制限に達してしまい上手くいかないケースも出てくるのではないかと思います。上記のループを修正した記事がこちらになります。

[フロービルダーで制限に達しないようにループを使ってみた](https://qiita.com/DEKA_PIYO/items/b08695a855700888680d)