Power Automateの条件分岐とループ:条件・スイッチ・Apply to eachの使い方

公開 書いた人 大林 諒

Power Automate(パワーオートメイト)のクラウドフローは、上から順に1本道で動かすだけなら難しくありません。迷い始めるのは「金額で承認者を変えたい」「添付が3つあれば3回保存したい」「リストの行を担当者ごとにまとめたい」のように、分けたり繰り返したりする場面です。この記事では、値で処理を分ける「条件」と「スイッチ」、複数の項目を1件ずつ処理する「Apply to each」、終わるまで繰り返す「Do until」の使い方と、ループを減らして速くする方法を、社員15名ほどの「サンプル工務店」のSharePoint リストを例に書きます。最後に、今週期限の工事案件を担当者ごとに1通にまとめて知らせるフローを通して作ります。トリガーの選び方は「Power Automateのトリガー:よく使うトリガーの一覧と、動かないときの確かめ方」で書いているので、ここではトリガーより後ろの組み立てを扱います。

この記事の内容
  1. 先に決めること
  2. 分岐とループのアクション一覧
  3. 条件の書き方
  4. スイッチを使う場面
  5. Apply to each で1件ずつ処理する
  6. Do until で終わるまで繰り返す
  7. 回さずに済ませる:配列のフィルター処理と選択
  8. 例:今週期限の案件を担当者ごとにまとめて通知する
  9. 応用:ループの中で失敗しても止めない
  10. できないことと、その代わり
  11. よく詰まるところ
  12. 次にやること

先に決めること

分岐とループを組む前に、決めておくことが3つあります。

1. フローの中で分けるか、トリガーで止めるか

「申請中のときだけ動かしたい」のように、条件に合わないなら何もしないのであれば、フローの中の「条件」ではなく、トリガー条件で止めます。フローの中で分けると、条件に合わない実行も毎回1回分の実行として残り、実行履歴が埋まって本当の失敗が見つけにくくなります。フローの中の「条件」は、合うときと合わないときで別の処理をしたい場合に使います。

2. 1件ずつ回す必要が本当にあるか

SharePoint リストやExcelの表から行を取ってくると、結果は複数の行(配列)になります。後ろのアクションに配列を渡すと、Power Automateが自動で「Apply to each」を挟みます。便利ですが、500行あれば500回アクションが動きます。先に「配列のフィルター処理」で絞ったり、「選択」で形を変えたりして、回す回数を減らせないかを考えます。

3. 分岐の深さを3段までにする

条件の中に条件、その中にまた条件と重ねていくと、半年後に直す人が読めなくなります。制限のドキュメントでは、アクションの入れ子は8段までです。実際に運用していると、3段を超えたあたりで直す人が間違え始めます。3つ以上に分かれるなら「スイッチ」にする、深くなるなら別のフロー(子フロー)に分ける、と決めておきます。

分岐とループのアクション一覧

どれも「アクションの追加」で検索するか、「コントロール」の中から選びます。名前は2026年10月時点の日本語画面のものです。

アクションやることよく使う場面上限(2026年10月時点)
条件真か偽かで2つに分ける金額が3万円以上なら代表の承認に回す入れ子は全体で8段まで
スイッチ1つの値で3つ以上に分ける問い合わせの種類で担当チームを変えるケースは25個まで
それぞれに適用する(Apply to each)配列の項目を1件ずつ処理する添付を1つずつ保存する、行ごとに更新するMicrosoft 365のライセンスでは5,000項目
Do until条件を満たすまで繰り返す外のシステムの処理が終わるまで待つ既定60回・1時間、最大5,000回
配列のフィルター処理配列から条件に合う項目だけ残す今週期限の案件だけにする項目の形は変えられない
選択配列の各項目の形を変える必要な列だけにする、名前を付け直す項目の数は変えられない

