Power Automate での SharePoint アイテム更新について

目次
こんにちは、MS開発部の 荒井 です。
皆さんは SharePoint デザイナーで作成できるワークフローで
「SharePointアイテムが更新されたときにワークフローを動かし、そのアイテムのプロパティを設定する」
という処理をやったことはないでしょうか?
以前それを Power Automate でやろうとし、以下のようなフローを作成したところこのフローが
無限に実行されてしまう現象に陥りました。

無限ループ
今回はこれの対策を考えていこうと思います。
原因
Power Automate のフローでは、以下のように設定するとフローが無限に実行されてしまいます。
- トリガーに「SharePointのアイテムまたはファイルが修正されたとき」「SharePointのアイテムが作成または変更されたとき」を選択
- 同フロー内で「項目の更新」アクションなどを用いて、そのSharePointアイテムを更新する
フロー内でSharePointアイテムの更新を行うと、それをトリガーとして同じフローが実行されて
その中でSharePointアイテムが更新され…
というようにフローが無限に実行されてしまいます。
SharePoint デザイナーのワークフローではこういったことは起こらなかったのですが
元々 、Power Automate は SharePoint だけのためのものではないですし仕方ないといったところでしょうか…。
対策
対策については、「これならバッチリ!」というのがなかったのでいくつか考えてみました。

SharePointの集計列
まず、「標準機能であるSharePointの集計列で再現できないか?」というものです。
式は複雑になってしまいますが、条件分岐もできますし他のアプリも使わず SharePoint 内で完結できるため、これが使用できるのであれば一番いいのではないかと思います。
ただ ID や参照列は集計列で使えないなどの制約もあるため難しいところです。
② Power Apps を使う

プロパティの設定
ただそういった処理を設定しようとすると設定が複雑になるため、場合によっては難易度がかなり高くなってしまうかもしれませんね…。
③ Power Automate のトリガーで、更新日時が直近かどうか判定する
SharePointリストにPower Automateによる更新処理のタイムスタンプを保存する列を作成します。

列名:任意 列タイプ:日付と時刻
Power Automateで任意の更新処理するように作成した列にutcNow()関数を記入し、現在時刻が入るよう設定。
Power Automate は使用するのですが、フローを起動する場合の条件を追加します。
Power Automate のトリガーにはオプションで「トリガーの条件」が用意されており、ここに設定した条件をクリアしないと起動しないようになっています。

トリガーの条件
例えば、条件を「更新日時が現在時刻の3分前」というようにすることで、2回目のフローはここの条件に引っ掛かり起動されないということですね。
例:@or(empty(triggerBody()?[‘Update’]),less(triggerBody()?[‘Update’], addMinutes(utcNow(),-3)))
ただ上記の条件の場合、3分以内にユーザーがもう一度SharePointアイテムを更新しても起動しなくなってしまうので、「一度更新したらちょっと待ってね」というような運用上の制約が出てくるでしょうか。
④ Power Automate を専用のアカウントで作成し、更新者がそのアカウントがどうか判定する
③と同じようにフローを起動する場合の条件を追加するパターンです。
Power Automate でSharePointアイテムを更新すると更新者がフローの所有者になることを利用し
専用のアカウントを用意し、対象のPower Automateを作成する際にそのユーザーでサインインして作成。

右端のマーク→設定

トリガーの条件の追加から条件式を記入
ただこちらはライセンスやアカウント管理の問題が発生してしまいます。
以上、Power Automate で SharePoint アイテムを更新しようとして無限ループが発生しないようにするための対策でした。
ただ先に記載したように「この方法であれば完璧!」といった対応がなさそうなので、Power Automate の仕様が変わってくれれば嬉しいですね。
他にも下記にて随時Power Automateに関する記事を更新しております。
Power Automate関連ブログ
ぜひご確認ください。
以上、最後までご愛読いただき
ありがとうございました。
お問い合わせは、
以下のフォームへご連絡ください。