はじめに
皆さん、Salesforce フロー(Flow Builder )は利用されていますか?
Salesforceで自動化と言えばプロセスビルダーやワークフロー、それで実装できない場合はApexと、(私含め)いまいちフローにはまだ手を出せていない方も多いのではと思います。
そこで今回はフローのイメージを掴めるように、実装モデルの1つとして関連リストにあるレコード(子レコード)の一括更新の方法を紹介します。
実装要件
本記事ではフローを用いた子レコードを更新する方法を紹介します。
例として下記のような要件があったとします。
・現在取引先オブジェクトと、それの子として紐づく商談オブジェクトを利用している。
・「もし取引先との取引が中止になった際に、紐づいている商談の中で、既に商談が完了しているレコード以外はステータスを「商談失敗」にしたい」

上記要望をフローを用いて実現します。簡単な実装手順は下記になります。
1.取引先オブジェクトにフラグ項目「取引中止」を作成する。
2.以下のフローを作成する。
・「取引中止」がTrueになったら、取引先に紐づく子レコードの内、ステータスが「Closed Won」以外の商談レコードのステータスを「Closed Lost」に更新する。
それでは、実際に実装をしていきます。
実装
1.取引先オブジェクトにフラグ項目「取引中止」を作成する。
こちらは今回のテーマとはズレるので省略しますが、画像のように項目「取引中止」(API名:AccountLost__c)を作成して、ページレイアウトに追加しておきます。

2.フローを作成する。
本題のフロー部分の実装入ります。
フロー実装の手順としては下記になります。
1.新規フローを追加する
2.フローの開始条件を設定する
3.更新対象のレコードの取得
4.ループの追加(更新対象のレコードを1レコードずつ見る)
5.分岐の追加(どの値に更新するかを選別する)
6.レコードの更新
7.フローの有効化
実際に作成してみます。
1.新規フローを追加
設定の「ホーム」から「フロー」を選択して右側にある新規フローボタンを選択します。

新規フローポップアップ画面の中から「レコードトリガフロー」を選択して作成ボタンをクリックします。

2.フローの開始条件を設定
開始条件のポップアップ画面が表示されます。ここではフローの開始条件を設定します。
今回は取引先オブジェクトの項目「取引中止」がTrueになったらフローが開始されます。それぞれ下記のように設定して完了を押します。
オブジェクト:取引先
フローをトリガする条件:レコードが作成、または更新された
条件の要件:すべての条件に一致 (AND)
項目:AccountLost__c(取引中止)
演算子:次の文字列と一致する
値:True
更新されたレコードでフローを実行するタイミング:条件の要件に一致するようにレコードを更新したときのみ
フローを最適化:アクションと関連レコード

開始条件に追加されます。

3.レコードの取得
3ではレコードを取得します。今回はトリガとなった取引先レコードを親として参照している商談レコードを取得します。
即時実行の下にある+ボタンを押して出てきた要素の中から「レコードを取得」を選択します。

新規のレコードの取得ポップアップ画面で下記のように設定して完了を押します。
表示ラベル:商談レコード取得
API参照名:GetOpportunityRecord
オブジェクト:商談
条件の要件:すべての条件に一致 (AND)
項目:AccountId(取引先ID)
演算子:次の文字列と一致する
値:$Record > 取引先 ID保存するレコード数:すべてのレコード
レコードデータの保存方法:すべての項目を自動的に保存

要素が追加されます。

4.ループの追加
4では取得したレコードを1件ずつ確認するためにループを追加します。
3で作成した要素の下にある+ボタンを押して出てきた要素の中から「ループ」を選択します。

新規ループポップアップ画面で下記のように設定して完了ボタンを押します。
表示ラベル:商談レコード更新ループ
API参照名:UpdateOpportunityRecordLoop
コレクション変数:{!GetOpportunityRecord}(3で作成した要素)

ループ要素が追加されます。

5.分岐の追加
5では3で取得した商談レコードを条件で分岐させます。この要素で分岐されることによって商談によって正しい更新アクションを分けることが出来ます。
今回は商談の項目フェーズが「Cloesd Won」かそれ以外かという条件でした。
実際に設定していきます。
ループ内の「項目ごと」の下にある+を押して出てきた決定を選択します。

新規決定ポップアップ画面に下記値を設定します。
新規決定
表示ラベル:フェーズがCloedWonか
API参照名:IsStageNameCloedWon結果の詳細
表示ラベル:フェーズがCloesdWon結果の API 参照名:CloesdWon
結果を実行する条件の要件:すべての条件に一致 (AND)
リソース:ループ UpdateOpportunityRecordLoop の現在の項目 > フェーズ演算子:次の文字列と一致する
値:Closed Won

結果の順序の「デフォルトの結果」を選択し、表示ラベル名を「CloesdWon以外」に設定して完了を押します。

要素が追加されました。これで、商談レコードのフェーズがClosedWonだった場合とそうでない場合で処理を分けることが出来ます。

6.レコードの更新
6では5で分岐されたレコードごとにそれぞれ更新アクションを設定します。
今回は商談のフェーズが「ClosedWon」以外の場合、フェーズを「ClosedLost」に更新するという要望でした。
実際に作成していきます。
決定のClosedWon以外の下にある+を押して出てきた要素から「レコードを更新」を選択します。

新規のレコードの更新ポップアップ画面で下記値を設定して完了を押します。
表示ラベル:商談レコード更新
API参照名:UpdateOpportunityRecord更新するレコードを検索してその値を設定する方法:レコードを識別する条件を指定し、項目を個別に設定
オブジェクト:商談
商談レコードを絞り込み
レコードを更新する条件の要件:すべての条件に一致 (AND)
項目:Id
演算子:次の文字列と一致する
値:ループ UpdateOpportunityRecordLoop の現在の項目 > 商談ID商談 の項目値を レコード に設定
項目:StageName
値:Closed Lost

要素が追加されています。

これでフローは完成しました。作成したフローの全体図は下記になります。

7.フローの有効化
フローの作成は完了しました。後は有効化すれば実際に、フローが起動するようになります。
保存ボタンを押して、任意の値でフローを保存した後に有効化をクリックします。これでフローが有効化されました。

動作確認
実際に、更新が上手く行えているか確認してみます。
例として、画像のように取引先Aとそれに紐づく商談A~Dがあります。フェーズは商談Dのみ「ClosedWon」になっています。つまり、取引先Aの項目「取引中止」にチェックを入れた場合、商談のD以外の商談レコードのフェーズが「Closed Lost」になります。

それでは実際にやってみます。
取引先Aの項目「取引中止」にチェックを入れて保存します。

商談D以外のフェーズが「Closed Lost」の更新されているのが確認できます。これでフローの方問題なく作成されていることを確認できました。

終わりに
自動更新はワークフローやプロセスビルダーでも可能ですが、フローの方が2つよりも実装可能な幅が広くなっています。これをきっかけに、フローについても興味を持っていただけたら幸いです。