「それぞれに適用する」は、Power Automateの解説やコミュニティで「Apply to each」と呼ばれることが多いアクションです。公式ドキュメントでも「それぞれに適用」「それぞれに適用する」の2つの表記があり、画面の版によって名前が少し違うことがあります。この記事のアクション名と欄の名前は2026年10月時点の日本語画面に合わせていますが、ほかにもSharePointの「アイテムを取得」のように、画面の版によって言い回しが違うものがあります。見つからないときは英語名(Apply to each、Get items など)でも検索します。

条件の書き方

1つの比較で分ける

経費精算リストに行が追加されたら、金額で承認者を分ける例です。

  1. 「マイ フロー」で経費精算のフローを開き、「編集」を押す
  2. トリガーの下の「+」→「アクションの追加」を押す
  3. 検索欄に「条件」と入れ、「コントロール」の「条件」を選ぶ
  4. 左の欄を選び、稲妻のアイコンから動的なコンテンツの「金額」を選ぶ
  5. 真ん中の演算子で「以上」にあたるもの(「次の値以上」など)を選ぶ
  6. 右の欄に 30000 と入れる
  7. 「True」の側に代表への承認のアクション、「False」の側に事務の確認のアクションを置く
新しいデザイナーの「条件」カード。左に金額、演算子に「次の値以上」、右に30000が入っている状態
新しいデザイナーの「条件」カード。左に金額、演算子に「次の値以上」、右に30000が入っている状態

クラシック デザイナーでは、分かれた先が「はいの場合」「いいえの場合」と表示されます。新しいデザイナーでは「True」「False」です。

演算子には「次の値に等しい」「次の値を含む」のほか、等しくない・で始まる・より大きいなどにあたるものがあります。演算子の表示名は画面の版で少し違うことがあるので、意味で選びます。文字の比較は大文字と小文字を区別するので、メールの件名やアドレスを比べるときは、両方を toLower() で小文字にそろえてから比べると取りこぼしが減ります。

AND と OR を組み合わせる

条件のカードには行を足せます。2行以上にすると、行どうしを「AND」(全部満たす)か「OR」(どれか1つ)でつなぐ切り替えが出ます。

やりたいこと組み方
金額が3万円以上、かつ科目が「交通費」以外2行を AND でつなぐ
状態が「完了」または「中止」2行を OR でつなぐ
3万円以上で、科目が「接待」または「備品」AND の中に、OR でつないだグループを入れる

3つ目のように AND と OR が混ざるときは、条件のカードの中でグループを作って入れ子にします。画面でのグループ作りは慣れないと間違えやすいので、混ざるときは式で書くほうが確実です。条件の左の欄に式を入れ、演算子を「次の値に等しい」、右の欄を true にします。

@and(greaterOrEquals(triggerOutputs()?['body/Amount'], 30000), or(equals(triggerOutputs()?['body/Category/Value'], '接待'), equals(triggerOutputs()?['body/Category/Value'], '備品')))

ドキュメントに載っている論理の関数は次のとおりです。

関数意味例
and()両方が真なら真and(greater(1,10), equals(0,0)) は偽
or()どちらかが真なら真or(greater(1,10), equals(0,0)) は真
not()真と偽を反対にするnot(contains('200 Success','Fail')) は真
equals()等しければ真equals('完了','完了') は真
greater() / greaterOrEquals()より大きい/以上greaterOrEquals(10,10) は真
less() / lessOrEquals()より小さい/以下less(10,100) は真
empty()文字・配列・オブジェクトが空なら真empty('') は真
if()真なら1つ目、偽なら2つ目を返すif(equals(1,1),'yes','no') は yes

and() と or() の引数は、どちらも真偽値でなければなりません。and(triggerOutputs()?['body/Amount'], ...) のように数値をそのまま入れると失敗します。

空の欄で落ちないようにする

SharePoint リストの任意の列は、入力されていないと値が null になります。null と数値を比べると、条件が思いどおりに分かれません。空のときの扱いを先に決め、empty() か coalesce() で埋めてから比べます。coalesce() は最初の null でない値を返す関数で、式の書き方は「Power Automateの式と変数:日付・文字列・配列をよく使う関数で扱う」に書いています。

@greaterOrEquals(coalesce(triggerOutputs()?['body/Amount'], 0), 30000)

