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

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

【Power Automate × Microsoft Teams】ワードウルフを作成してみる ~その2~


スポンサードリンク

はじめに

この記事は【Power Automate × Microsoft Teams】ワードウルフを作成してみる ~その1~の続きです。
まだご覧になれれていない方は上記記事をご覧になることをお勧めします。

PowerAutomate の作成

カウントダウンメッセージ

残りX分などのカウントダウンメッセージをチームに送信する処理を作成します。

f:id:koruneko:20200803023528p:plain

カウントダウンを行うために、処理を指定時間停止させます。
これを実現するために。「スケジュール」の「遅延」を利用します。

f:id:koruneko:20200803024211p:plain

f:id:koruneko:20200803024257p:plain

作成できたら、以下のように入力します。

  • カウント:待ち時間の入力項目です。今回は「4」と入力します。
  • 単位:「カウント」で入力した数値の単位を指定します。今回は「分」を選択します。

これにより4分間、「待ち時間」で処理が停止します。

この処理の後にチームに残り時間を知らせるメッセージを送ればカウントダウンが作成できますね。

f:id:koruneko:20200803024622p:plain

同じ要領で、1分待機した後にゲーム終了メッセージを送信する処理も作成してみましょう。

投票処理

ゲーム終了後に、「誰がワードウルフだと思ったか?」を参加者全員のチームに送信する処理を作成します。

f:id:koruneko:20200803024748p:plain

参加者全員に同時にメッセージを送信する

メッセージはアダプティブカードを送信し、アダプティブカードより投票を行いますので、ユーザーの応答を待つ必要があります。
このとき気を付けなくてはいけない点として、複数人に同時に投票メッセージが送信されるように設定しないといけません。
なにも設定を行わないと、最初にメッセージを送ったユーザーが解答(もしくはタイムアップ)するまで次のユーザーへのメッセージの送信が行われません。

上記設定を行うために、「アダプティブカードを Teams ユーザーに投稿して応答を待機」を「Apply to each」内に作成し、「Apply to each」の「設定」より「コンカレンシー制御」を「オン」にします。

f:id:koruneko:20200803025703p:plain

f:id:koruneko:20200803025554p:plain

f:id:koruneko:20200803030153p:plain

その後、並列処理を行ってほしい度合い(今回でいうと想定する参加者の最大数)だけ、次数を設定し、「完了」を選択します。

なおこちらを設定する際の注意点として、処理の順番にこだわらない場合のみ設定してください。

投票確認メッセージの送信

先ほども記載した通り、投票メッセージの送信には、アダプティブカード(待機)を利用します。

投票確認メッセージは以下のようなアダプティブカードを作成します。

f:id:koruneko:20200806004328p:plain

このとき、選択肢のユーザーは参加者によって可変としたいと思います。
これを実現するために、コンボボックスの選択肢に設定する値は、前回「参加者情報の作成」で作成した、「choice」変数を利用したいと思います。

まずは、アダプティブカードのコンボボックス、"Input.ChoiceSet" の利用方法をみてみましょう。

{
    "type": "Input.ChoiceSet",
    "choices": [
        {
            "title": "Choice 1",
            "value": "Choice 1"
        },
        {
            "title": "Choice 2",
            "value": "Choice 2"
        }
    ],
    "placeholder": "Placeholder text"
}

"choices" の中身がコンボボックスで表示される値になります。
前回作成した、「choice」変数の中身と一緒ですね!

では、これらの情報をもとに、アダプティブカードの作成を行います。
なお作成の際、「試験的な機能」を「オン」にされている方は一度「オフ」にしてください。

f:id:koruneko:20200806005811p:plain

理由は、card JSON の解説の際に行いたいと思います。

アダプティブカードには以下を設定します。

受信者

@{items('投票処理')?['mention']};

メッセージ

{
    "$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
    "type": "AdaptiveCard",
    "version": "1.2",
    "body": [
        {
            "type": "TextBlock",
            "text": "~投票タイム~",
            "weight": "Bolder",
            "size": "Medium"
        },
        {
            "type": "TextBlock",
            "isSubtle": true,
            "wrap": true,
            "text": "「ウルフ」だと思われるユーザーを選択してください。"
        },
        {
            "type": "TextBlock",
            "text": "名前",
            "wrap": true
        },
        {
            "type": "Input.ChoiceSet",
                "choices": [
                @{take(variables('choise'), sub(length(variables('choise')), 1))}
            ],
           "placeholder": "Placeholder text",
            "id": "choiseResult"
        }
    ],
    "actions": [
        {
            "type": "Action.Submit",
            "title": "送信",
            "id": "submit"
        }
    ]
}

更新メッセージ

投票が完了しました。

カードの更新が必要

はい

メッセージに設定している、card JSON ですが、

@{take(variables('choise'), sub(length(variables('choise')), 1))}

こちらがコンボボックスの選択肢を設定している箇所になります。
なぜ、このような式にしているかというと、最後の「,」を取り除くためですね。
記事書いてて気づきましたが、「作成」アクション利用したほうがよかったかもですね。。。

また、こちらの箇所が「試験的な機能」をオフにしてもらった原因の箇所となります。
オンにしたまま、上記JSON を記載すると、JSON の解析でエラーが発生してしまうかと思います。
これは、Power Automate 上のAdaptive Cards Designer が、渡された配列を文字列としか認識してくれず、”title”、"value"が設定されていないと、よみとられてしまっているからのようです。

