ADVERTISEMENT

【Power Automate】Do untilループでつまずく時の入力値と条件分岐の直し方

【Power Automate】Do untilループでつまずく時の入力値と条件分岐の直し方
🛡️ 超解決

Power AutomateのDo untilループは、特定の条件が成立するまで処理を繰り返す便利なアクションです。しかし、入力値や条件式のわずかなミスが原因で、ループが想定外の回数実行されたり、無限ループに陥ったりすることがあります。この記事では、Do untilループでつまずいたときに確認すべき入力値と条件分岐の直し方を、具体的な事例を交えて解説します。原因を切り分けて、適切な修正を行うための手順を身につけてください。

【要点】この記事で確認すること

  • 最初に見る場所: Do untilループの「入力値」と「条件式」のプロパティ。特にループ内で更新する変数が正しく設定されているか。
  • 切り分けの軸: ループが終了しない(無限ループ)のか、ループが1回も実行されないのか、または意図した回数より多いのか少ないのか。
  • 注意点: 会社のポリシーでループの最大反復回数や実行時間に制限がある場合があります。勝手に制限を緩めず、管理者に確認してください。

ADVERTISEMENT

Do untilループの基本構造とつまずきやすいポイント

Do untilループは、指定した条件が真になるまでアクションを繰り返します。基本的な構成は「Apply to each」や「Scope」の中で使われることが多く、ループ内で変数を更新して条件を変化させます。つまずきやすいポイントは、入力値の型の不一致、条件式の論理ミス、ループ内での変数更新忘れの3つです。

Do untilループの構文

Power AutomateのDo untilループは、次のような構文で設定します。

  • 条件: ループを抜ける条件(例: @equals(variables('counter'), 5))
  • タイムアウト: ループの最大実行時間(既定は1時間、最大7日)
  • ループ内アクション: 条件を変化させる処理(変数のインクリメント、データの取得など)

よくあるつまずきパターン

実際に発生する問題には、以下のようなものがあります。

  • 無限ループ: 条件が永遠に真にならない。例えば、変数を更新するのを忘れた、条件式が間違っている。
  • ループが一度も実行されない: 最初の条件評価で真になってしまう。初期値がすでに条件を満たしている。
  • ループ回数が予想より少ない/多い: 条件の比較演算子を間違えている(< と <= の混同など)。

入力値の確認ポイント

Do untilループが正しく動作するためには、ループ内で使用する変数やトリガーからの入力値が適切である必要があります。以下の3点を重点的に確認してください。

変数の型と値の一致

条件式で比較する値の型は一致している必要があります。例えば、数値の変数と文字列の「5」を比較すると、結果が期待通りにならないことがあります。Power Automateでは暗黙的な型変換が行われる場合もありますが、明示的に型を合わせるほうが安全です。変数を初期化する際に、integer型やstring型を正しく指定してください。

初期値とループ内での更新

ループを制御する変数は、ループの外で初期化し、ループ内で更新する必要があります。以下の手順で設定を確認してください。

  1. フローの先頭で「変数を初期化する」アクションを追加し、適切な初期値を設定します(例: 0)。
  2. Do untilループ内の最後のアクションとして「変数の増加」または「変数の設定」で値を変更します(例: +1)。
  3. ループの条件式で、その変数が目的の値になったかをチェックします(例: @equals(variables('counter'), 10))。
  4. ループのタイムアウト設定を確認します。既定の1時間で十分か、または変更が必要か検討します。
  5. テスト実行して、ループが適切な回数で終了するか確認します。必要に応じて「実行履歴」で変数の変化を追跡します。

初期値をループ内で変更しないと、条件が永遠に真にならず無限ループになります。また、ループ内で変数を更新する位置も重要です。例えば、条件チェックの前に更新しないと、1回多くループが回ることがあります。

条件分岐の設定ミスと修正方法

条件式の書き方次第で、ループの動作は大きく変わります。ここでは具体的な条件式の例と、間違いやすいパターンを比較表にまとめました。

目的 正しい条件式 誤った条件式(例)
カウンターが5になったら終了 @equals(variables('counter'), 5) @greaterOrEquals(variables('counter'), 5)(5以上で終了するが、初期値が0だと5回実行される)
リストの全要素を処理したら終了 @equals(variables('index'), length(variables('myList'))) @greater(variables('index'), length(variables('myList')))(インデックスが範囲外になる可能性)
特定のファイルが存在するまで待機 @equals(outputs('Get_file_metadata')?['statusCode'], 200) @not(equals(outputs('Get_file_metadata')?['statusCode'], 404))(条件が複雑で誤解しやすい)

