個別チャットへ送信したアダプティブカードを更新する方法

今回は、Power Automate の Teamsコネクタの 「チャットやチャネルのアダプティブ カードを更新する」アクションのチョッとしたテクニックのご紹介です。

# 「チャットやチャネルのアダプティブ カードを更新する」アクション
「チャットやチャネルのアダプティブ カードを更新する」アクションの動作イメージや利用手順などは [@MiTo60448639](https://twitter.com/MiTo60448639) さんの記事がわかりやすいと思います。

https://qiita.com/MiyakeMito/items/9a50a38ddba37e8b4f65

Docs はこちら。

https://docs.microsoft.com/ja-jp/connectors/teams/?WT.mc_id=BA-MVP-5004053#%E3%83%81%E3%83%A3%E3%83%83%E3%83%88%E3%82%84%E3%83%81%E3%83%A3%E3%83%8D%E3%83%AB%E3%81%AE%E3%82%A2%E3%83%80%E3%83%97%E3%83%86%E3%82%A3%E3%83%96-%E3%82%AB%E3%83%BC%E3%83%89%E3%82%92%E6%9B%B4%E6%96%B0%E3%81%99%E3%82%8B

アダプティブカード関連の Docs はコチラ。

https://docs.microsoft.com/ja-jp/power-automate/overview-adaptive-cards?WT.mc_id=BA-MVP-5004053

https://docs.microsoft.com/ja-jp/power-automate/create-adaptive-cards?WT.mc_id=BA-MVP-5004053

知らない機能を利用する際などは公式の基本情報もチャンとチェックしないと、ですね。読みにくいけど😇

# そのアクション、個別チャットにアプローチできない問題？
紹介しているアクションですが、ターゲットに指定できる［投稿先］が

  - Channel ・・・ チームのチャネルをターゲットにする場合に選択
  - Group chat  ・・・ 会議チャットやグループチャットをターゲットにする場合に選択

の 2 つしか選択肢に表示されません。

![画像2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215892/59cea9ae-9459-863a-edbe-c1beaf82264b.png)

一見すると、いわゆる個別チャット（1対1 のチャット）には対応してないようにみえます。投稿先に”カスタム値の入力”とあるので、それを利用したらイケるんじゃないかな？とも思ったのですが、既に先人が「ダメですね」という調査結果を共有してくれていました。

https://twitter.com/MiTo60448639/status/1541361514136731648

んー、個別チャットにポストしたアダプティブカードも更新したいなぁ、という状況になった当方。色々と試行錯誤を繰り返し、調べて試して実現する方法を見つけましたヨッ！！

# 個別チャットのアダプティブカードを更新する方法
さて、本題。当方が発見した方法です。

## おことわり
記事投稿時点（2022/08/07）の仕様、方法になります。将来的なアップデートで変更になる可能性があります。また、当方が調査して検証した限りの内容を多分に含みます。その点を予めご了承のうえ続きを確認ください。

## 説明用のフロー全体像
当記事の説明で利用するフロー全体像は下記です。シンプルに仕上がっております。

![画像3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215892/17d69021-8125-874f-5e1b-015cb5c420bf.png)

### 動作イメージ
左側が Power Automate のフロー画面、右側が Teams の個別チャット（1対1のチャット）へアダプティブカードを送信して、更新している画面です。
<blockquote class="twitter-tweet"><p lang="en" dir="ltr"><a href="https://twitter.com/hashtag/PowerAutomate?src=hash&amp;ref_src=twsrc%5Etfw">#PowerAutomate</a> Update an adaptive card in one on one chat. <a href="https://t.co/3AmG0CgD06">pic.twitter.com/3AmG0CgD06</a></p>&mdash; やま (Yama) (@yamad365) <a href="https://twitter.com/yamad365/status/1556177623805759488?ref_src=twsrc%5Etfw">August 7, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

図で説明すると、下記のようなイメージです。

![画像1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215892/d81e54a3-7971-d1c0-601c-8f6ffef71ce7.png)

シンプルに仕上がっておりますね。

## フローの説明 あるいは 実現方法の解説
個別チャットに投稿したアダプティブカードを更新する手段を案内していきましょう。フローの各アクションに説明用の番号を付与しておきます。

![画像4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215892/2cdacde3-95d1-a6a8-6e7a-d61bbbc84e00.png)

### ①アダプティブカードを投稿して応答を待機する
更新される前のアダプティブカードを投稿しているアクションです。検索すると先人たちの例が見つかると思います。ので、詳細は割愛ッ！

https://docs.microsoft.com/ja-jp/connectors/teams/?WT.mc_id=BA-MVP-5004053#%E3%82%A2%E3%83%80%E3%83%97%E3%83%86%E3%82%A3%E3%83%96-%E3%82%AB%E3%83%BC%E3%83%89%E3%82%92%E6%8A%95%E7%A8%BF%E3%81%97%E3%81%A6%E5%BF%9C%E7%AD%94%E3%82%92%E5%BE%85%E6%A9%9F%E3%81%99%E3%82%8B

### ②アレイのフィルター処理 でターゲットを取得
このアレイ（配列）のフィルター処理がキモです。アクションを展開すると下記のようになっています。端的に言うと「①で投稿したメッセージの URL 情報から ”conversation ID” を取得」しています。

![画像5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215892/19c74508-576b-8a12-a05b-b2646cae918d.png)

［差出人］に指定している関数は下記。

```
split( outputs('アダプティブ_カードを投稿して応答を待機する')?['body/messageLink'] , '/' )
```

①のアクションで投稿したメッセージの ”messageLink” の URL を "/" で分解しています。

https://docs.microsoft.com/ja-jp/azure/logic-apps/workflow-definition-language-functions-reference?WT.mc_id=BA-MVP-5004053#split

アレイのフィルター条件、左辺は ”item()" を指定します。これは、上記 split 関数で分解された各アイテムですね。

真ん中の条件は ”次のもので始まる” で、右辺は ”19:” と入力しています。これで「分解された結果のアイテムの中で、"19:” から始まるモノ」のみが抽出されてきます。

この ”19:～” という値が重要です。まずはフローの全容を説明してしまいますので、現時点でピンときてない方も「この後の処理で必要な情報が取れるらしいぞ」という理解で現時点はオッケーです。ってコトで次へ行きましょう。

### ③投稿済みのアダプティブカードを更新する
さて、問題の「チームのチャネルかグループチャットしか更新できなそう」なアクションへの対応です。

![画像6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215892/61768425-0304-70c5-04ea-b9b309aff797.png)

［投稿先］は ”Group chat” を選択してください。
［Message ID］ は ① のアクション結果にある ”messageId” です。
1つ飛ばして［Adaptive Card］はお好きな JSON をどうぞ。

［Group chat］へ下記を指定します。

```
first(body('アレイのフィルター処理'))
```

前述②で処理したターゲットを指定しています。first 関数を利用している意図がわからない方は是非ともご自分で調べて把握してください。長くなるので詳細にはふれませんが、このアクションがエラーになった際の情報が非常に不親切なんですよ。エラーメッセージから誤っている内容が推測しづらいので多少知識を持って挑戦しないとアカン系のアクションだと個人的に考えています。なので、ここらへん、自力で処理できないとツライです。頑張って学習や検証などを各位で実施してください！

https://docs.microsoft.com/ja-jp/azure/logic-apps/workflow-definition-language-functions-reference?WT.mc_id=BA-MVP-5004053#first

これで、動作イメージのように「個別チャットへ投稿したアダプティブカードを更新する」が実現できます。

### ”conversation ID” 解説 あるいは ② の更なる補足
②の処理で、"/" で split（分割）して "19:" で始まる対象を取得していたのは、③の解説で何となく想定できたかと思います。［Group chat］の項目へ指定するための ID を生成していたんですね。
![画像12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215892/d7fef200-cfec-549d-6a56-098d50cad8a9.png)
Teams の個別チャットやグループチャット、チームのチャネル スレッド等は各々『その場所を一意に表す値』を持っています。その値、今回の場合は「URL に含まれている」を確認するイチバン簡単な方法は、ブラウザーで Teams を起動して確認する方法でした。

#### グループチャットの場合
![画像7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215892/7f159739-3996-981e-1bb5-0111d1f94483.png)

グループチャットの場合、”19:” で始まり、末尾が”@thread.v2”になるようです。

例）htt㎰: // teams.microsoft.com / _# / conversations / ***19:b1e～中略～00＠thread.v2*** ?ctx=chat

#### 個別チャットの場合
![画像8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215892/ff6e9357-aa1b-85c1-a36c-e65fb64579e1.png)

個別チャットの場合は ”19:” で始まり、末尾が”@unq.gbl.spaces”になるようです。
実在のユーザーであろうと、フローボットであろうと当ルールは確認した限りでは同一でした。

例）htt㎰: // teams.microsoft.com / _# / conversations / ***19:5e8～中略～ec87＠unq.gbl.spaces*** ?ctx=chat

そのものズバリではないですが、参考になりそうな情報を下記にしておきます。

https://docs.microsoft.com/ja-jp/microsoftteams/platform/concepts/build-and-test/deep-links?WT.mc_id=BA-MVP-5004053

https://docs.microsoft.com/ja-jp/microsoftteams/platform/resources/bot-v3/bot-conversations/bots-conv-channel?WT.mc_id=BA-MVP-5004053

グループチャットであろうと、個別チャットであろうと「ターゲットになる ID（今回は URL の一部）」が指定できれば『ソコにあるアダプティブカードを更新する』が可能になる、です。なので、ターゲットとなる場所が明確であれば、固定の値をアクションの該当箇所へ設定するだけでも同じ結果を期待できます。当方は、将来的に複数の対象へアプローチしたかったので汎用性を考慮した内容でフローの作成をしてみました。

# まとめ
Power Automate で用意されていたアクションの項目と、Microsoft 365（今回は Teams）の仕様というか動きというかをジックリ眺めて試していたら辿り着いた、という感じです。実はもっと簡単に実現できる方法があるかもしれません。Docs など、どこにも「個別チャットのアダプティブカードを更新する方法」は明記されてないので、他に手段をお持ちの方は是非とも情報公開してほしいです。

アクションの標準で選択肢に「個別チャット」が用意されていれば、こんな苦労しなくて済んだのに・・・。今後の VerUp に期待しましょう。（VerUp でもっと柔軟に実現できる日が来たら、この記事は”当時を物語る断片”として歴史になる・・・のかな？ｗ）

それでは、皆さま。素晴らしい Power Platform Life を！