トリガーをアクションとして使ってみた

# 概要

偶然、トリガーであるはずの項目を、アクションとして追加できることに気が付きました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/6dc39a3f-87df-709e-3a36-2eec664854fe.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/118a47c4-1c45-af2e-482e-5483e9f48ddc.png)

有識者に伺ったところ、以前からできていたとのことでしたが、僕自身は今の今まで全く気付いていませんでした。
**「トリガーなんだからアクションに使えるはずない！」** という思い込みですね…

ということで、今回はこれを使って面白いフローが使えないか考えてみた、という内容です！

:::note warn
注意
**推奨される使い方ではありません。**
「こんなこともできるのか」という参考程度（面白半分）でとらえてください。
:::


# ちゃんと使えるの？
まずはとりあえず動作確認です。

トリガーの種類にはいくつか種類あるようですので、それぞれ確認してみましょう。
正式な分類ではありませんが、今回は以下の分類で動作を確認しました。
- インスタントフロー（プッシュトリガー）
- 自動化フロー（ポーリングトリガー）
- 自動化フロー（Webhook≒プッシュトリガー）

:::note info
参考にさせていただいた記事
[たなの覚え書き｜Power Automateのトリガー種別と注意事項について
](https://tana-techlog.net/?p=201)
:::


## インスタントフロー（プッシュトリガー）
ボタンを押したとき、など任意のタイミングで実行するトリガーです。
ここでは、フローの作成画面から「インスタント クラウド フロー」として選択できるトリガーを指します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/08da9972-2894-7718-a72b-36424df35d38.png)


試しにこんなフローを作成してみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/b73fd74f-160a-9924-6e67-657628173626.png)


検証用のフローを実行してみると、エラーとなりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/58454d82-da7e-456c-2e9e-9636e4305cd9.png)

:::note alert
エラーの詳細
*Invalid version: hybridtriggers*

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/4c065c09-18eb-8571-ba26-f3ba0528a995.png)
:::

他にも、エラーは起こらないものの応答の出力に何も情報がなく、実質使えないトリガーがあったり...
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/1b5599e2-b5c9-2516-7790-953a05e90752.png)

そもそもアクションとして追加できないトリガーがあったりしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/b6919dfb-9dd9-93a4-0fe3-8c0b28d02dd8.png)

全てを確認したわけではありませんが、**インスタントトリガーはアクションとして使用することはできない**ようです。

## 自動化フロー（ポーリングトリガー）
ここでは、「自動化したクラウド フロー」のうち、ポーリングトリガーのものを指します。
ポーリングトリガーは一定間隔で定期的に応答を確認するトリガーです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/25aa9cd5-94b8-ccbe-5417-f9cbf095fc87.png)


試しにこんなフローを作成してみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/5710720f-8e19-2dd2-4c1c-cf0201dd0568.png)

このトリガーは、普通にトリガーとして追加し、コードのプレビューで確認すると、5分間隔で実行されることがわかります。ポーリングトリガーである証拠ですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/9e783592-8990-c601-d234-86b825c08895.png)

確認用のフローを実行してみると、すぐに(アクションとして追加した)トリガーは実行されず、しばらく応答を待機していることがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/29ff8fcb-cf52-8132-f507-525f81cfd18a.png)

この状態で、トリガーされる条件、リストへのアイテム追加を行いました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/b362f3e0-3f0e-719c-3905-b418213967d1.png)

更新間隔の5分以上待ってみましたが、どうやら通知を受け取ることはできないようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/fb769f3a-73d0-1adf-55cb-f864712bd6db.png)

…と思っていたら、5分を大きく超えた6時間後に実行されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/bdb3bf0f-7b04-cb33-1380-e35027209d91.png)

「フロー保存後の初回は時間がかかるのかも？」と思い何度か実行してみましたが、同じ結果でした。

ということで、**ポーリングトリガーもアクションで応答を待ち構えることは実質的にできない**ようです。


## 自動化フロー（Webhook≒プッシュトリガー）
ここでは、「自動化したクラウド フロー」のうち、ポーリングトリガーでないのものを指します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/25aa9cd5-94b8-ccbe-5417-f9cbf095fc87.png)


Webhookトリガーはアプリ側から通知が送信されることで、ポーリングトリガーとは違って即時的に実行されるトリガーです。

トリガーの機能としてはインスタントトリガーと同じ分類ですが、アプリからの更新を受け取る自動化したクラウドフローということで、ユーザーからするとわかりづらい分類になっているかもしれません。


