10
6

More than 1 year has passed since last update.

【小ネタ】「アイテムが作成または変更されたとき」トリガーでPowerAutomateフローで起こる無限ループを回避

Last updated at Posted at 2022-03-30

以下画像のようなSharePointリストでアイテムを作成または変更があったときに項目を更新するPowerAutomateのフローがあった場合、
「項目を作る」⇒「トリガーが起動してフローを実行する」⇒「項目を変更する」⇒「トリガーが起動してフローを実行する」⇒「項目を変更する」・・・
というように無限ループが発生します。
私がこれをトリガーの条件を追加することで解決した手順を紹介します。
001.jpg

フローによる更新時間列を追加

SharePointリストにフローによる更新時間列を追加します。
元から非表示にされている更新時間列を使うと、手動で更新したときの時間も登録してしまうためフローが1回も起動しません。
そのためフローで更新したときの時間を登録する列を追加します。
以下画像ではtime1列がフローによる更新時間列となっています。
002.jpg

トリガーの条件を追加

結論から言うとトリガーの条件に以下の式を追加することで無限ループが発生しなくなります。

@if(equals(triggerBody()?['time1'],null),true,less(triggerBody()?['time1'],addToTime(utcNow(), -3,'Minute')))

実際に使うときは「time1」の部分を自分が使っている列名に変更する必要があります。
列名を日本語で設定している場合はOData形式で設定する必要あり、こちらをご参照。

トリガーの条件はトリガーの設定を開いて一番下にスクロールして追加を押すことで設定できます。
003.jpg
004.jpg

追加した条件式について

ざっくりとですが追加した条件式について紹介します。
まずトリガーの条件に追加する論理比較関数の先頭には「@」が必須です。

@if(equals(triggerBody()?['time1'],null),true,

前半のこの部分はtime1列が空欄の場合はtrueを返す、つまりtime1列が空欄の場合はトリガーを起動するということを言っています。

less(triggerBody()?['time1'],addToTime(utcNow(), -3,'Minute')))

後半のこの部分はtime1列が空欄ではない場合、その値が現在時刻の3分前よりも前であればtrueを返す、
つまりtime1列(前回のフローによる更新時間)が3分前以内であればトリガーを起動しないとすることで無限ループするのを防いでいます。

3分としているのはアイテムが作成または変更されたときにフローを起動するまでのラグが1~2分あるためです。
論理式をいじることで条件を自由に設定できるので必要に応じて条件式をいじってみてください。

10
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
6