Skip to main content

ループを使用すべき状況の判断

学習の目的

この単元を完了すると、次のことができるようになります。

  • Flow Builder のループ要素の動作を理解する。
  • 変換要素、ループ要素、または手動ループを使い分けるべき場面を把握する。
Note

このバッジは、Flow Builder のスキルを習得するための過程の一部です。「Flow Builder を使用したフローの作成」トレイルでは、初めから終わりまで Flow Builder について学習します。このトレイルで推奨されるバッジの順序に従えば、プロセスの自動化に関する確固たるスキルが身に付き、Flow Builder のエキスパートになります。

このバッジは、「Multirecord Elements and Transforms in Flows (フローにおける複数レコード要素と変換)」で取り上げた重要な概念を土台にしています。まだそのバッジを完了していない場合は、先に受講してください。

ループを理解する

変換要素はデータのコレクションを処理するのに便利ですが、できることには限りがあります。コレクションをほかの要素で処理することはできず、変換要素でアクションを実行したり、判断を行ったりするようには設定できません。また、変換元データ内のオブジェクトをたどることもできません (たとえば、各レコードの所有者のマネージャーのメールアドレスを参照する場合など)。さらに、繰り返しや選択肢セットなど、変換要素と互換性のない画面コンポーネントもあります。このような場合は、ループ要素を使用して、一連の要素を順に巡回し、コレクションを 1 つずつ処理できます。

ループ要素はフロー内に循環パスを作成し、設定項目はコレクション変数 1 つだけです。ループ要素は、コレクション変数内の各値を、そのパス上の要素に順番に通します。

コレクション変数は、製菓工場で出荷前のお菓子がまとめて保管されている箱のようなものだと考えてください。お菓子は、検品、袋詰め、封かんといった工程を 1 つずつ順番に経て処理されます。その後、お菓子が入った袋は箱に入れられ、さらに箱が封をされて出荷用のケースに入れられます。

これらすべての作業は、すべてのお菓子に対して同じ順序で何度も繰り返されます。ループ要素は、お菓子を 1 個ずつ掴んでベルトコンベアの上に載せるクレーンのようなものです。ベルトコンベアに載せられたお菓子は、必要な工程をすべて順番に通過します。これは、ループのパスがアクションや割り当てなどのフロー要素を通過するのと同じです。ただし、お菓子が次々と流れていく工場のベルトコンベアとは異なり、フローのループパスは常に項目を 1 つずつ処理します。ループパスでコレクション内の最初の項目の処理が終わると、ループ要素が次の項目を取り出し、同じ処理に通します。この処理を、コレクション内のすべての項目が処理されるまで繰り返します。

実際のループの例を、順を追って見ていきましょう。Pyroclastic Inc. の組織には、商談レコードのコレクションをロックし、それらの商談の Chatter フィードに投稿するフローがあります。

以降の番号付き説明に対応するループの図。

  1. フローがループ要素に到達し、商談のコレクション変数が割り当てられています。
  2. ループは、コレクション内の最初の商談を、[Current Item from Loop (ループの現在の項目)] という特別な変数に一時的に格納します。
  3. フローは [For Each (項目ごと)] パス上の最初の要素である [Lock Opportunity (商談をロック)] を実行します。
  4. 次に、[For Each (項目ごと)] パス上の次の要素である [Opp Chatter Post (商談 Chatter 投稿)] を実行します。
  5. [For Each (項目ごと)] パス上には、これ以上実行する要素が見つからないため、フローはループ要素に戻ります。
  6. ループは、[Current Item from Loop (ループの現在の項目)] 変数の内容を、コレクション変数内の次の商談に置き換えます。
  7. フローは、コレクション変数内の最後の商談が [For Each (項目ごと)] パスを通過するまで、手順 3 ~ 6 を繰り返します。
  8. その後、フローは [After Last (最後の項目の後)] パスに進みます。

フローの実行時には、最初のレコードが 2 つのアクション要素を順に通って処理されます。それらの要素の処理が完了すると、フローはループの先頭に戻り、次のレコードを処理します。この処理を、コレクション内のすべてのレコードが処理されるまで、1 件ずつ繰り返します。

