はじめに
Power Automate で以下のトリガーを利用する際、フロー内で更新を行うことで、再度トリガーが発動し、結果的に無限ループしてしまうリスクがあるため、その点を考慮する作りにする必要があります。
また、例えば、以下のようにお問い合わせの管理を SharePoint リストで行っている際、ステータスを"回答済み"に変更したタイミングで 1 回だけ通知したいような場合、こちらのトリガーのみでは要件を満たせません。
具体的には、こちらのトリガーは、スタータスの列以外含め、アイテムの変更が行われるとトリガーが発動するため、例えば、ステータスを "回答済み" に変更した後 (する前にも動作します)、アイテムが変更されるたびに通知が行われることになります。
このように、意図しないタイミングにトリガーが発動して無限ループしたり、無駄に通知を送ったりしてしまうことを防ぐため、トリガー条件という機能があります。端的に言うと、トリガーが発動する条件をもうちょっと細かくすることが出来る機能です。
上記の例でいうと、既に通知済みかどうかを判定する "はい/いいえ"の列を別途作成し、通知をしたら "はい" に変更し、ステータスが "回答済み" かつ "回答通知済み" が "いいえ" の場合のみトリガーが発動するようにする感じです。
こちらのトリガー条件の書き方について、以下を見て分かる通り、個人的に結構癖があるというか、市民開発者の方にとってかなり難しいと思うのと、列の種類によって書き方が少なからず異なるため、情報を整理したいと思います。
文字列が特定の文字の場合
以下の文字列型の列が特定の文字の場合のみトリガーが発動するようにしたいと思います。
まず、トリガー条件について、式を書くのが難しいので、[アレイのフィルター処理]
を使います。
以下のように [基本モード] でフィルターをして、その後、[詳細設定モード] にして式をコピーします。
※残念ながら、新しいデザイナーの場合、この方法でそのままコピーする方法だと上手く行きませんでした。修正すれば行けますが、市民開発者の方にとっては、この難しい構文を理解して修正をするより (場合によっては心折れてしまうかもしれないと思います)、そのままコピーできた方が楽なので従来のデザイナーの方を使います
その上で、トリガー条件にコピーします。
@equals(triggerOutputs()?['body/Title'], 'テスト')
アレイのフィルター処理を削除してテストしてみます。以下のように二つアイテムを追加してみます。
片方しか動作していないため、問題なさそうです。
文字列が空の場合
次に、以下の Text 列が空の場合動作するような条件にしてみます。文字列が空かどうか判定する際は、empty
関数を使います。
empty() のカッコの間にカーソルを合わせて、対象の列を選びます。
empty 関数は対象のデータが空だったら true が返されるため、右側には true と書き、[詳細モード] にしてコピーします。
@equals(empty(triggerOutputs()?['body/Text']), true)
こちらをトリガー条件に追加します。
こんな感じでデータを追加してみます。
Text 列が空のデータの方だけ動作しました。
選択肢列の場合
選択肢列が特定の値の時だけトリガーが発動するようにしたいと思います。こちらも同様の手順で作成できますが、点注意が必要なのは、"選択肢列 Value" を選ぶことです。
@equals(triggerOutputs()?['body/Choice/Value'], '選択肢 1')
こんな感じでデータを追加してみます。
"選択肢 2" を選んだ側は動作しませんでした。
数値列が特定の数値の場合
数値列が特定の数値の場合にトリガーが発動するようにします。同様の手順で作成してみます。
@equals(triggerOutputs()?['body/Number'], 1)
こんな感じでデータを追加してみます。
数値が 1 の時だけ動作しました。
数値列の値が空の時
数値列の値が空かどうかを判定する場合は、文字列の時に使った empty を使います。
@equals(empty(triggerOutputs()?['body/Number']), true)
以下のようなデータを登録し、トリガーが発動しました。
ただ、別件では、こちらでは上手く動作しないことがありました。
その際は、以下のような式で動作しました。
@equals(triggerOutputs()?['body/Number'], null)
はい/いいえ列が false のとき
はい/いいえ列が false のときだけトリガーが発動するようにします。こちらも同じような感じで式を作成します。
@equals(triggerOutputs()?['body/YesNo'], false)
問題なく false のときだけ動作しました。
true のときトリガーが発動するようにしたい場合は、以下のように変更します。
フィルタークエリの時は以下のようなことがあったので、もし true で上手く動作しない場合は、false ではないときという表記に変えてもいいかもですね。
まとめ
今回は、列の種類ごとの Power Automate のトリガー条件の書き方について整理してみました。市民開発者の方にとって、トリガー条件ちょっととっつきにくいものの、ニーズは鷹飼と思うので、参考になれば幸いです。