Mark Hammer's Blog

SalesforceやTrailheadに関する情報を投稿しているブログです。

項目が空白値でも一時停止要素ありのフローを動作させる

注意

この投稿は Known Issues: Pause element in Schedule Triggered Flow not considering Null value for $Record global variable while checking in Decision element の事象が解消していないことを前提としています。
Known Issueが解決済みの場合は本内容で記載した対応は不要と思われますので、一度Known Issueサイトをご確認ください。

はじめに

フローの要素の1つ、一時停止要素
通常の更新を行うだけならあまり使わない要素ですが、フロー内でコールアウト実行を行う場合は必須の要素となっています。

参考:Salesforceヘルプ: スケジュールトリガーフローに関する考慮事項 より

スケジュールトリガフローは、待機要素を実行した後にのみコールアウトを実行できます。たとえば、待機要素がないと、フローは外部オブジェクトへのアクセス、コールアウトを実行する Apex アクションの実行、または外部サービス登録から生成されたアクションの実行ができません。

この一時停止要素ですが、上述したKnown Issueにより、以下の状況では「$Record.XX__c の値が設定されていないか、割り当てられていないため、フローでこの値にアクセスできませんでした。」というエラーが発生しフローが起動しません。

  • 開始要素の「オブジェクト」でレコードを取得している。
  • 一時停止要素後に「$Record.XX__c」のように$Record変数の項目値を取得しており、かつ実際のレコードではその項目に空白値が入っている。

エラーとなるフロー例の全体像

レコードの更新要素の内容($Record.test2__cが空白値の項目です)

デバッグ画面でのエラー

この問題はWorkaroundがなく、Salesforceサポートに問い合わせても「回避方法はありませんので、一時停止要素の後に空白値がありえる項目にはアクセスしないでください。」と言われます。
ちなみにこの問題は「空白値へのアクセス」がエラーのトリガーとなるため、 IF(ISBLANK({!$Record.XX__c}), "a", {!$Record.XX__c}) のように空白値の項目にアクセスする数式を使うだけでもエラーになります。
…と言われても「一時停止要素の後には空白値がありえる項目には一切アクセスしない」というのは制約が強すぎて不便極まりないです。

ということで、本エラーを回避する方法を調べました。

エラー回避方法

結論としては単純で、以下を行えばOKです。

  • 開始要素の「オブジェクト」でレコードを取得しない。
  • 処理に使用するレコードは「レコードの取得」要素で最初に取得し、ループ内で「一時停止→レコード更新内容の割り当て→レコード更新用コレクション変数に追加」を行い、ループ後にレコード更新を行う。

エラーを回避するフローの全体像

レコード更新内容の割り当て部分

レコード更新用コレクション変数への追加部分

「レコードの更新」要素部分

この場合、ループごとに一時停止が行われますが空白値を含む項目にアクセスしてもエラーにはならず、最後まで処理が流れます。

参考になれば幸いです。