Note

ループでは、個々の値の一覧を含むコレクション変数を処理することもできますが、レコードのコレクションをループ処理する方が一般的です。

ループの動作を別のたとえで説明した動画も確認してみてください。

ループ要素を使わないループ

「なぜループ要素を使う必要があるのだろう。[Connect to Element (要素に接続)] 機能を使って、要素を手動で接続し、サークルを形成すればよいのではないか」と思うかもしれません。手動ループは、次の 2 つの理由からループ要素よりもリスクが高くなります。

  • 手動ループを終了するには、フローに決定要素が必要です。ユーザー操作や実データによって予期しない状況が発生し、フローがループを抜ける決定パスを一度も通らず、無限ループに陥る場合があります。
  • また、手動ループにはループ要素や変換要素に組み込まれている最適化がないため、処理が長くなり、CPU 時間の制限を超える可能性が高くなります。

一方で、手動ループには大きな利点が 1 つあります。コレクション変数を用意せずに反復処理できる点です。たとえば、複数選択リストのデータなど、コレクションに含まれていないデータをループ処理する必要がある場合は、手動ループが現実的な選択肢になります。とはいえ、多くの場合は、そのデータをコレクションに取り込むことで、手動ループを避けた方がよいでしょう。

一般的な指針は次のとおりです。変換要素またはループ要素のどちらでも実現できる場合は、変換要素を使用します。ループ要素は、変換要素を使用できない場合にのみ使用します。手動ループは、ループや変換が使えない場合、または手動ループを避けようとするとフローが著しく複雑になる場合にのみ使用してください。

関数

優先度

メリット

制限事項

変換要素

最優先

  • 最も高速なオプション
  • クエリ制限や CPU 制限に達する可能性が大幅に低い
  • コレクションでのみ使用できる
  • ほかの要素を含めることはできない
  • 元データ内のオブジェクトをたどることはできない
  • 繰り返しとは互換性がない
  • 選択セットを使用する画面コンポーネントとは互換性がない

ループ要素

変換が使用できない場合

  • コレクションを処理できない決定、アクション、そのほかの要素をループ処理できる
  • すべての要素および画面コンポーネントと互換性がある
  • コレクションでのみ使用できる
  • 特に大きなコレクションを扱う場合、変換よりも遅い

手動ループ

必要な場合のみ

  • コレクションを反復処理せずに要素をループできる
  • すべての要素および画面コンポーネントと互換性がある
  • CPU 制限に達する可能性が最も高い
  • 意図せず無限ループを引き起こしやすい

ネストされたループを避ける

CPU 時間制限の話題に関連して、もう 1 つ注意すべきループの使い方があります。それは、ループの中にループを配置しないことです。このような使い方は、ネストされたループと呼ばれることがあります。

別のループ要素の中に配置されたループ要素。

ある要素が、さらに別のループの中にあるループの中に含まれている場合、その要素が実行される回数は急激に増加します。たとえば、外側のループが 5 件のレコードを反復処理し、内側のループがさらに 5 回実行される場合、その要素は 25 回実行されます。そして実際には、多くのループではレコードが 5 件よりもはるかに多いコレクションを処理します。同じ例で 500 件のレコードがある場合、その要素は 2,500 回実行されます。ほとんどのループには複数の要素が含まれているため、最終的に実行される要素数はさらに増えます。

このように、フローの複雑さが増すにつれて、フローによって実行される要素数は急激に増加します。フローの実行時には、こうした要素の繰り返し処理によって多くの CPU 時間が消費され、フローの CPU 制限に達するリスクが高まります。そのため、フローがごく少数のレコードのみをループ処理することが確実な場合を除き、ループのネストは避けるのがベストプラクティスです。

Note

変換要素はループよりもはるかに最適化されているため、ループの中で変換を使用することを避ける必要はありません。

リソース

Salesforce ヘルプで Trailhead のフィードバックを共有してください。

Trailhead についての感想をお聞かせください。[Salesforce ヘルプ] サイトから新しいフィードバックフォームにいつでもアクセスできるようになりました。

詳細はこちら フィードバックの共有に進む