スイッチを使う場面

1つの値で3つ以上に分けるときは、条件を重ねずに「スイッチ」を使います。サンプル工務店のホームページの問い合わせフォームには「リフォーム」「新築」「見学会」「その他」の種類があり、種類で知らせる先を変えています。

  1. 「+」→「アクションの追加」で「スイッチ」を選ぶ
  2. 「オン」の欄に、問い合わせの種類の値を入れる
  3. 「ケース」の「次の値に等しい」に リフォーム と入れ、中に営業チームへの投稿を置く
  4. 「+」でケースを足し、新築 を入れて設計への投稿を置く
  5. 同じように 見学会 のケースを足し、事務への投稿を置く
  6. 「既定」に、どれにも当てはまらないときの処理(事務への投稿)を置く
スイッチのカードで、リフォーム・新築・見学会の3つのケースと既定が横に並んでいる状態
スイッチのカードで、リフォーム・新築・見学会の3つのケースと既定が横に並んでいる状態

スイッチは「等しいかどうか」でしか分けられません。「3万円以上」「含む」のような比較はできないので、その場合は条件を使います。ケースの値は文字の完全一致なので、フォームの選択肢の文言を変えると、どのケースにも当たらず「既定」に落ちます。選択肢を変えるときは、スイッチのケースも同時に直します。「既定」を空のままにせず、担当に「種類が判定できませんでした」と知らせる処理を必ず入れておくと、選択肢の変更に気づけます。

Apply to each で1件ずつ処理する

添付を1つずつ保存する

協力会社から info@ に届いた請求書メールの添付を、SharePoint の工事案件サイトに保存する例です。添付は複数ありうるので、1つずつ処理します。

  1. トリガーを「共有メールボックスに新しいメールが届いたとき (V2)」にし、「添付ファイルのみ」と「添付ファイルを含める」を「はい」にする
  2. 「+」→「アクションの追加」で「それぞれに適用する」を選ぶ
  3. 「以前の手順から出力を選択」の欄に、動的なコンテンツの「添付ファイル」を入れる
  4. ループの中の「+」で、SharePoint の「ファイルを作成する」を足す
  5. 「フォルダー パス」に請求書のフォルダーを選ぶ
  6. 「ファイル名」に添付の「名前」、「ファイル コンテンツ」に添付の「コンテンツ」を入れる
「それぞれに適用する」の中に「ファイルを作成する」が入り、添付ファイルの名前とコンテンツが設定されている状態
「それぞれに適用する」の中に「ファイルを作成する」が入り、添付ファイルの名前とコンテンツが設定されている状態

ループの外にある「ファイルを作成する」に添付の「名前」を入れようとすると、Power Automateが自動で「それぞれに適用する」を作って中に入れます。意図せずループが2重、3重にできていることがあるので、保存する前にカードの入れ子を確かめます。

ループの中で、いま処理している項目は item()、ループの名前を指定するときは items('それぞれに適用する') で取り出せます。ループの名前を「添付ごと」のように変えた場合は、items('添付ごと') になります。

items('添付ごと')?['name']

同時実行の設定

「それぞれに適用する」は、既定では1件ずつ順番に処理します。制限のドキュメントでは、同時に処理する数(並列処理の次数)を1〜50に変えられます。

  1. 「それぞれに適用する」のカードを選ぶ
  2. 構成ウィンドウの「設定」タブを開く
  3. 「同時実行制御」をオンにする
  4. 「並列処理の次数」を決める(例: 10)
「それぞれに適用する」の設定タブで、同時実行制御がオン、並列処理の次数が10になっている状態
「それぞれに適用する」の設定タブで、同時実行制御がオン、並列処理の次数が10になっている状態

同時に処理すると速くなりますが、使ってはいけない場面があります。

同時実行してよい同時実行してはいけない
添付を別々のファイル名で保存するループの中で「変数を増やす」「配列変数に追加」を使う
行ごとに別々のメールを送る前の項目の結果を次の項目で使う
行ごとに別の行を更新する同じExcelの表に行を足していく(書き込みがぶつかる)