複数条件の扱い

複数の条件を組み合わせる場合は、andor演算子を使用します。Power Automateの式言語では、@and(...)または@or(...)で記述します。例えば、「カウンターが10以上かつフラグがtrue」という条件は@and(greaterOrEquals(variables('counter'), 10), equals(variables('flag'), true))となります。括弧の位置を間違えると意図しない動作になるため、注意してください。

デバッグとテストの手順

問題を特定するには、以下の手順でデバッグを行います。

  1. フローを保存し、一回だけテスト実行します。「テスト」ウィンドウで「手動でトリガーします」を選び、実行します。
  2. 実行履歴を開き、Do untilループのアクションをクリックして「入力」と「出力」の内容を確認します。条件式と変数の値をチェックします。
  3. ループ内で変数の値を出力するアクション(例: 「変数の設定」の直後に「応答」アクションなど)を一時的に追加して、各反復の値を確認します。
  4. タイムアウト設定を小さく(例: 1分)設定して、無限ループが発生した場合に早期に停止できるようにします。
  5. 問題が解決したら、デバッグ用のアクションを削除し、タイムアウトをもとに戻します。

失敗パターンと対処例

具体的な失敗事例を紹介します。

パターン1: カウンターを更新しない無限ループ

初期値0の変数「counter」をループ内で増加させずに、条件@equals(variables('counter'), 5)を設定した場合、counterはずっと0のままなのでループが終了しません。この場合、ループ内に「変数の増加」アクションを追加することで解決します。

パターン2: ループが1回も実行されない

例えば、初期値がすでに条件を満たしていると、ループ内のアクションは一度も実行されません。対処法としては、ループの前に条件を満たさないように初期値を設定するか、Do untilではなく「Until」ループ(条件が満たされるまで実行)として設計することを検討します。

パターン3: Webサービスの応答待ちでタイムアウト

外部APIの応答を待つループで、タイムアウトを長く設定しすぎると、レスポンスが遅い場合にフロー全体が長時間ブロックされます。適切なタイムアウト(30秒など)を設定し、応答がない場合はエラー処理に進むように条件を組み合わせるとよいでしょう。

管理者に確認すべき設定

会社の環境では、Power Automateの管理ポリシーにより、ループの最大反復回数や実行時間に制限がかかっている場合があります。以下の点を管理者に確認してください。

  • ポリシーによる制限: テナントレベルで設定された「フロー実行あたりの最大アクション数」や「ループの最大反復回数」
  • コネクタの制限: 使用しているコネクタ(SharePoint、Outlookなど)に個別のAPI制限がないか
  • ライセンス: 使用しているPower Automateのライセンス(無料版、Office 365付属、有償版)により、実行頻度やトランザクション数に制限がある場合があります。

これらの制限に抵触すると、ループが途中で強制終了したり、エラーが発生したりします。必要に応じて制限値の変更申請を行ってください。

よくある質問(FAQ)

Q1: Do untilループ内で「Apply to each」を入れ子にするとどうなりますか?

入れ子にすることは可能ですが、ループの反復回数が多くなるとフローの実行時間が長くなり、タイムアウトや制限に抵触するリスクが高まります。なるべくループ内の処理はシンプルにし、大量データの場合はバッチ処理を検討してください。

Q2: ループの条件に「現在の時刻」を使うことはできますか?

はい、可能です。ただし、utcNow()関数はフロー実行開始時の時刻を返すため、ループ内で呼び出しても同じ値になります。動的に現在時刻を取得するには「タイムゾーン」を考慮した式を組む必要があります。通常は変数に時刻を保持して比較することをおすすめします。

Q3: ループが途中で止まってしまいました。どうすればいいですか?

実行履歴でエラー内容を確認してください。よくある原因は、条件式のエラー、アクションの失敗、またはポリシー制限です。特に「Action limit exceeded」というエラーはループが制限に達したことを示します。条件を見直すか、管理者に問い合わせてください。

まとめ

Do untilループでつまずく原因は、入力値の型や初期値、ループ内での更新忘れ、条件式の論理ミスに集約されます。まずはループのプロパティで入力値と条件式を確認し、期待通りの動作になるよう修正してください。デバッグ時はタイムアウトを短く設定し、変数の値を追跡することで効率的に問題を特定できます。それでも解決しない場合は、管理者にポリシーや制限の有無を確認しましょう。


ADVERTISEMENT

この記事の監修者
✍️

超解決 第一編集部

疑問解決ポータル「超解決」の編集チーム。正確な検証と、現場視点での伝わりやすい解説を心がけています。

ADVERTISEMENT