はじめに
初めまして。株式会社KYOSO BS事業部 BSグループの竹内です。
今回は、Salesforceのフローを用いた開発で、ループを使用した際に起きがちなエラー「Number of Iterations Exceeded」について回避方法を紹介いたします。
今回紹介する方法以外もあるかもしれませんが、1つの例としてご参考になれば幸いです。
Number of Iterations Exceededについて
フローでは、実行される要素は2000個に制限されており、
ループ要素を使用した場合、この制限に達することがあります。
すると、以下のようなエラーメッセージが出力されます。
“Number of Iterations Exceeded“
Salesforceヘルプページ:https://help.salesforce.com/s/articleView?id=000314438&type=1
Number of Iterations Exceededが発生する例
まず、以下のようなフローを見ていきます。

図1:取引先が変更された後に、取引先に関連するすべての取引先責任者を更新するフロー
このフローでは取引先が変更された後に、取引先に関連するすべての取引先責任者を更新します。
ループの外側に2つの要素と、3つのループ要素があります。
更新される取引先責任者が n 件のとき、実行される要素数は 2 + ( 3×n ) 個となるので、666件の取引先責任者を更新すると2000個(2+1998)の要素が実行され、制限に達します。
つまり、更新する取引先責任者が667件以上の場合、実行する要素が2000個を超えるため、エラー「Number of Iterations Exceeded」が発生するということです。
回避方法
今回は「プラットフォームイベントトリガフロー」を用いて制限を回避していきます。
フローで実行する要素が2000個を超える前に、プラットフォームイベントを作成してフローを終了することで、数珠つなぎのように実行します。

図2:プラットフォームイベントトリガフローのイメージ
プラットフォームイベントの作成
まず、プラットフォームイベントを作成します。
[設定]>[インテグレーション]>[プラットフォームイベント]から[新規プラットフォームイベント]を押下します。
表示ラベル等を入力し、[保存]を押下します。

図3:プラットフォームイベントの作成
次に、「フローを開始するきっかけとなるレコードID」を格納するカスタム項目を作成します。
今回は、取引先のIDが対象です。
[カスタム項目 & リレーション]から[新規]を押下します。

図4:カスタム項目の作成(1/2)
表示ラベル等を入力し、[保存]を押下します。

図5:カスタム項目の作成(2/2)
これで、プラットフォームイベントが作成できました。
プラットフォームイベントトリガフローの作成
次は、プラットフォームイベントによって起動するフローを作成していきます。
フローの完成イメージは次のようになります。

図6:フローの全体イメージ
フロー作成時に、[プラットフォームイベントトリガフロー]を選択します。

図7:フロー種別の選択
プラットフォームイベントは、先程作成したプラットフォームイベントを設定します。

図8:プラットフォームイベントの選択
まずは、必要な変数や定数を作成していきます。
作成するのは以下の4つです。
No. | タイプ | 名称 | 説明 |
① | 変数 | LoopCounter | 現在のループ回数をカウントする変数 |
② | 定数 | LoopLimit | フローを停止して別のフローを呼び出すまでの最大ループ回数 |
③ | 数式 | LoopLimitReached | 最大ループ回数に達したかどうかを判定する数式 |
⑤ | コレクション変数 | ContactList | 更新する取引先責任者を格納するコレクション変数 |
①LoopCounter

図9:LoopCounterの作成
②LoopLimit
ループ内の要素の数に依存します。今回の場合は300回です。

図10:LoopLimitの作成
③LoopLimitReached
制限に達した時にTRUEを返します。

図11:LoopLimitReachedの作成
④ContactList

図12:ContactListの作成
これで必要な変数や定数が作成できました。
次に、フローを開始するきっかけとなるレコードを取得します。このフローはプラットフォームイベントトリガなので、以下のようにプラットフォームイベントの取引先IDを使用し、取引先レコードを取得する必要があります。

図13:プラットフォームイベントに保存されている取引先IDから取引先レコードの取得
次に、更新された取引先に関連する取引先責任者のレコードを取得します。
このフローは取引先責任者の一部を更新し、別のプラットフォーム イベントを使用して再度呼び出すため、まだ更新されていない取引先責任者レコードのみ取得できるよう、条件を設定します。

図14:まだ更新されていない取引先責任者の取得
取得した取引先責任者でループを開始し、ループ内で取引先責任者の項目を設定します。

図15:取引先責任者の項目を設定
更新する取引先責任者を格納するコレクション変数ContactListに格納します。

図16:ContactListへの追加
ループ回数を数えるために、LoopCounterに1を追加します。

図17:LoopCounterの更新
あらかじめ作成した数式LoopLimitReachedを使用し、ループ回数が最大回数に達したかどうかを確認します。

図18:ループ回数の確認
最大ループ回数に達した場合は、コレクション変数ContactListを使って取引先責任者を更新します。そして、残りの取引先責任者レコードを処理するには、新しいフローのトリガとなるよう、別のプラットフォームイベントのレコードを作成します。

図19:取引先責任者の更新

図20:別のインスタンスを起動するプラットフォーム イベントを作成
以上でフローの作成は完了です。
一見、複雑そうに見えますが、プラットフォームイベントにより、数珠つなぎのようにフローが実行されていくことがポイントです。
おわりに
ご紹介したプラットフォームイベントトリガフローを使えば、フローで実行される要素が2000個に達する前に、別のフローに数珠つなぎのように繋げていくことで制限を回避できます。
エラー「Number of Iterations Exceeded」の解決にお悩みの方や、ループ回数が大量になるフローを設計しようとしている方に、本記事の方法がご参考になれば幸いです。
今回の場合は、最大ループ回数は300回に設定していましたが、ループ内の要素数に依存することに注意してください。
本記事ではフローのエラーに関する内容をご紹介いたしましたが、これからもSalesforceの開発に関する内容を投稿していきますので、よろしくお願いいたします。
参考
Salesforceヘルプ-Flow Error ‘Number of Iterations Exceeded’
Bypassing the “Number of Iterations Exceeded” Error in Salesforce Flows with Platform Events
投稿者プロフィール

-
主にSalesforceを使用した開発を担当しており、Salesforce歴は3年程です。
フローを使ったローコードでの実装や、Apexを使用したバックエンドの構築を担当しております。最近では、Lightning Web Componentや、第2世代管理パッケージの開発にも携わっております。
保有資格:Salesforce認定platformデベロッパー
最新の投稿
Salesforce2024.05.22【Salesforce】Apexとフローで異なる!オブジェクトのデータ並び替え(ソート)実装方法を徹底解説
Salesforce2023.11.22【Salesforce】Apexで実装しよう!Basic認証を使用したコールアウトの紹介【サンプルコード付き】
Salesforce2023.05.23【Salesforce】セキュリティトークンを使用して、DataSpider Cloudのグローバルリソースに接続設定を作成する
Salesforce2022.12.13【Salesforce】フローでループを使う際の厄介なエラー「Number of Iterations Exceeded」をプラットフォームイベントトリガフローで回避する