Adaptive Card Designer を使って Teams用カードを作ろう

Power Automate でユーザーに対して通知を送りたい場合、メールではなくてTeamsでメッセージを送ります。（送ってください）
その場合、フローとしては以下のようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/3012ab94-14c6-7e68-53fd-e318de6745f1.png)

ただし、この場合送れるのは単純なメッセージだけです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/16b92a48-b9d2-a36e-d6b4-a7c2459d854d.png)

より見やすい、またユーザーからのフィードバックを得られるようにするため、「カード」形式で送信することをお勧めします。
その場合、フローは以下のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/2793d582-277d-e964-0dfa-fe333706f825.png)

この、[Adaptive Card]という項目に何を書けばいいのかといいますと、JSON形式のデータを書く必要があります。
https://qiita.com/Eri_Akiyama/items/18d9448ed9d0fce45776

このテキストを一から書くのはかなり大変です。そこで、GUIベースでAdaptive Card を作成できる Adaptive Card Designer というものを利用します。

https://adaptivecards.io/designer/

↑このサイトにアクセスすると以下のような画面になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/f02c0dad-756f-3825-0b28-e3dd26b02055.png)
さて…何をすればいいのやら…混乱ですね。

今回はこのデザイナーについて少し解説していきます。

# まずはサンプルのカードをPower Automate で Teams に送りたい

画面左部分のパーツを選んで中央のカードにドラッグするとパーツが貼れる、というのは何となく理解できると思います。
そして中央のカードにある各パーツをクリックすると右側にそのパーツのエレメント（要素）が表示されるので編集できそうというのも何となく理解できると思います。
問題は下の２つのJSONデータですね。
右がSAMPLE DATA です。いわゆる「変数」たちが定義されています。
左がCARD PAYLOAD です。カードの形を定義しています。（文字や画像やボタンの位置関係など）
ところどころ${title}のような変数っぽい記述がありますが、その部分で右側のSAMPLE DATAを参照しているというわけです。

そうなると、実際に送るべきJSONデータはこの二つを合体させる必要があります。画面上部の Copy card payload をクリックすると、ペイロードデータにサンプルデータの値を入れたJSONデータがクリップボードにコピーされます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/00a7643e-6a97-ce69-b461-c366cf0ca0f4.png)


じゃあこのデータを先ほどのフローアクションの項目に入れてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/5f95caa7-f088-8afc-650c-a58279b0ebce.png)
確かに変数部分が置換されていますね。では実行してみましょう。

おそらくフロー自体は成功するものの
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/6c7b3af1-cf88-28b2-0241-106ca90eb455.png)
カードは届かないと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/0f5cf6c7-8dfc-5124-bf3d-d10703a44e74.png)

これは、Adaptive Card のスキーマバージョンが原因です。デフォルトでスキーマバージョンは1.5ですが、フローボットからTeamsに送信する場合、スキーマバージョンを 1.4 以下にする必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/8e7847f5-77f4-1df4-db00-ad790cf5393e.png)
もう一度、 [Copy card payload]をクリックし、フローアクションの項目を変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/1dab4454-9733-9a47-a516-283405268542.png)
実行すると今度はカードが送られてきました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/4bb45f21-c39e-84a7-3c92-70c43afa303d.png)

ちなみに今回、 Select Host app を変更しませんでしたが、見た目が若干変わったりホストによってはサポートしていない要素もあるかもしれませんので、移行の作業では Microsoft Teams を選択しておくことをお勧めします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/25ef5845-a350-76f6-04fa-af3dd82544b8.png)

# 自分で最初から Adaptive Card を作りたい

もとのサンプルデータのカードを変更して作成してもできるのですが、一から作ってみる（もしくはほかの見本をベースに作る）ことをお勧めします。
まずはNew Cardをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/f9898740-f2d8-5e4b-80f7-9c79abe68734.png)

いくつかひな形が表示されますが、上部にある味気ない黒い四角が「空のカード」なので今回これをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/f6cd568e-80eb-b0bf-01a9-ed22dd137ab0.png)
空のカードができました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/7993ff20-72e2-850b-9e36-a1f8c8157a2c.png)
JSONコードもスキーマバージョンしか書いてありませんね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/5b14caa5-e4d7-831c-6437-364eb5ac8c86.png)
 **このバージョンが1.5になっていたら、右上のTarget versionを1.4に変更してください（最重要）**
Select Host App も Microsoft Teams - light/dark に変更しておくとよいでしょう。

## Adaptive Card のざっくりとした構成

左側のツールバーがほぼすべてなのですが、構成について簡単に説明します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/d5778676-d768-5641-3914-8468ddaa7f4f.png)

