Salesforceの項目を変更したのは誰?

Salesforceの自動処理において、意図しない項目更新が発生したときの原因特定のヒントを紹介します

はじめに

みなさん、はじめまして。

Salesforceで自動処理を実装する場合、Apexトリガやプロセスビルダー等を利用されているかと思いますが
「あれ?この操作でその項目は変わらないはずなんだけど・・・」
「いつのまにか項目の値が更新されている!?」
といった場面に遭遇した経験はありませんか?

特に、トリガとプロセスビルダーの両方を利用して親子関係にあるオブジェクトの項目をお互いに更新している場合に、意図せず連鎖的に自動処理が実行されることとなり原因特定に一苦労することがあります。

今回は、そのような困った場面でチェックすべきポイントや実装方法のヒントをまとめてみました。
少しでもみなさんにとってトラブルシューティングのお役に立てれば幸いです。

使用場所の確認

まずはオブジェクトマネージャから該当項目の使用場所を確認することからはじめましょう。基本ですね。

[任意のカスタムオブジェクト]→
項目とリレーション→
[任意のカスタム項目]→
使用場所 ボタン

この画面からその項目を更新、参照するApexClassやFlowが確認できます。
ただし、ここに表示される項目はSalesforce内のものに限られます。
ETLツール等の外部のサービスは表示されないことを頭の片隅に置いておきましょう。

承認プロセス

承認プロセスの承認時や却下時のアクションに項目自動更新を設定することで、特定の項目を更新することができます。

ここでのポイントは、同じアクションの中に複数の項目自動更新を定義することもできますが、その場合は順序性が保証されないということです。しっかりおさえておきましょう。

参考ページ
https://help.salesforce.com/s/articleView?id=sf.workflow_field_update_considerations.htm&type=5

項目自動更新

上記の承認プロセスのアクションで設定できる項目自動更新の編集画面に「項目変更後にワークフロールールを再評価する」というチェックボックスがあります。
この項目更新によってフローやトリガを起動させたくない場合は、チェックをオフにしましょう。

また、承認プロセスのアクション内に複数の項目自動更新を設定した場合は、さきほど記載したとおり順序性は保証されていません。
そのため、この「項目変更後にワークフロールールを再評価する」をONにするのは、なるべく同じアクション内ではひとつにおさえたほうがよいでしょう。

プロセスビルダー

プロセスビルダーの条件の設定画面上に
「レコードに指定の変更が行われた場合にのみアクションを実行しますか?」という設定項目があります。
ツールチップにカーソルを合わせると
「[はい]を選択すると、レコードが現時点では基準を満たすが、保存する直前はレコードの値が基準を満たしていなかった場合にのみアクションが実行されます。つまり、指定外の変更が行われた場合はアクションが実行されません。」
と表示されます。

意味を理解するのに2、3回読み直してしまいましたが(汗)、
[はい]にチェックした場合、条件が「項目X=B」だとすると以下のようになるということですね。
・項目XがAからBに変更されたことによってこのプロセスビルダーが起動したときは、ルールは適用される
・項目YがCからDに変更されたことによってこのプロセスビルダーが起動したときは、たとえ項目XがBだったとしてもこのルールは適用されない

まとめ

最後にSalesforceの項目更新時の処理順序をおさえましょう。
https://developer.salesforce.com/docs/atlas.ja-jp.apexcode.meta/apexcode/apex_triggers_order_of_execution.htm

さて、項目を更新した犯人は特定できたでしょうか。

個人的な見解になりますが、問題発生時の原因特定という側面から見れば、ある程度複雑な処理はトリガまたはApexコールに集約したほうがよいかと思います。更新項目がそのオブジェクト内に特定されている場合、プロセスビルダーは非常に有用だと思います。

最後まで読んでいただきありがとうございました。