LoginSignup
5
3

More than 1 year has passed since last update.

10秒以内に返事をしないと拗ねてしまう妹を量産する Power Automate フロー

Posted at

はじめに

今回はDo untilアクションを使っていろいろ遊んでみます。
[アダプティブ カードを投稿して応答を待機する]のアクションで、応答がなかったことを条件にループを終了させます。
後半ではApply to eachでコンカレンシー制御をONにして、処理を並列に進める際のループの抜け方を説明します。

1人の妹に愛されるフロー

フローの概要

このフローでは、妹から送られてくるメッセージに10秒以内で返事をし続ける限り、メッセージが送り続けられるというものです。
逆に言うと、10秒で返事ができなかったときにループを終了させるものです。

フローの全体像はこのようになっています。
make.powerautomate.com_environments_c282a6c7-dd13-e3fe-99b5-0460a4ecac01_flows_1598f7f4-b2b4-41a4-a6a5-5dbbda5053cc(PowerAutomate).png

フローの解説

カードの情報

このスコープではアダプティブカードの情報をまとめて指定しています。
image.png

変数定義的なアクションはスコープにまとめて一か所で管理しておくと、メンテナンスや変更が楽になるのでオススメです。
image.png

ループの脱出フラグ

無限ループを抜けるかどうかの判定に使う変数です。
このflg=trueになったときにループを終了させます。
image.png

Do untilアクションは、条件を満たした場合にループを終了させますが、初めから条件を満たしている場合も1度だけ処理を実行します。
Power Automate の画面上は条件を上の部分に書きますが、フローチャートでいうと以下のように条件式が下に来るような感じですね。
image.png

flg変数の変更は条件アクションを使ってもいいのですが、今回は前のアクションがタイムアウトしたかどうかで判定します。
image.png

一見して何も条件判定を行っていないように見えますが、[実行条件の構成]から、[変数の設定]アクションが実行されるのが、前のアクション[アダプティブ カードを投稿しました]がタイムアウトした時だけになるように設定しています。
image.png
image.png

待機アクションのタイムアウト

ユーザーの応答を待機する系のアクションは、応答がないとずっと待ち続けてしまうことになるので、10秒以内に返事がなかったときに妹が拗ねるように変更します。

正確にはずっと待ち続けるわけではなく、既定では30日でタイムアウトします。

30日待たせるのもかわいそうなので、アクションの設定からタイムアウトの期間を10秒(PT10S)に設定します。
image.png
期間はISO 8601形式で記述します。

少しだけ我慢する

返事があったのにすぐにまた聞き返すようでは、せっかちだと思われて嫌われてしまいます。
淑女たるもの我慢も必要ということで、5秒待つアクションを追加します。
image.png

このアクションも実行条件の構成に注意が必要です。
[変数の設定]がスキップされた場合=[アダプティブ カードを投稿しました]で返事があった場合に、ちゃんと待てるように設定します。
image.png

返事がなかった場合に拗ねる

これでフローは完成です。
返事がなくてループを終了してしまった後に、捨て台詞を言い残してフローを終わりにします。
image.png

たくさんの妹に愛されるフロー

フローの概要

1人では愛され度が足りないので、妹を量産します。
1人のときの妹の定義はフロー内で行っていましたが、管理ができるようにSharePointリストで情報をまとめます。

列の定義は、1人のときの[カードの情報]スコープと同じです。
[1行テキスト]列を使用していますが、URLが長い場合は[複数行テキスト]にしてもOKです。
image.png

基本的な構造は1人のときと同じで、そのアクションがApply to eachの中に入っています。
make.powerautomate.com_environments_c282a6c7-dd13-e3fe-99b5-0460a4ecac01_flows_248654bf-7024-46d8-a886-f0dd71d9bc2b(PowerAutomate).png

ただし、脱出条件に使っている変数をそのまま使うと、1人に返事ができなかったときに全ての妹に愛想をつかされてしまいます。
なので、複数の処理を並列して動かす場合にはループを終了させる条件を考えないといけません。
image.png

フローの解説

複数の妹の並列起動

SharePointリストの[複数の項目を取得]で定義した妹群をApply to eachで使用します。
そのままだと順次処理、1人ずつ妹を起動することになるので、並列処理ができるように設定を変更します。

Apply to eachの設定からコンカレンシー制御をオンにしておきます。
image.png
image.png

ループの脱出フラグ

今回は変数を使いません。
変数を使おうと思った場合は、妹がいくつ生成されるかわからないため、動的に妹の数に合わせた変数を用意する必要があるからです。

[選択]アクションで配列変数を生成したり、JSON DictionaryとsetPropaty関数を使ったりする方法もありますが、難しくなるので今回は使用しません。
image.png

ループの終了条件

代わりに使うのがこちらの条件式です。

Do until
empty(body('アダプティブ_カードを投稿して応答を待機する'))

image.png

これは[アダプティブ カードを投稿して応答を待機する]アクションがかどうかを判定する式になっています。

返事ができた場合は下のように、bodyにいろいろな情報が帰ってきているのがわかります。
image.png

逆に返事ができなかった場合=タイムアウトした場合は、出力として返されるものがないので、empty(body('アダプティブ_カードを投稿して応答を待機する'))trueを返します。
image.png

よって、条件部分は以下のように設定すればOKです。
image.png

なんとなく条件式をループの上側に記載する関係で、1つ前のループの結果を取得して判定しているように見えますが、フローチャートで図示した通り、実際に条件判定を行うのは処理の後の下の部分です。
image.png

おわりに

午前中には間に合いませんでしたが、エイプリルフールということでネタっぽいフローの解説をしてみました。
Apply to eachDo untilは、繰り返し処理としてワークフローの基本要素ですので、細かい設定や仕様を把握しておくと、できることの幅が広がると思います。

今回は以上です。

5
3
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
5
3