なお、こちらを設定、保存後に「試験的な機能」をオンにしてフローを実行しても正しく動作を行うことができます。
ただし、編集を行いたい際は都度「試験的な機能」をオフにする必要があるようです。
ちょっとめんどくさいですね。。。

投票結果の取得

投票メッセージで回答された投票結果を「result」変数に設定したいと思います。

「作成」を作成して、以下のように設定します。

{
  "dispName": @{items('投票処理')?['dispName']},
  "vote": @{body('投票確認メッセージの送信')?['data']?['choiseResult']}
}

「@{body('投票確認メッセージの送信')?['data']?['choiseResult']}」でユーザーが選択した"ChoiceSet"の値を取得することができます。
"choiseResult"には「"id": "choiseResult"」で設定した値を設定してください。
また、こちらの式は、探しても見つからないかもしれません。
そのときはこちらの式を手入力すると、次回更新時Power Automate が式として認識し表示も変わるかと思います。

こちらの「作成」での出力結果を変数「result」に設定しましょう。

投票結果の送信

f:id:koruneko:20200806015928p:plain

先ほど作成した、変数「result」を「JSON の解析」で分解を行います。
スキーマは以下のようになるかと思います。

スキーマ

{
    "type": "array",
    "items": {
        "type": "object",
        "properties": {
            "dispName": {
                "type": "string"
            },
            "vote": {
                "type": "string"
            }
        }
    }
}

こちらをもとに投票結果のメッセージを作成します。
変数「voltMessage」に以下を設定します。

@{items('投票結果メッセージの作成')?['dispName']}さん:@{items('投票結果メッセージの作成')?['vote']}<br>

最後に任意のチャネルにメッセージを送信します。
任意のチャネルを選択し、メッセージは例えば以下のように設定します。

メッセージ

@{variables('mention')}
投票結果はこちらです。<br>
@{variables('voltMessage')}

みなさんに送ったワードはこちらです。<br>
@{variables('resultMessage')}

ゲーム続行の確認

最後にゲームを同じメンバーで続けるか?を参加者に確認するメッセージを作成しましょう。

アダプティブカードを Teams チャネルに投稿して応答を待機」を選択します。

作成が完了したら、「アダプティブカードの編集」を選択します。

下記ようなアダプティブカードを作成します。

f:id:koruneko:20200806021042p:plain

{
    "$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
    "type": "AdaptiveCard",
    "version": "1.2",
    "body": [
        {
            "type": "TextBlock",
            "text": "同じメンバーでゲームを続けますか?",
            "weight": "Bolder",
            "size": "Medium"
        },
        {
            "type": "ColumnSet",
            "columns": [
                {
                    "width": "stretch",
                    "type": "Column",
                    "items": [
                        {
                            "type": "ActionSet",
                            "actions": [
                                {
                                    "title": "はい",
                                    "type": "Action.Submit",
                                    "id": "continueYes",
                                    "data": true
                                }
                            ]
                        }
                    ]
                },
                {
                    "width": "stretch",
                    "type": "Column",
                    "items": [
                        {
                            "type": "ActionSet",
                            "actions": [
                                {
                                    "title": "いいえ",
                                    "type": "Action.Submit",
                                    "id": "continueNo",
                                    "data": false
                                }
                            ]
                        }
                    ]
                },
                {
                    "width": "stretch",
                    "type": "Column"
                },
                {
                    "width": "stretch",
                    "type": "Column"
                }
            ]
        }
    ]
}

「はい」が押されたのか、「いいえ」が押されたのかは「(body('ゲームを続けるか?')['submitActionId'])」で取得することができます。
こちらで取得することができるのは、押されたSubmitButton のid です。 なので上記でいうと、
「はい」が押されたときは"continueYes"が、
「いいえ」が押されたときは"continueNo"が、
それぞれ返されます。

ゲームの実行条件は、「isContinue」が「true」のときと設定しましたね。
なので、ゲーム続行確認メッセージの応答で更新したいと思います。

変数「isContinue」には、「はい」が押されたときには「true」、「いいえ」が押されたときは「false」がそれぞれ設定されるようにします。

「変数の設定」を選択して、以下のように設定します。

@{equals(body('ゲームを続けるか?')['submitActionId'], 'continueYes')}

また、id にそれぞれ「true」「false」を設定しておくのもいいかもですね。

変数のリセット

ゲームを続行するにあたり一部変数のリセットを行う必要があります。

対象項目は「resultMessage」「voltMessage」「result」の3つです。

f:id:koruneko:20200806022222p:plain

これらは、変数に値をセットする際、更新ではなく追加を行っていますね。
なのでこのようにリセットしないと前回のゲームの情報が引き継がれてしまいます。

設定する値は、画像のように

null

を設定しておきましょう。

さいごに

以上でPower Automate を利用した、Teams でのワードウルフの作成方法の紹介は終了です。
少し説明を省いてしまった箇所もありますので、不明点などありましたらお気軽にお尋ねください。

Japan Power Platform Game Builders (JPPGB)というFacebook グループを作成してみました!

f:id:koruneko:20200806023135p:plain

作成したゲームを自慢したり、作成途中のゲームの実装方法などについて質問情報共有を行う場として作成しました。

グループが盛り上がってきたらなにかしらのイベントなども作成していきたいですねー。


スポンサードリンク