スケジュールトリガーフローとは
スケジュールトリガーフローはフローの一種でノーコードで定期的な自動化処理を出来るものです。
簡易なバッチ処理であればApexで書くよりも楽に処理できる可能性があります。
ただし後述しますがデバッグログで表示できる情報が少なく制約もありますのでそこに留意する必要があります。
例1.取引先のバッチ処理
たとえば請求先住所を納入先住所をコピーするバッチ処理は以下のようになるかと思います
オブジェクトおよび検索条件は以下の通りです。
今回は簡易的に都道府県(請求先)に値があり都道府県(納入先)に値がないとしました。
更に条件分岐として検索条件で取得できたオブジェクトの都道府県(請求先)が
東京都かそれ以外かで処理を分岐しています。
分岐先で東京都更新、東京都以外更新で分かれていますが、説明項目以外は同様の処理をしており請求先の値を納入先へコピーしています。
レコードのバッチに対して実行されるフローのスケジュールトリガ
https://help.salesforce.com/s/articleView?id=sf.flow_concepts_trigger_schedule.htm&type=5
スケジュール済みフローを作成するときに、レコードの項目値にアクセスするには $Record グローバル変数を参照します。
デバッグ時の考慮点
完成したタイミングでデバッグをすることができますが、いくつか考慮すべきところがあります。
1.2以上の条件に合致する場合でも、サンプルとして一つしか処理しない
2.こちら側で任意のレコードを選択することが出来ず、システム側で条件に合致したレコードを自動的に選択する。
したがってデバッグで詳細を確認したい場合、今回のように条件で結果が異なる時は
初めに合致したレコードIdをデバッグから取得し別条件を別途設定し直す必要が出てきます。
3.この時点で何件スケジュールトリガーフローに処理されるかわからない
検索条件に合致するレコードはヘルプに記載がある通り、25万件か200×ユーザ数の多いほうまでは処理が可能ですがデバッグ上には何件条件に合致して処理されるのか情報が出てきません。
これは実際にスケジュールトリガーフローを動かしてみるまでよくわかりません。
スケジュールトリガフローに関する考慮事項
https://help.salesforce.com/s/articleView?id=sf.flow_considerations_trigger_schedule.htm&type=5
・24 時間あたりのスケジュールトリガフローインタビューの最大数は、250,000 または組織のユーザライセンス数の 200 倍の大きい方です
・自動化プロセスユーザがスケジュールトリガフローを実行します。
また実際に動かして、開発者コンソールからログから詳細を取得するには以下の準備が必要です。
デバッグログのユーザ追跡フラグを新規作成し追跡対象エンティティ種別を自動化プロセスに設定し、デバッグレベルでワークフローをより詳細に設定した上で有効期限内にスケジュールトリガーフローを動かす必要があります。
上記のデバッグログを仕込み、開発者コンソールを開いたうえで、Show my Corrent Logにチェックを外せば以下のように確認が出来るはずです
図にある通り、1万件を超えるレコードでも問題なく実行できていることが確認できます。
ただし、このデバッグログでは具体的な処理が残らないので、処理を確認する必要があるときはフロー上のデバッグで確認する必要が出てきます。
例2.$Recordなしで同じ処理をした場合は
基本的にはレコードトリガーフローはオブジェクトと検索条件をはじめに設定した上で
$Record(検索条件に該当するレコード)を使用して値の更新をするほうが1万件を超えるような多数のレコードを処理できます。
しかし$Record以外のレコードをスケジュールトリガーフローで処理したいときもあるかもしれません。
スケジュールトリガーフロー上で$Record以外も処理は可能ですし細かく作りこむこともできますが、どこまで処理ができるのでしょうか。
ここでは例1で処理した同じ内容を$Recordを使わず処理をしようとした場合はどのような結果になるか試してみます。
例1を$Recordを使わずに処理しようとする場合は以下のような形になります。
処理は一緒ですので説明は割愛させていただきます。
これをフロー上のデバッグを押してみると10分以上かかった挙句に以下のように処理が失敗してしまいます。
エラーメッセージは「Apex CPU time limit exceeded」でこれはSalesforce固有の制限によるエラー(ガバナ制限)です。
エラー直前のログをみると1768件目のレコードの処理中に制限に引っかかったようです。
このように$Record以外を使用してスケジュールトリガーフローを使用する場合は十分処理件数に気を付けたうえでフローを作成する必要があります。