試しにこんなフローを作成してみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/a1e4ad57-2b25-63b9-58b9-522029d5c744.png)

このトリガーは、普通にトリガーとして追加し、コードのプレビューで確認しても、更新間隔の設定がありませんので、ポーリングトリガーとは異なることがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/1aabc761-e2e9-6092-3bd8-ff6b16d4dac4.png)

実行すると、待機状態となりました。少なくともエラーにはなってないですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/dfe3a2d7-6945-b7f5-56ae-e6da6dba6a40.png)

トリガーとなるフォームの送信をしてみると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/c5a0fc1f-3213-3948-965e-3a45b656f269.png)

即座に応答を受信しました。こちらは動作として支障がなさそうです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/c3c0fd6f-078d-e236-6310-a60f5117c12e.png)

ということで、トリガーをアクションとして使用できるのは自動化フロー（Webhook≒プッシュトリガー）のものだけということになりました。


# 利用例
これを利用するフローを考えてみました。
特定のユーザーにFormsの回答を依頼するメッセージを送付し、そのユーザーからの回答を受け取るまで１日置きにフォローメッセージを送付するフローです。

長いのでフローの全体像を折りたたんでおきます。
<details><summary>サンプルフロー</summary>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/96f2681a-c885-dcdd-1918-1a4aad48e4f2.png)

</details>


ついでにZIPファイルも置いておきます。
[github｜アンケート回答の督促_20231203142658.zip](https://github.com/ksgiksg/Power-Automate/blob/main/アンケート回答の督促_20231203142658.zip)

# 使用する際の注意点
一般的な使い方を逸脱したフローですので、いくつか注意点があります。

## トリガー独自の設定はできない
トリガーには条件を指定して、無駄なフローの発火を抑えられる設定があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/df749b40-a1ab-cf7b-80b2-f6e4f4e2e20b.png)

同じトリガーでも、アクションとして追加した場合は、このような**トリガー独自の設定が使用できません**。（普通のアクションと同じ設定のみ）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/eca1a4de-658e-e88a-f95b-7c36f105ba17.png)


## 分割されない
同じく、トリガーとしての設定に「分割」というものがあり、クラシックデザイナーの場合はこのオプションが既定でオンになっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/18243a41-c3ce-cedf-031e-db46d3c6f704.png)

アクションとして実行する場合は、この設定が使用できないため、**Apply to eachなどの配列処理**が必要になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/48bb02ee-63ae-80a0-448e-1bed38bc1de4.png)


## 狙った応答をトリガーできない
普通、応答を待機する系のアクションは、送った要求に対する決まった応答を受け取るため、他のユーザーからの応答を間違って取得するようなことはありません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/cf45e86f-02cb-f02a-311c-0f85dae50721.png)

しかし、トリガーをアクションとして使う場合、どの応答があってもトリガーが発火してしまうため、特定の応答を受け取るといったことができません。

また、トリガーの条件を設定することもできないので、事前に条件を指定して発火を絞り込むということもできません。

そのため、トリガーされた後に、**目的の応答かどうかを確認する条件分岐**などの処理が必要になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/e3ad0619-e30f-89d8-030e-798c978d9705.png)

さらに、狙った応答でなくともアクションとしては終了してしまいます。

そのため、狙った応答を受け取りたい場合は、**目的の応答を受け取るまで何度もトリガーさせる、Do Loop などの繰り返し処理**が必要になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/76bfd3c6-11d3-253c-d175-8e3f50e64992.png)

## 要求数の消費
- 目的の応答を取り出すまで行う**Do Loop**
- 応答が配列のため必要になる**Apply to each**
- 応答の詳細を確認する**条件分岐**

1人のユーザーからの応答を受け取るためにこれだけの入れ後構造が必要になります。
これだけ繰り返されるということは、もちろんその分APIの実行回数もかさんでしまいます。

https://learn.microsoft.com/ja-jp/power-platform/admin/api-request-limits-allocations

１人のユーザーからの応答を受け取るだけでもこれだけに無駄が多いということは、複数のユーザーからの応答を受け取るためには…。
(況や～をや)

# まとめ
ということで、トリガーをアクションとしてして使う方法でした。

単純に応答を待機する系のアクションが増えたと考えると、フローの幅が広がったように感じましたが、今回言及した制約やデメリットを考えると、基本的には**推奨できない使い方である**と総括します。

変わった使い方は面白いですが、本来の用途を外れるとそれだけ良くない面が多くなりますね。


**用法容量を守った、よいローコードライフを！**