ループの中で変数を使っていると、同時に動いた処理が同じ変数を書き換え合い、結果が毎回変わります。変数を使うループは、同時実行制御をオフのまま(1件ずつ)にします。

上限

Microsoft 365のライセンスで動かすフローは、制限のドキュメントの「低」のパフォーマンス プロファイルにあたり、1つの「それぞれに適用する」で処理できる項目は5,000までです。それ以上ある場合は、先に絞るか、フローを分けます。もう1つ、ループの中のアクションも1回ずつPower Platformの要求数として数えられます。「低」のプロファイルでは、24時間あたりの要求数の目安が10,000です。1,000行を回して1行あたり5つのアクションを動かすと、それだけで5,000になります。

Do until で終わるまで繰り返す

「Do until」は、条件を満たすまで中のアクションを繰り返します。中のアクションを1回動かしてから条件を確かめるので、最低1回は動きます。小さな会社のフローで使う場面は多くありません。使うのは、外のシステムに処理を頼み、終わったかどうかを数分おきに見に行くような場合です。

設定既定決め方
ループの条件なし「状態が完了に等しい」のように、終わったと判断できる値
回数60回最大5,000回。想定の回数の2倍くらいにする
タイムアウト1時間(PT1H)ISO 8601の形式。PT30M で30分、P1D で1日

回数とタイムアウトの欄は、英語の画面では Count と Timeout です。日本語画面での欄の名前は版によって違うことがあります。

Do until のカードで、ループの条件と、回数・タイムアウトの設定が開いている状態
Do until のカードで、ループの条件と、回数・タイムアウトの設定が開いている状態

中に待機のアクション(英語の画面では Delay。日本語画面では「待ち時間」などの名前)を入れないと、数秒おきに相手を呼び続けます。見に行く間隔を決めて、ループの中に待機のアクションを必ず置きます。

ループの条件: @equals(body('処理の状態を確認')?['status'], 'completed')
回数: 30
タイムアウト: PT1H
中のアクション: 処理の状態を確認 → 待機(Delay) 2分

回数かタイムアウトに達してループが止まっても、既定ではエラーにならず次のアクションに進みます。「終わらなかったのに終わった扱いで先に進む」のを防ぐため、ループの後ろに条件を置き、状態がまだ完了でなければ担当に知らせる処理を入れておきます。

人の承認を待つのにDo untilは使いません。承認は「開始して承認を待機」が人の応答まで待ってくれます。作り方は「Teamsの承認アプリとPower Automateの承認フロー:申請から承認までを作る」に書いています。

回さずに済ませる:配列のフィルター処理と選択

ループを速くする一番の方法は、ループを減らすことです。

取ってくる段階で絞る

SharePoint リストの「アイテムを取得」には「フィルター クエリ」の欄があり、ODataの書き方で条件を入れると、条件に合う行だけを取ってきます。全部の行を取ってきてから「条件」で分けるより、要求数も時間もずっと少なく済みます。

Status ne '完了' and DueDate le '@{formatDateTime(addDays(utcNow(), 7), 'yyyy-MM-dd')}'

列名は表示名ではなく内部名で書きます。「上位カウント」で取ってくる最大件数も決められます。

配列のフィルター処理

すでに手元にある配列から、条件に合う項目だけを残します。ループは使いません。

  1. 「+」→「アクションの追加」で「配列のフィルター処理」を選ぶ
  2. 「差出人」の欄に、絞りたい配列(例: 「アイテムを取得」の value)を入れる
  3. 条件の左に item()?['Status']?['Value']、演算子に「次の値に等しくない」、右に 完了 を入れる

フィルター対象の文字は大文字と小文字が区別されます。項目の形(列の並び)は変わらず、数だけが減ります。

選択

配列の各項目から、必要な列だけを取り出したり、名前を付け直したりします。項目の数は変わりません。メールに表を載せるとき、SharePoint の行には使わない列が何十個も付いてくるので、「選択」で「案件名」「期限」「現場」だけにしてから「HTML テーブルの作成」に渡すと、読みやすい表になります。

