ブログ

【Salesforce】フローでループを使う際の厄介なエラー「Number of Iterations Exceeded」をプラットフォームイベントトリガフローで回避する

この記事をSNSでシェア!

はじめに

初めまして。株式会社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デベロッパー
この記事をSNSでシェア!