Power automate desktop ループを抜ける

Power AutomateはMicrosoftが提供する業務を自動化するためのRPA(Robotic Process Automation)ツールです。
この記事では、Power Automateの繰り返し処理(ループ)の抜け方について解説します。

課題:繰り返し処理を途中で抜けられない?

Apply to each

Apply to eachアクションは、配列等の各要素に対して繰り返し処理を行います。
例えば、配列の要素を1個ずつ取り出して処理する用途に使います。
繰り返しの回数は配列等の要素数です。

Power automate desktop ループを抜ける

Power automate desktop ループを抜ける

繰り返し処理の途中で中断できない

Power automate desktop ループを抜ける

配列の要素を検索し、最初の検索条件に合致したらApply to eachの繰り返し処理を終了させるフローを作りたいときがあります。

それはどんなときですか?

Power automate desktop ループを抜ける
Power automate desktop ループを抜ける

例えば、配列の要素が新しい順に並んでいて、最新のデータを検索するときです。
配列の要素を上から順に見ていき、最初の検索条件に合致したら繰り返しを終了させたくなります。
しかし、Apply to eachアクションには繰り返しを途中で終了させる手段がありません。

なるほど。Apply to eachは、配列のすべての要素に対して繰り返し処理を実行します。
exit loopのようなアクションは無いようです。

Power automate desktop ループを抜ける
Power automate desktop ループを抜ける

Power Automateで、繰り返し処理を途中で終了させるフローはできないのでしょうか。

Do untilを使えば、繰り返し処理を途中終了させるフローを実現できますよ。

Power automate desktop ループを抜ける

解決策

Apply to eachの代わりにDo untilを使う

Power Automateには、繰り返し処理を行うもう一つのアクションとしてDo untilがあります。
Do untilアクションは、終了条件が真になるまで繰り返します。
終了条件は、Do untilの画面で設定します。
そこに検索条件を設定することにより、最初の検索条件に合致したらすぐに繰り返し処理を終了させることができます。

Power automate desktop ループを抜ける

一方、検索にヒットしないことも想定されます。この場合、Do untilの繰り返し回数の制限値に到達するまで繰り返されます。そのため、検索対象の最後の要素に到達したら繰り返しを終了させる条件を加える必要があります。

以上のことから、次の4点をDo untilループの内部に実装します。

①検索判定式(検索対象の要素が検索条件に合致したら値が真になる式)
②ループカウンタ(初期値は0、繰り返し処理1回ごとにインクリメントするカウンタ)
③最終判定式(繰り返し処理が検索対象の最後の要素に到達したら値が真になる式)
④上記①と③のいずれかでループを終了する判定式

具体例を、次章の「事例」にて説明します。

空回りさせる

Apply to eachの繰り返し処理を途中で抜けるのは諦めて、検索条件に合致した後の繰り返し処理は何も実行しないようにすることはできます。Do untilを使うよりフローはシンプルになります。
次の2点をApply to eachループの内部に実装します。

①検索判定式(検索対象の要素が検索条件に合致したら値が真になる式)
②検索判定フラグ(検索に一度ヒットしたらその後の値が真になるブール変数)

具体例を、次章の「事例」にて説明します。

事例

Apply to eachの代わりにDo untilを使う

ここでは、Do untilを使って配列の値を検索し、ヒットしたら即ループを抜けるフローの簡単な例を示します。

Power automate desktop ループを抜ける

「手動でフローをトリガーします」

フローの最初に出てくる「手動でフローをトリガーします」では、実行時に検索文字を手動で入力します。

配列(array)

検索対象の配列arrayの要素は以下のようにしました。

番号
0 'A'
1 'B'
2 'C'
3 'A'
4 'B'
5 'D'

変数(loopCount、hit、final)

変数loopCountは、Do untilループ内で繰り返し回数をカウントする整数で、初期値は0です。
変数hitは、検索にヒットしたら値を真(true)に設定するブール変数で、初期値は偽(false)です。
変数finalは、検索対象の配列arrayの最後の要素まで到達したら値を真(true)に設定するブール変数で、初期値は偽(false)です。

Do untilの中身

以下、Do untilの中身を示します。

Power automate desktop ループを抜ける

①検索判定式