マップのキー値
案件名item()?['Title']
期限formatDateTime(item()?['DueDate'], 'M/d')
現場item()?['Site']
「選択」アクションのマップに、案件名・期限・現場の3行が入っている状態
「選択」アクションのマップに、案件名・期限・現場の3行が入っている状態

「選択」のマップの右上の切り替えで、キーと値の表から1つの式を入れる形に変えられます。ここに item()?['Manager']?['Email'] を入れると、担当者のメールアドレスだけが並んだ配列ができます。この形を次の例で使います。

例:今週期限の案件を担当者ごとにまとめて通知する

サンプル工務店の工事案件リストには、案件名・現場・担当(ユーザーの列)・期限・状態の列があります。毎週月曜の朝8時に、7日以内に期限が来る未完了の案件を、担当者ごとに1通のメールにまとめて送ります。

最初に作ったフローは、入れ子のループでした。案件を全部取ってきて「それぞれに適用する」で回し、その中で担当者の一覧をまた回して一致するか比べる形です。案件80件・担当者10名で800回の比較が動き、1回の実行に十数分かかったうえ、同じ担当者に案件の数だけメールが届きました。入れ子のループは、外側の数かける内側の数だけ動きます。さらにドキュメントにあるとおり、入れ子の内側のループは同時実行にしても順番にしか動かないため、同時実行の設定でも速くなりません。

直した形は、ループを1つだけにします。

順番アクション名前やること
1繰り返し毎週月曜8時「頻度」を週、「設定曜日」を月曜日、「設定時刻(時間)」を8、「設定時刻(分)」を0、タイムゾーンを大阪、札幌、東京にする(設定曜日と設定時刻は頻度が日か週のときだけ出る)
2アイテムを取得今週期限の案件フィルター クエリで未完了かつ7日以内に絞る
3選択担当者を抜き出す式の形で担当者のメールアドレスだけの配列にする
4作成担当者の一覧重複を消す
5それぞれに適用する担当者ごと担当者の一覧を1人ずつ回す
6配列のフィルター処理(ループの中)その人の案件案件の中から、その担当者のものだけ残す
7選択(ループの中)表の形にする案件名・現場・期限だけにする
8HTML テーブルの作成(ループの中)表メールに載せる表を作る
9メールを送信する (V2)(ループの中)担当者に送る宛先にその担当者を入れて送る

2のフィルター クエリです。

Status ne '完了' and DueDate ge '@{formatDateTime(utcNow(), 'yyyy-MM-dd')}' and DueDate le '@{formatDateTime(addDays(utcNow(), 7), 'yyyy-MM-dd')}'

4の「作成」の入力には、同じ配列どうしの union() を入れます。union() は2つの配列を合わせて重複を除く関数なので、同じ配列を2つ渡すと重複のない一覧になります。

union(body('担当者を抜き出す'), body('担当者を抜き出す'))

5の「それぞれに適用する」には、4の出力を入れます。6の「配列のフィルター処理」の「差出人」に2の value を入れ、条件は式で書きます。

@equals(item()?['Manager']?['Email'], items('担当者ごと'))

item() は「配列のフィルター処理」がいま見ている案件、items('担当者ごと') はループでいま処理している担当者のメールアドレスです。

完成したフローの全体。繰り返しから、担当者ごとのループの中に配列のフィルター処理・選択・HTML テーブルの作成・メールを送信する (V2)が並んでいる状態
完成したフローの全体。繰り返しから、担当者ごとのループの中に配列のフィルター処理・選択・HTML テーブルの作成・メールを送信する (V2)が並んでいる状態

9の「メールを送信する (V2)」は、「宛先」に items('担当者ごと')、「件名」に「今週期限の案件」、「本文」に8の出力を入れます。この形で、案件80件・担当者10名でも、ループは10回、メールは10通です。実行は1分ほどで終わるようになりました。

