[Salesforce] フローとプロセスビルダーを組み合わせて商談コピー時に(孫である)見積品目名も作成する

2021.02.18

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

Salesforceにて任意のオブジェクトを子レコードとの参照も含めてコピーできる Record Clone というアプリがあります。

GitHubのリポジトリもありました。

さて、この便利な Record Clone ですが惜しいことに孫レコードまではコピーできません(2021年02月18日現在)。 ですので、「案件(商談)」1をコピーした時にその子供の「見積」はコピーできますが、「見積」に紐づく「見積品目名」はコピーされません。

オブジェクト構成

そこで、フローとプロセスビルダーを組み合わせて「案件」コピー時に孫の「見積品目名」まで作成する処理を実装してみましたので共有します。

フローの実装

フローの全体像は次の通りです。

フローイメージ

プロセスビルダーから受け取る引数は次の3つです。

変数名 内容
QuoteId レコード (単一) 変数 処理対象の「見積」レコード
OpportunityId レコード (単一) 変数 処理対象の「案件」レコード
caller 変数 呼び出し元を示す文字列(案件からなら「案件」、そうでないなら「見積」

以下、フローの流れです。

  1. 呼び出し元チェックでcallerが「案件」の場合だけ後続の処理に進む
  2. 「商談商品」をOpportunityIdで検索して取得する
  3. 2で取得した「商談商品」を一つずつ取り出してループ
  4. 「見積品目名」の作成に必要な情報を変数に割り当て(ここでは商品IDと価格表エントリIDを割り当て)
  5. 割り当てた変数等を使って「見積品目名」を作成し3へ戻る

プロセスビルダーの実装

プロセスビルダーイメージ

プロセスビルダーは次の二つの目的で使っています。

  • Record Cloneを「案件」から実行した場合のみ先述のフローを実行する
  • 「見積」レコード、「案件」レコード、callerをフローに渡す(callerは「案件」という文字列をセットして渡す)

現状、Record Cloneを「案件」を起点に実行した場合と「見積」を起点に実行した場合との判定は見積名がClonedで始まるか否かで行っています。「見積」を起点にして実行する場合は「見積品目名」は子レコードになるため(Record Cloneが適切にコピーしてくれて)フローを実行させたくないということがあります。そのため、起点が「案件」なのか「見積」なのかを判断したいのですが、Record Clone実行時に任意の処理を差し挟むことができないため、判定ができません。

そのため、「案件」を起点に実行した時に子レコードの命名規則として「Cloned」を見積名の最初につける設定ができるので、これを利用して判定しています。したがって、「見積」を起点にRecord Cloneを実行する時にはコピー後の見積名の先頭に「Cloned」を含まないように運用する必要があります2

動作確認

「案件」をRecord Cloneでコピーして、コピーした「案件」の「見積」の「見積品目名」に「商談商品」の商品がセットされていることを確認します。

まとめ

兄弟の関係にあるオブジェクト(この記事では「商談商品」と「見積」との関係)の情報を取得して子レコード(「見積品目名」)を作成するのはプロセスビルダーだけでは難しいですが、フローと組み合わせることで実現することができました。兄弟や孫の関係など単純な親子関係に限られない関係の操作が必要な時はフローとプロセスビルダーとを組み合わせてみることを考えてみてください。

参考情報


  1. 当社では「商談」を「案件」と呼んで使っているため、以後は「案件」と記述します。 
  2. 何か他にいい方法があれば是非教えてくださいm(_ _)m 「見積.品目数」で判定することも試しましたが、積み上げ集計である「見積.品目数」は最後に評価されるため判定条件には使えませんでした。