自動化
PR

Power Automateの「それぞれに適用する」の使い方|並列化で高速化・入れ子・途中で抜ける方法

sanane
記事内に商品プロモーションを含む場合があります

はじめに

Power Automate で複数件のデータを 1 件ずつ処理するときに登場するのが「それぞれに適用する」(Apply to each)です。配列を扱う動的コンテンツを選ぶと自動で挿入されるため、意図せず出てきて戸惑った人も多いはず。さらに「件数が多いと遅い」「入れ子にしたい」「途中で抜けたい」といった悩みもつきものです。

本記事では、「それぞれに適用する」の基本から、並列化による高速化(実測で 20 秒 → 3 秒)、入れ子ループ、そして「途中で抜けたい」に対する現実的な答えまでを、実際の画面つきで解説します。

こんな人にオススメ
  • 「それぞれに適用する」が勝手に出てくる理由と仕組みを知りたい
  • 件数が多くてフローが遅い。並列化で速くしたい
  • 入れ子ループや「途中で抜ける」方法を知りたい

Power Automate の基本・料金・他の実例一覧はこちら。

あわせて読みたい
Power Automateとは?できること・使い方・始め方を実例28本で解説
Power Automateとは?できること・使い方・始め方を実例28本で解説

「それぞれに適用する」は自動で挿入される

「それぞれに適用する」は、多くの場合自分で追加しなくても自動で挿入されます。単一の値を入れる欄に、配列(複数件)の動的コンテンツを指定すると、Power Automate が「これは 1 件ずつ処理する必要がある」と判断し、そのアクションを自動でループの中に入れてくれるのです。

下は「作成」アクションの入力欄に、配列の要素(氏名)を挿入する直前の状態です。

作成アクションの入力欄に配列の動的コンテンツを挿入する直前の状態

挿入を確定した瞬間、「For each」コンテナが自動生成され、「作成」がその内側に移動しました。これが「知らないうちにループが出てくる」正体です。

配列要素を挿入した瞬間、作成アクションがFor eachコンテナの内側に自動で移動した

Excel の「表内に存在する行を一覧表示」では自動挿入が起きないことがあります。これは一覧表示の出力が列名(氏名・部署など)の動的コンテンツを直接公開しないためです。その場合は「JSON の解析」を挟み、スキーマ(サンプルの JSON)を与えると列名トークンが使えるようになり、それを挿入すると自動挿入が働きます。

正式名称は「それぞれに適用する」=キャンバスでは「For each」

自分で追加したい場合は、アクション検索で「それぞれに適用する」(コントロール カテゴリ)を選びます。少しややこしいのですが、追加後のキャンバス上のノード名は英語で「For each」と表示されます(新デザイナーの表記ゆれ)。式の中で参照するときの内部名も For_each です。

アクション検索でコントロールカテゴリのそれぞれに適用するを選ぶ画面

ループの中で「今処理している 1 件」を参照するには items('For_each') を使います。Excel の行なら、列名を角カッコで指定して items('For_each')['氏名'] のように書きます(動的コンテンツから列トークンをクリックすれば自動でこの式が入ります)。

items('For_each')['氏名']
式エディタでitems('For_each')['氏名']を指定した画面

実行後は、実行履歴でループの反復を 1 件ずつ切り替えて確認できます(「1 / 15」のように現在の反復位置が表示されます)。

実行履歴でForeachの反復を1/15のように切り替えるUI

【本題】遅いループを並列化で高速化する

「それぞれに適用する」は既定で 1 件ずつ順番に処理します。そのため件数が増えるほど時間がかかります。ここでは 15 件のループ内に「遅延」(1 秒)を入れて、わざと時間がかかる状態を作りました。既定(順次)だと ループ全体で 20 秒かかっています。

順次実行のForeachが20秒かかっている実行履歴

これを速くするのが並列化です。「それぞれに適用する」の右上メニュー →「設定」→「同時実行制御」をオンにします。「並列処理の次数」は既定で 20(これが最大値)です。