基本的にはカードに要素をドラックして貼り付けると横幅いっぱいにパーツが配置されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/0118f0ec-0667-2fdb-1212-ff34715a6336.png)
先ほどのサンプルのように絵の横に文字を表示したい場合、ColumnSetを配置して
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/9b30ffcc-0440-bf9d-2139-9db6005dd731.png)
その中にColumnを入れます。(横のサイズをstretch/automaticにしないとうまく横並びにできない)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/6addc54f-7373-d0ec-df3a-dc18e728c688.png)
Columnの中に複数textblockを配置することもできます。そうすれば、絵の横に2つのtextblockがあるという、このサンプルの構造を実現可能です。

Columnというパーツは左のバーに見当たりませんが、ColumnSetを配置したときに右下に表示されるアイコンをクリックするとColumnが追加できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/0fa0858e-081a-bb86-d7d8-b8fdca3008ce.png)


２つ追加してみました。サンプルっぽい配置に変えてみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/10b98772-e08c-c45b-9095-874376e3ddfe.png)

Columnの中にimageやTextBlockを入れて、画像側のColumnをAutomatic、テキスト側のColumnをStretchにしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/2bd8e37b-b912-ed12-951c-71786e67609d.png)

ここで注意する点は、幅の設定はImage/TextBlock側ではなくてColumn側でStretch/Automaticを定義します。

## インタラクティブなカードにしてみる

カードを受け取ったユーザーが何らかのメッセージを返したり、ボタンをクリックするとURLにアクセスしたりする機能を追加することができます。
まずは「URLアクセスボタン」をつけてみます。これも左側にパーツはないのですが、カードを選択すると右下に[Add an action]メニューが出てきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/67e5430f-d489-96b0-f2fd-192d4ba754be.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/839de79d-a489-248f-912b-099e6be0ce8a.png)

URLを開くのは Action.OpenUrlなのでこちらを選択します。
右側でELEMENTSを編集できますのでTitleやUrlを入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/6409cefa-48f4-8033-bf8d-331c8d9013d0.png)

それらしいカードが出来上がりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/82d803a8-2dba-4aa7-5aa6-fdfb2ad977aa.png)

```JSON:Surface.json
{
    "type": "AdaptiveCard",
    "$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
    "version": "1.5",
    "body": [
        {
            "type": "TextBlock",
            "wrap": true,
            "text": "テスト",
            "size": "Large"
        },
        {
            "type": "ColumnSet",
            "columns": [
                {
                    "type": "Column",
                    "width": "auto",
                    "items": [
                        {
                            "type": "Image",
                            "url": "https://1.bp.blogspot.com/-ZOg0qAG4ewU/Xub_uw6q0DI/AAAAAAABZio/MshyuVBpHUgaOKJtL47LmVkCf5Vge6MQQCNcBGAsYHQ/s1600/pose_pien_uruuru_woman.png",
                            "size": "Medium"
                        }
                    ]
                },
                {
                    "type": "Column",
                    "width": "stretch",
                    "items": [
                        {
                            "type": "TextBlock",
                            "wrap": true,
                            "text": "Surfaceほしい！"
                        },
                        {
                            "type": "TextBlock",
                            "text": "予算で買ってください。",
                            "wrap": true
                        }
                    ]
                }
            ]
        }
    ],
    "actions": [
        {
            "type": "Action.OpenUrl",
            "title": "Surface購入！",
            "url": "https://www.microsoft.com/ja-jp/d/surface-pro-8/8QWCRTQ8V8XG?icid=mscom_marcom_H1a_SurfacePro8"
        }
    ]
}
```

これを先ほどのフローに張り付けて送ってみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/448d0607-b8fe-167d-90b1-d584e187c4d0.png)

応用として、ユーザーに何らかの入力を促して結果を受け取ることができます。その場合「アダプティブカードを投稿して応答を待機する」というアクションを使います。こちらについては以下を参照してください。
https://qiita.com/Eri_Akiyama/items/18d9448ed9d0fce45776

## ちなみに
このように、一からカードを作成すると SAMPLE DATA EDITOR の JSON は空になると思います。基本的には大掛かりなデータを扱う時で、サンプルデータを別途保持しているような状況でなければ、これで構いません。動的に値を入れたい場合は Power Automate で定義するはずなので…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/2b06af04-b59e-ac9b-ff34-3cb91b1af6e5.png)


# まとめ

Adaptive Card Designerを使って Teams用のカードを作成しました。
おそらく、「どのJSONファイルを張り付ければいいのかわからない」「Designerで作ったJSONでカードを送ったらWe're sorry, this card couldn't be displayed だったんだけど！」というケースが多発していると思われます（私も）
前者は「copy card payload」をクリックしたときのクリップボードの内容ですし、後者はスキーマバージョンを1.4以下で解決すると思います。
あとは ColumnSet/Column とコンテナを使ってきれいな配置にできれば結構使えると思います。