検索条件に合致したことを判定する検索判定式を、ブール変数hitに設定します。
判定式はequals関数を使って次の形式で記載します。

equals(variables('配列の名称')[variables('番号')], '検索文字')

実際の式は以下の通りです。triggerBody()['text']は、「手動でフローをトリガーします」で手動で入力した文字列です。

equals(variables('array')[variables('loopCount')],triggerBody()['text'])


Power automate desktop ループを抜ける

変数hitは、配列arrayのloopCount番目の要素と検索文字が一致した場合に真(true)が設定されます。

②ループカウンタ

ループカウンタloopCountに+1を加えます。

Power automate desktop ループを抜ける

ループするたびに変数loopCountの値が1ずつ増えます。

③最終判定式

配列arrayの最後の要素まで到達したことを判定する判定式を、ブール変数finalに設定します。
判定式は以下の通りです。この式は、loopCount ≧ 配列arrayの要素数、のとき真になります。
length(variables('array'))は、配列arrayの要素数です。

greaterOrEquals(variables('loopCount'),length(variables('array')))

Power automate desktop ループを抜ける

④上記①と③のいずれかでループを終了する判定式

Do untilの繰り返し処理を終了する条件の入力欄に、以下の式を入力します。「詳細設定モードで編集」をクリックすることで、式が入力可能となります。

@or(variables('hit'), variables('final'))

「@or」は論理和を演算します。
この式により、ブール変数hitまたはブール変数finalが真のとき、Do untilループが終了します。

Power automate desktop ループを抜ける


以上により、検索にヒットしたら繰り返し処理を抜けるフローが完成します。


実行結果

上記フローを実行した結果は以下の通りです。
検索文字として'A'を入力した場合、配列arrayの0番の要素'A'がヒットします。
検索文字として'B'を入力した場合、配列arrayの1番の要素'B'がヒットします。
検索文字として'C'を入力した場合、配列arrayの2番の要素'C'がヒットします。

検索文字として'D'を入力した場合、配列arrayの5番の要素'D'がヒットします。


空回りさせる

ここでは、Apply to eachの例を示します。

Power automate desktop ループを抜ける

①検索判定式(検索対象の要素が検索条件に合致したら値が真になる式)

Apply to eachの中に、「条件」アクションを追加します。
条件として、現在のアイテム次の値に等しい入力、を設定します。
この条件は、現在の配列arrayの要素が、「手動でフローをトリガーします」で手動入力した検索文字に一致したら真になります。

もう一つの条件として、hit次の値に等しいfalse、を設定します。変数hitの初期値は偽(false)ですので、この条件式の値は最初は真(true)になっています。

Power automate desktop ループを抜ける

②検索判定フラグ(検索に一度ヒットしたらその後の値が真になるブール変数)

「条件」アクションの「はいの場合」に、ブール変数hitを真(true)に設定するアクションを追加します。

これにより、一度検索にヒットしたら、変数hitの値は以後 真(true)を保持します。
そのため、設定した2つ目の条件の値は偽(false)となります。
よって、その後の「条件」アクションは、「いいえの場合」のみが実行されます。

Power automate desktop ループを抜ける

「いいえの場合」には、何もアクションを追加せず、空にしておきます。
以上により、検索にヒットしたら、以降の繰り返し処理を空転させるフローができます。

注意点

「終了」アクションは使えない

「コントロール」コネクタに、フローを終了させる「終了」アクションがあります。
Apply to eachの内部でこの「終了」アクションを追加しようとすると、次のエラーが出て追加することができません。
エラー:「操作 'terminate' は、foreach 内部で使用できません。」
なのでApply to eachの繰り返し処理を途中で終わらせる用途で「終了」アクションを使うことはできません。

Do untilの制限

Do untilには繰り返し回数に制限があります。
デフォルトでは60に設定されています。
これ以上の繰り返し回数が想定される場合は、「制限の変更」をクリックして「回数」の設定値を増やす必要があります。
なお、「回数」の設定値は最大で5000です。

まとめ

Power Automateで、繰り返し処理を途中で終了させるフローを作成しようとする場合、Do untilアクションを使って実現できます。

参考

Exit from "Apply to Each"
How to terminate a Apply to Each loop?
Terminate Flow inside For Each Control