コルネの進捗や備忘録が記されたなにか

進捗や成果物や備忘録てきななにかを雑に更新していきます。

Power Automate でワクチン後体調報告システムを作成してみた


スポンサードリンク

はじめに

Power Automate を使ってTwitter にワクチン接種後の体調を報告するシステムを作成してみたので、そのフローの仕組みを纏めたいと思います。

実際にツイートされたものはこんな感じ。

フローの概要

フローの全体図

フローの全体図はこんな感じ。

f:id:koruneko:20210919210234p:plain

トリガー

トリガーにはスケジュールの「繰り返し」を用いています。

f:id:koruneko:20210919210538p:plain

このフローは

  • 2h 毎に実行
  • (日本時間で)2021/09/17 16:00:00 以降に実行
  • 9時以降のみ実行(夜間は実行しない)

となっています。

「2h 毎に実行」は「間隔」と「頻度」の設定ですね。

「(日本時間で)2021/09/17 16:00:00 以降に実行」は「タイムゾーン」と「開始時刻」の設定です。
ここで「開始時刻」を設定するときに一つ注意が必要です。

例ではタイムフォーマットの末尾に Z がついていますが、

f:id:koruneko:20210919211421p:plain

JST(日本時間)を扱う場合はこの Z をつけてはいけません。

2021-09-17T16:00:00

末尾に Z をつけてしまうとUTC(世界協定時間)として扱われてしまいます。
なので日本時間を利用するときは Z をつけないようにしましょう。

最後に「9時以降のみ実行(夜間は実行しない)」という設定ですが、これはフローの設定の「トリガー条件」で設定しています。

右上の3点リーダより、「設定」を選択すると、

f:id:koruneko:20210919212319p:plain

以下のような画面が表示されます。

f:id:koruneko:20210919212421p:plain

ここのトリガー条件に '@' + [式]を設定すると、その式が true になったときのみ、そのトリガーが実行される。という設定になります。

@greaterOrEquals(int(formatDateTime(addHours(utcNow(), 9), 'HH')), 9)

例えば上の式だと int(formatDateTime(addHours(utcNow(), 9), 'HH')) で日本時間で現在の時間を取得して greaterOrEquals でその時間が9より大きいかを判断しています。

この式の記載に自信がない場合はテスト用のフローなどで、変数などを用意してその式の結果がどうなるのか動作確認したうえで設定するといいでしょう。

アクション

後続のアクションでは2種類のアクションを並列に実行するようにしています。

1つは、体調のツイートするアクションで、

f:id:koruneko:20210919214541p:plain

もう1つは、体調報告をさぼったときなどにタイムアウトツイートをするアクションです。

f:id:koruneko:20210919214558p:plain

体調をツイートする

現在の体調を報告するための質問をTeams でAdaptive Cards を送信して確認しています。

Adaptive Cards は以下のようになっています。

メッセージ

{
    "type": "AdaptiveCard",
    "$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
    "version": "1.2",
    "body": [
        {
            "type": "TextBlock",
            "text": "現在の体温は?",
            "wrap": true
        },
        {
            "type": "Input.Text",
            "placeholder": "36.2",
            "id": "temperature"
        },
        {
            "type": "TextBlock",
            "wrap": true,
            "text": "現在の体調は?"
        },
        {
            "type": "Input.Text",
            "placeholder": "元気",
            "id": "physical"
        },
        {
            "type": "TextBlock",
            "wrap": true,
            "text": "腕の痛みは?"
        },
        {
            "type": "Input.Text",
            "id": "pain",
            "placeholder": "痛い"
        },
        {
            "type": "TextBlock",
            "wrap": true,
            "text": "その他"
        },
        {
            "type": "Input.Text",
            "placeholder": "なにかあれば",
            "id": "other"
        }
    ],
    "actions": [
        {
            "type": "Action.Submit",
            "title": "Tweet",
            "style": "positive",
            "data": {
                "res": "tweet"
            }
        }
    ]
}

実際に送られてくるメッセージはこんな感じ。

f:id:koruneko:20210919222709p:plain

このAdaptive Cards は以下のサイトで作成することができます。

adaptivecards.io

このAdaptive Cards での入力内容は id に記載の値で取得できるので、次のツイートを行うアクションでは、それを参照することでツイートに入力内容を埋め込みます。

ツイート テキスト

・体温
@{if(empty(outputs('アダプティブ_カードを投稿して応答を待機する')?['body/data/temperature']), '測るのめんどくさかったです', concat(outputs('アダプティブ_カードを投稿して応答を待機する')?['body/data/temperature'], ''))}
・体調
@{outputs('アダプティブ_カードを投稿して応答を待機する')?['body/data/physical']}
・腕の痛み
@{outputs('アダプティブ_カードを投稿して応答を待機する')?['body/data/pain']}
@{if(empty(outputs('アダプティブ_カードを投稿して応答を待機する')?['body/data/other']), '', Concat(uriComponentToString('%0A'), uriComponentToString('%0A'), outputs('アダプティブ_カードを投稿して応答を待機する')?['body/data/other'], uriComponentToString('%0A'), uriComponentToString('%0A')))}
ワクチン後体調報告Bot
#PowerAutomate

このツイートを行ったあとは、このフローは終了としたいので最後に「終了」アクションを設定しています。

タイムアウト

タイムアウトには並列アクションの最初に待ち時間を設定して、指定時間待機するようにします。

f:id:koruneko:20210919222543p:plain

今回は30分で設定しました。

その後、タイムアウトツイートを行ってフローを終了アクションで終了しています。

おわりに

以上でPower Automate でワクチン後体調報告システムの完成です。
お手軽にできますね。

この仕組み利用して、PJメンバーに進捗確認用システムとか、新人向けに困っていることないか確認するシステムの作成とか作れないかな?
ただ技術ありきで業務システムなどをつくると大抵ろくなことにならないので、要注意です。


スポンサードリンク