7
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

はじめに

今回の成果物です。
【イラスト】たけこのこニョッキのルールと遊び方

Teamsのメッセージの作成ボックスからフローを起動して、一緒に遊ぶメンバーを選びます。
選んだメンバーとのグループチャットが作成され、Botからアダプティブカードが投稿されます。
カードのボタンを押した順に『〇にょき!』し、同じタイミングでボタンを押してしまうと『〇にょき!』の番号が被ってしまい負けになります。

今回、勝敗の判定は行っていません。

使用している技術的な要素

お遊びのフローですが、いくつかPowerAutomate の技術的な要素を含みますので、それらの解説をしていきます。

  • ユーザーを選択するアダプティブカード
  • マイリスト(個人のLists)をPower Automate で操作する
  • アダプティブカードとリストを連携させる

ゲームを開始するフロー

このゲームを成立させるためには2つのフローが必要です。
1つ目がこの、ゲームを開始するフローです。
image.png
作成ボックスから開始して、グループチャットにアダプティブカードを投稿するまでを担当します。

ユーザーを選択するアダプティブカード

トリガーにはTeamsコネクタの「作成ボックスから」を使用しています。
このトリガーはTeamsから自分の好きなタイミングで呼び出せるので、とても便利なトリガーです。
image.png
このトリガーはアダプティブカードを作成することで、フローの起動時にユーザーからの入力を受け付けることができます。
これを使って、このフローの開始時に一緒に遊ぶユーザーを選択できるようにしています。

さて、アダプティブカードの作成は、このトリガーの「アダプティブ カード の編集」をクリックした次の画面で直感的な操作で作成することができますが、ユーザーを選択するInput要素はこの選択肢の中にありません。
image.png

これはアダプティブカードデザイナーでも同じことで、GUI操作でユーザーを選択する要素を追加することはできません。
つまり、自分でアダプティブカードのJsonを編集して追加する必要があります。

このユーザーを選択する要素、ユーザー ピッカーの詳細はこちらのページに記載されています。

こちらのページをよく読み、Jsonを自分で編集する必要がありますが、今回はこのページの例をちょっとだけ変更して作成します。

サンプルコード
{
 "type": "AdaptiveCard",
 "body": [
  {
   "type": "TextBlock",
   "size": "Medium",
   "weight": "Bolder",
   "text": "People Picker with Org search enabled"
  },
  {
   "type": "Input.ChoiceSet",
   "choices": [],
   "choices.data": {
    "type": "Data.Query",
    "dataset": "graph.microsoft.com/users"
   },
   "id": "people-picker",
   "isMultiSelect": true
  }
 ],
 "actions": [
  {
   "type": "Action.Submit",
   "title": "Submit"
  }
 ],
 "$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
 "version": "1.2"
}

基本的にはそのまま使用できますが、ラベルを以下のようにちょこちょこっと書き換えて完成です。

編集したサンプルコード
{
    "type": "AdaptiveCard",
    "body": [
        {
            "type": "TextBlock",
            "size": "Medium",
            "weight": "Bolder",
            "text": "2人以上追加してね!"
        },
        {
            "type": "Input.ChoiceSet",
            "choices.data": {
                "type": "Data.Query",
                "dataset": "graph.microsoft.com/users"
            },
            "id": "people-picker",
            "isMultiSelect": true
        }
    ],
    "actions": [
        {
            "type": "Action.Submit",
            "title": "ゲーム開始"
        }
    ],
    "$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
    "version": "1.2"
}

これでフローの起動時にユーザーを選択できるようになりました。
image.png

グループチャットの作成

先ほど選択できるようにしたユーザーとのグループチャットを作成します。
image.png
「チャットの作成」アクション、[追加するメンバー]に動的なコンテンツからトリガーのpeople-pickerを指定します。

アダプティブカードの要素として指定したIDで取得される入力値ですね。
image.png

このアダプティブカードの出力people-pickerはカンマ区切りのユーザーIDです。なので、[追加するメンバー]にそのまま入力すればグループチャットの作成が可能です。
image.png

項目の作成

後の工程に関係する部分ですが、「ニョッキ!」が何番目かを記録するためのデータをListsに作成します。
image.png

SharePointリストでもよいのですが、個人の始めた遊びのためにチームのSharePointリストを使うのも忍びないので、個人用Listsを使用しています。
image.png
タイトルに作成したグループチャットのIDを、ニョッキした人を記録するためのpeople列も用意していますが、数値を記録するための列があればOKです。int列として、初期値「1」で作成しています。

またこのアクションはSharePointコネクタ、Listsの保存場所は個人用ListsなのでOneDriveと異なっています。
しかし、OneDriveとSharePointは根幹では同じようなものなので、このSharePointコネクタのアクションでOneDriveのListsも操作できます。
image.png

なので、OneDriveのURLを入力することで個人用ListsもPower Automate から操作することが可能です。
image.png

チャットやチャネルにカードを投稿する

最後に、ゲーム用の「ニョッキ!」宣言ボタンのついたアダプティブカードを投稿します。
image.png

カード自体は単純な作りですが、先ほど作成したListsの項目と連携できるようにしておきます。
image.png

具体的には、アクションボタンのdataプロパティにListsのIDを指定します。これによって、ボタンを押したときに後続のフローでIDを受け取ることができます。
image.png

Adaptive Card
{
    "type": "AdaptiveCard",
    "$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
    "version": "1.4",
    "actions": [
        {
            "type": "Action.Submit",
            "title": "〇にょき!",
            "data": {
                "spoID": @{outputs('項目の作成')?['body/ID']}
            }
        }
    ],
    "body": [
        {
            "type": "TextBlock",
            "text": "番号が重複しないように\n\nタイミングよくボタンを押そう!",
            "wrap": true
        }
    ]
}

アダプティブカードの扱いについては、Miyakeさんのスライドがとってもとってもわかりやすいです。

また、Card Type IDに任意のテキストを入力します。
このテキストは、次のフローのトリガーで使用するので控えておきましょう。
image.png

ニョッキ!を宣言するフロー

ボタンを押したときに「〇にょき!」するためのフローです。
image.png
フローの全体像はこんな感じです。
image.png

When someone responds to an adaptive card

カードのボタンが押されたときに起動するトリガーです。
アダプティブ カードの入力カードの種類 IDには、先ほどカードを作成した情報と同じ情報を入力します。
ただし、ListsのIDを指定していた動的なコンテンツは削除し、適当な値(この場合は「1」)に変えておきます。
image.png

スキーマが指定できていれば良いので、出力の値は違っていても問題ありません

にょき!番号の取得と更新

何番目にボタンを押したかを取得し、次のために番号を1つ進めるための部分です。
image.png

サイトのアドレスは先ほど同様OneDriveのURLを、IDにはカードの出力で返したListsのIDを設定します。

spoID
@{triggerBody()?['entity/cardOutputs/spoID']}

更新アクションではintを+1するために、以下の数式を入力しています。

spoID
@{add(outputs('項目の取得')?['body/int'],1)}

また、間に5秒の待ち時間を入れているのは、わざと宣言がかぶりやすくするためのゲーム性の調整のためです。
image.png

にょき!の投稿

最後に、取得したにょき番号を投稿します。
Botからの投稿になりますが、誰が宣言したかがわかるようにユーザーの@ mentionを使用しています。
image.png

@ mentionを取得するための、ボタンを押したユーザーのIDや、投稿先グループチャットのIDはトリガーのアウトプットに含まれており、動的なコンテンツから指定することが可能です。
image.png
image.png

さいごに

作成したフローのサンプルを公開します。

7
1
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
7
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?