時刻とタイムゾーンの決め方は「Power Automateのスケジュール実行:毎朝・毎週・月末に動くフローを作る」、メールに載せる表と本文の作り方は「Power AutomateでExcelを自動化:表に行を足す・転記する・集計を送る」も参考になります。

応用:ループの中で失敗しても止めない

「それぞれに適用する」の中で1件だけ失敗すると、既定ではループ全体が失敗扱いになります。10件の添付のうち1件のファイル名に使えない文字が入っていた、という程度で残りの処理の結果が見えにくくなるので、ループの中の処理を「スコープ」で囲み、失敗したときだけ担当に知らせる形にしておきます。スコープと「実行条件の構成」の使い方は「Power Automateのエラー処理と実行履歴:失敗に気づき、直して再実行する」で書いています。

できないことと、その代わり

やりたいことできるか代わりの手
5,000件を超える行を1回のフローで回すMicrosoft 365のライセンスでは上限にかかる取ってくる段階で絞る。月ごと・担当ごとにフローを分ける
ループの途中で抜ける(break)「それぞれに適用する」にはない先に「配列のフィルター処理」で対象だけにしてから回す
1つのフローで数万行の集計をする向かないExcelのピボットや、データベース・BIツールに任せる
スイッチで「以上」「含む」で分けるできない「条件」を使うか、式で区分の文字を作ってからスイッチにかける
同時実行で変数を安全に足し上げるできない同時実行をやめるか、「選択」と length() で数える
人の返事が来るまで Do until で待つ回数と時間を無駄に使う承認のアクションか、返事をトリガーにした別のフローにする

ループで何千行も回して集計するような処理は、Power Automateの得意分野ではありません。数が多くなる処理は、Excelの関数やピボット、Power Automate for desktop(Power Automate Desktop)でのExcel操作、またはデータベースを使う仕組みに任せるほうが速く、止まりません。

よく詰まるところ

症状原因直し方
知らないうちに「それぞれに適用する」が2重になっている配列の中の値を、ループの外のアクションに入れたため自動で作られた入れ子を確かめ、外側の不要なループからアクションを出して消す
条件が常に False になる数値と文字を比べている。選択肢の列で Value を付け忘れている実行履歴で値と型を見る。選択肢の列は ?['Value'] まで書く
空の行で条件が失敗する任意の列が nullcoalesce() か empty() で空のときの値を決めてから比べる
件名の判定で取りこぼす大文字と小文字の違いtoLower() で両方をそろえて比べる
スイッチがいつも「既定」に落ちる選択肢の文言を変えた、前後に空白があるケースの値を今の選択肢に合わせる。trim() で空白を消す
ループの結果が毎回違う同時実行と変数を一緒に使っている同時実行制御をオフにするか、変数を使わない形にする
入れ子のループで十数分かかる外側かける内側の回数だけ動いている。内側は順番にしか動かないループを1つにして、中で「配列のフィルター処理」を使う
同じ人に何通もメールが届く案件ごとに送っている担当者の一覧を union() で作り、担当者ごとに回す
Do until が終わらないのに先に進む回数かタイムアウトに達して止まったループの後ろで状態を確かめる条件を置く
ループの中の失敗で全体が失敗になる1件の失敗がループ全体の結果になるスコープで囲み、失敗時だけ知らせる
実行履歴でそれぞれに適用するを開き、何件目で失敗したかを左右の矢印で送って確かめている状態
実行履歴でそれぞれに適用するを開き、何件目で失敗したかを左右の矢印で送って確かめている状態

次にやること

条件とループの中で使う式(日付の計算、文字の取り出し、配列の扱い)は「Power Automateの式と変数:日付・文字列・配列をよく使う関数で扱う」で一覧にしています。ループの中で失敗したときの気づき方と直し方は「Power Automateのエラー処理と実行履歴:失敗に気づき、直して再実行する」へ進んでください。きっかけの設定を見直すなら「Power Automateのトリガー:よく使うトリガーの一覧と、動かないときの確かめ方」、Excelの表を回して転記や集計をするなら「Power AutomateでExcelを自動化:表に行を足す・転記する・集計を送る」が次の記事です。

あわせて読む