Power Automateのトリガーに発動条件を加える

## こんな人むけの記事です
SharePointのドキュメントライブラリに特定のファイルがアップロードされたときだけ処理を実行したい。そんなとき、どうしますか？

私の場合、以前はこんな方法を取っていました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285141/bcf31bfd-90c5-497f-bcd7-2e7f57cdff9d.png)

特定のフォルダ内の特定ファイル（この例では Shared Documents/csv/test.csv）が更新されたら、そのCSVファイルをUTF-8（BOMなし）からUTF-8（BOMあり）に変換し、ファイル名の先頭に処理日付を追加するという処理です。

この処理の作り方は、以下の記事で紹介しています：
🔗 前回の記事はこちら

https://qiita.com/DaddyDaddy/items/e95483afcbae5544cf1e

## この処理には無駄がある
実はこの方法、無駄な処理が発生していました。

というのも、SharePointサイトのドキュメントライブラリで目的のファイル以外が更新された場合でもクラウドフローが起動し、その中で「条件」アクションを使って対象ファイルかどうかを判定していたからです。

「そもそも、目的のファイル以外ではトリガーが動作しない方がいいよね？」
…という、もっともな指摘をTwitterでいただき、ようやく気づきました。

少し遠回りしましたが、今回はそのスマートな方法を紹介します。

## トリガー条件はどこにある？
トリガーの右上にある「三点リーダー（…）」をクリックし、「設定」を選びます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285141/e42f0466-a2a3-4bbb-be2c-212e67e257df.png)

設定画面の一番下にある「トリガーの条件」セクションで「＋追加」をクリックすると、条件入力欄が表示されます。少し分かりづらい場所にあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285141/044e310c-d53e-4a34-9c6e-15aac307f992.png)

この欄に記述した条件が true になると、後続の処理が実行される仕組みです。
ただし、入力補助がないため、式を手動で書く必要があります。

そのため、まずはテキストエディタで式を作成するのがおすすめです。

## 条件式を書く
前回の記事で作成したフローでは、トリガーの戻り値は以下のような形式でした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285141/ac05345a-3330-4944-bd71-e18c905cabfa.png)

この中の FullPath（39行目）が Shared Documents/csv/test.csv と一致するかどうかが、トリガー条件になります。

まず、「条件」アクションの左辺にある「完全パス」を選択して Ctrl + C でコピーします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285141/5db2b4ed-a9b0-4cf2-96ef-195da013ff8d.png)

テキストエディタに貼り付けると、以下のようになります：
```​
@triggerOutputs()?['body/{FullPath}']
```
２つの値が一致していればtrueを返すことができるのは、equals関数です。第１引数と第２引数がまったく同じならtrueを返します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285141/77281c67-2888-4fcb-abdf-98394ea3d21f.png)

そこで関数のテストをします。テストには「作成」を使うと便利です。

入力を「式」モードにして、先程取得したトリガーの値を表す式から先頭の＠マークを取り除いたものをequals関数の第１引数とし、シングルくウォーテーションで囲ったファイルのフルパスを第２引数にして記述すると以下のようになります。

```
equals(triggerOutputs()?['body/{FullPath}'],'Shared Documents/csv/test.csv')
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285141/2a6722b8-5cd8-4d2a-97c8-d1c7896095c8.png)

この状態で、試しに「テスト」>「手動」で式に誤りがないかを確認します。テスト待機状態になったら、SharePointドキュメントライブラリの指定フォルダに、csvファイルを上書きコピーでアップロードします。

その結果、equals関数の２つの要素が一致しているので、trueが戻り値として返されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285141/c3d60d47-b43e-4f85-8d3f-b0a79a1b6d58.png)

式に問題ないことがわかったので、「作成２」の中身にできた紫色の部分を選択して ctrl+Cでコピーします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285141/d7a5981a-c467-441a-a21a-263098d6e061.png)

トリガーの条件の中に、先程作成した「作成２」の中身のコピーを貼り付けます。繰り返しになりますが、これを手書きするのは大変ですので、先程やったように第１引数、第２引数になるものを、いちど「作成」などに「動的なコンテンツ」として選択したあと、ctrl + Cでコピーしてやる方法が便利です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285141/99696d68-309a-47db-bea8-fd4989711a26.png)

## テストする
トリガーの条件を設定できたので、「テスト」>「手動」で待機状態にしたあと、あえて別のファイルをSharePointドキュメントライブラリにアップロードしてみます。

アップロードしてから数分待ってみましたが、テストは反応しません。
次に、equals関数の第２引数に指定したファイルをアップロード（上書き）してみます。

んん・・・？　動かない・・・。

## 動かないときの対処法

どうやら、「作成２」で作った式そのままでは動作しないようで、少し修正します。ポイントは波括弧を外すことです。＠マークの直後と、式の一番最後にある　｛　｝を外してから「完了」をクリックし、再度テストします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285141/b7e5215e-52d0-4162-a059-56d1e44e92dc.png)

今度は成功しました。別ファイルをアップロードしても動作しません。これで一安心です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285141/47581364-aa5b-4e11-91ef-0f6be3806438.png)

## 「条件」アクションが不要に！

トリガーだけで条件判定ができるようになったので、クラウドフローの中に作成していた「条件」は不要になりました。処理に必要な部分だけを残して以下のように修正しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285141/1289f82f-868f-4a1c-9c5b-914a4ae8a609.png)


## まとめ
遠回りしましたが、トリガー条件を使うことで無駄な処理を省き、よりスマートなフローが実現できました！

トリガー条件をつかうアドバイスをいただいて感謝です。