設定タブの同時実行制御をオンにし、並列処理の次数が20と表示された画面

同じフローを並列(次数 20)で実行すると、20 秒だったループが 3 秒に短縮されました。約 6.7 倍の高速化です。

並列実行(次数20)にしたForeachが3秒に短縮された実行履歴

並列化は万能ではありません。「変数の値を増やす」など、共有の変数を書き換える処理を並列で行うと、結果が正しくならないことがあります(同時に書き込んで一部が失われる)。順序に依存する処理・変数を集計する処理は、順次実行のままにしてください。

入れ子ループ(ループの中のループ)

「それぞれに適用する」は入れ子にできます。外側のループの中に、もう 1 つ「それぞれに適用する」を置くだけです。下は外側(社員 15 件)の中に、内側(1, 2, 3 の 3 件)を入れた構成です。

外側のForeach(1/15)の中に内側のそれぞれに適用する(1/3)が入った入れ子ループの全体図

入れ子で気をつけるのは要素の参照方法です。内側のループ自身の要素は引数なしの item()外側のループの要素は items('For_each') で参照します。両方を組み合わせると、次のように外側×内側の値を作れます。

concat(items('For_each')['氏名'], '-', string(item()))

実行すると 佐藤 明日香-1 のように、外側の氏名と内側の番号が正しく組み合わさります。

入れ子ループで佐藤 明日香-1のように外側と内側の要素を結合した出力

引数なしの item() は「最も内側のループ」を指します。入れ子の外側を参照したいときは、必ず items('ループの内部名') のように名前を指定してください。

「途中で抜けたい」への答え:先に絞り込む

プログラミングの break のように「ループを途中で抜ける」機能は、「それぞれに適用する」にはありません。代わりに現実的なのは、ループに入れる前に対象を絞り込んでおくという発想です。これに使うのが「アレイのフィルター処理」(データ操作カテゴリ)です。

「アレイのフィルター処理」を「それぞれに適用する」の前に置き、条件(例:部署経理部 に等しい)を指定します。

アレイのフィルター処理で部署が経理部に等しいという条件を設定した画面

ループの入力を、フィルター処理の出力に差し替えて実行すると、15 件あった対象が 1 件に絞り込まれ、ループも「1 / 1」= 1 回だけの実行になりました。無駄な反復を回さずに済みます。

アレイのフィルター処理で15件が1件に絞り込まれ、Foreachが1/1になった実行結果

対象が 0 件でもエラーにならない

「フィルターの結果が 0 件だったらエラーになるのでは?」と不安になりますが、その心配は不要です。空の配列を渡しても「それぞれに適用する」はエラーにならず、0 回スキップして成功します。存在しない条件で絞り込んで 0 件にしても、フローは緑チェックで完了しました。

空配列を渡してもForeachがエラーにならず0回スキップで成功した実行結果

まとめ

「それぞれに適用する」(Apply to each)のポイントを整理します。

  • 配列を単一値欄に入れると自動でループ化される。 検索名は「それぞれに適用する」、キャンバス表示は「For each」
  • 遅いなら並列化。 設定 → 同時実行制御をオン(次数 20 で実測 20 秒 → 3 秒)。ただし変数集計には使わない
  • 入れ子は item()(内側)と items('名前')(外側)で使い分ける
  • 「途中で抜ける」は無い。 「アレイのフィルター処理」で先に絞り込む。0 件でもエラーにならない

ループでよく処理する Excel の行操作や、ループ内で使う日付の整形はこちらもどうぞ。

あわせて読みたい
Power AutomateでExcelの行を追加・取得・更新する方法|テーブル必須の理由と256行制限も解説
Power AutomateでExcelの行を追加・取得・更新する方法|テーブル必須の理由と256行制限も解説
あわせて読みたい
Power Automateの日付・時刻の扱い方|formatDateTime・convertTimeZoneでUTCズレを直す
Power Automateの日付・時刻の扱い方|formatDateTime・convertTimeZoneでUTCズレを直す
記事URLをコピーしました