Power Apps のキャンバスアプリから直接 Teams にメッセージを投稿しよう

Power Apps のキャンバスアプリから Teams にメッセージを投稿する際、皆さんはどうされていますか ?

非推奨となってはいるものの PostMessageToChannel や PostMessageToChannelV2,PostMessageToChannelV3 で凌いでいる方もいらっしゃれば、Power Automate に連携している方もいらっしゃるのではないでしょうか。

前者のケースの多くは、投稿者をボットではなくユーザーとして、誤った投稿をしても削除や編集可能にしたいというご要件があるのではないでしょうか。

今回はこのようなユースケースにおいて、PostMessageToConversation での実装 Tips を Step by Step でご紹介します。

なお、掲載する内容は 2023 年 6 月時点の情報です。

# はじめに
最初に前提となる情報を整理しましょう。

今回は、次のような要件を想定しています。
- Power Apps のキャンバスアプリから Teams にメッセージを投稿する
- 投稿先 : チームのチャネル宛て
- 投稿者 : キャンバスアプリ利用者

# 公式情報の確認
早速実装に進みたいところですが、使い方を知るうえで重要な Microsoft の公式情報を確認しましょう。

**[Microsoft Learn の Teams コネクターのページ](https://learn.microsoft.com/ja-jp/connectors/teams/#%E3%83%81%E3%83%A3%E3%83%83%E3%83%88%E3%81%BE%E3%81%9F%E3%81%AF%E3%83%81%E3%83%A3%E3%83%8D%E3%83%AB%E3%81%A7%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%82%92%E6%8A%95%E7%A8%BF%E3%81%99%E3%82%8B)** を見てみると、下図のとおり投稿者・投稿先・投稿メッセージの 3 つを指定すれば良さそうです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366959/663a3f36-44c7-f617-b5d7-484b09a5e6d6.png)

# キャンバスアプリで実装を始める前に
早速キャンバスアプリで実装を開始したいところですが、前項で確認した 3 つのパラメーターをどのように指定すればよいかをあらかじめ確認しましょう。
これからご紹介する方法は大先輩の同僚から教わったのですが、他のケースでも有用な私にとっては目から鱗な Tips でした。
是非、読み飛ばさずにご確認ください。

## 確認方法
確認に利用するのは、Power Automate です。
Power Automate は実行時の各パラメーターを JSON 形式で確認できるため、どのパラメーターに何を指定しているのか・どのように指定しているのか分かります。
では早速、確認していきましょう。

## 1. Power Automate でインスタントフローを作成し実行
1. **[Power Automate](https://make.powerautomate.com/)** を開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366959/da296ef4-ee0f-d2bc-f3bb-2cc69a20aba3.png)

1. [作成] から [インスタント クラウドフロー] を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366959/1b738501-78c6-ffa8-eae6-8e013e4c95b8.png)

1. [手動でフローをトリガーします] を選択し [作成] を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366959/1652960a-358d-2fd5-bc39-b2ac89f44bbf.png)

1. [新しいステップ] を選択し、[Microsoft Teams] を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366959/f60b7cfe-e043-3e3a-f93b-373befb2dc99.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366959/18fff799-7983-fff6-71f9-e217997c6b2d.png)

1. [チャットまたはチャネルでメッセージを投稿する] を選択し、投稿者・投稿先・Team・Channel・Message をそれぞれ図のように選択・入力したら [保存] を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366959/a1dc6a49-28e6-1491-456b-09d165b8cbdf.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366959/022e595a-ab88-3215-dfaf-d95eaa8cae1b.png)

1. [フローを開始する準備ができました。テストすることをお勧めします] と表示されたら [テスト] を選択し、[手動] - [テスト] の順に選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366959/75bd81af-9127-90a9-2ee5-f671258047f8.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366959/3746db72-7661-1b04-b527-1540b361dfcd.png)

1. 実行確認画面で [続行] を選択し、[フローの実行] を選択 (初めて Teams コネクターを利用する際は、接続の確認画面が表示されます)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366959/efebd276-e498-542c-84f6-64057393a961.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366959/4c70cf63-bbdf-fd2b-659a-b2bb281cbf4a.png)

## 2. 実行結果を確認
1. [完了] を選択し正常に実行されたことが確認できたら、Teams のアクションを選択し展開
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366959/6fc891cc-25b9-7f46-a1ec-88edf665440b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366959/46e35de2-9f02-ebcc-e737-be5714e27f60.png)

1. [未加工入力の表示] を選択し、[parameters] の内容を確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366959/6f1a1b0a-822f-6445-396c-a26c5703b7f1.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366959/a4a11e4a-d4ff-78dd-6ba4-50fb38873ddf.png)

1. Teams を開き、ユーザーとして投稿されていることを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366959/de8b9e37-7f7d-fd6b-180a-03dbb4d79638.png)

## 確認結果 : 何を指定すればよいのか
結果から、次のことが読み取れます。
- poster に "User" と入力する
- location に "Channel" と入力する
- body にチームの ID・チャネルの ID・投稿内容を指定する

# キャンバスアプリで実装
投稿するにはチームとチャネルを選択し、投稿内容を入力できるようにする必要があります。
このセクションでは、それらの実装を行っていきます。

:::note warn
都合で英語表記となっている部分がございますので、適宜読み替えをお願いします。
:::

## Power Apps Studio を開き、チームとチャネルを選択できるようにする
1. **[Power Apps](https://make.powerapps.com/)** にアクセスし、[Blank app] - [Create (Blank canvas app)] の順に選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366959/9e91b1d9-1c20-05eb-2060-592854daebf2.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366959/96c86770-a539-5f24-a55a-91b67b66bddd.png)

1. 任意のアプリ名を入力しフォーマットを選択したら、[Create] を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366959/8a37f610-034d-568e-4d02-64eab72e8c62.png)

1. [データ] - [データの追加] の順に選択し、[Microsoft Teams] コネクタを検索・選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366959/0bb34c3b-a1e3-8838-9c01-566a8dcb3e7b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366959/e01fc45d-420a-840c-2c7b-453f93c0590f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366959/0269aae9-3b76-6098-ad5a-bc6c0b9191a0.png)

1. 
1. [ツリー ビュー] - [挿入] - [ドロップダウン] の順に選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366959/ed5d895b-6ac5-272d-c6bf-3b5f7d8e262d.png)

1. 追加したドロップダウンコントロールの Items プロパティに "MicrosoftTeams.GetAllTeams().value" を入力し、Value を "displayName" に変更
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366959/2097330a-517d-3535-cac2-0034f29f8feb.png)

1. 同様の手順でドロップダウンコントロールを追加し配置・サイズを整えた後 Items プロパティに "MicrosoftTeams.GetChannelsForGroup(Dropdown1.Selected.id).value" を入力し、Value を "displayName" に変更
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366959/59f07481-1a2c-0e27-75ec-afff8e976484.png)

:::note warn
コントロール名を変更した際は、Dropdown1 の部分を変更した名前に置き換えが必要です
:::

## 投稿内容を入力し Teams に投稿できるようにする
1. 同様の手順でテキスト入力コントロールとボタンコントロールを追加し、配置・サイズを整える
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366959/e79b4e44-0c44-76ac-80f5-e25a3610fd13.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366959/d1e69f8f-c243-3936-1bdb-1689e8bba404.png)

1. ボタンコントロールの Onselect プロパティを下図のように設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366959/ba09c7ce-6369-fcac-f570-00ce7be6129d.png)
``` Button1.OnSelect
Set(
    varPostMessage,
    {
        recipient:{
            groupId: Dropdown1.Selected.id,
            channelId: Dropdown2.Selected.id
        },
        messageBody: TextInput1.Text
    }
);

MicrosoftTeams.PostMessageToConversation(
    "user",
    "Channel",
    ParseJSON(JSON(varPostMessage))
);
```
### 設定内容の解説
MicrosoftTeams.PostMessageToConversation は、下図 のとおり poster (投稿者 : Flow bot かユーザー), location (チャネルかチャット), body (投稿内容) の 3 つが必要です。
Power Automate で確認した際、body に投稿先の情報が含まれていたことも確認できました。

**Power Apps (poster)**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366959/cf3ce81f-3870-b41c-91f7-3036e3d01e28.png)
**Power Apps (location)**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366959/6a084066-8a99-4e4c-e278-5f33fe8a663b.png)
**Power Apps (body)**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366959/16dcef07-9d21-6f12-c7e2-a3e65f80493e.png)
**Power Automate**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366959/8493babd-182b-950b-a313-ba413de59414.png)

これらの情報から Power Apps では poster や location は テキスト型の情報を渡せば良さそうということが推察できるため、Power Automate の実行結果に倣い User と Channel をテキスト型になるようダブルクォーテーションで括り入力しました。

body については、Power Automate で確認した内容から recipient 配下に groupId と channelId が含まれ、recipient と同列で投稿内容のテキストが入った階層構造であることが推察できます。
そこからさらに推察 (という名の試行錯誤) を行うと、何らかの方法を使ってこの階層構造を持つ Object 型を渡してあげればよいことが分かります。試しに下記のように body を設定すると
```
MicrosoftTeams.PostMessageToConversation(
    "user",
    "Channel",
    [
        {
            recipient:{
                groupId:Dropdown1.Selected.id,
                channelId:Dropdown2.Selected.id
            },
            messageBody: TextInput1.Text
        }
    ]
);
```

下図のとおり、型指定されていない UntypedObject を要求されました。

::: note warn
スクリーンショットの都合で改行を入れています
:::
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366959/2139ae14-c292-2d63-3db0-062201cf2fe9.png)


型指定されていないオブジェクトを作成するには、**[ParseJSON 関数](https://learn.microsoft.com/ja-jp/power-platform/power-fx/reference/function-parsejson)** が有効です。
ParseJSON 関数は JSON 文字列を解析するため、JSON 文字列を渡す必要があります。そのため、**[JSON 関数](https://learn.microsoft.com/ja-jp/power-platform/power-fx/reference/function-json)** を利用します。
JSON 関数はレコードやテーブルを JSON 文字列に変換してくれるため、この階層構造をレコード形式となるよう指定すれば良いことになります。

これを表すと、下図のような形になります。
ここではレコード形式のデータを varPostMessage 変数にあらかじめ格納し、それを JSON 関数で JSON 文字列に変換したものを ParseJSON で更に UntypedObject に変換するという形にしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366959/e84d8f2f-3d1e-9af6-3aaa-1d7eab8e69b3.png)

## 動作確認
1. F5 キーで動作確認状態とし、チーム・チャネルを選択し Teams に投稿する内容を入力したら [ボタン] (投稿用のボタン) を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366959/c4f6c4a5-2c4f-3f8e-b431-532f2749bf7b.png)

1. Teams を開き、投稿されたことを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366959/f25d46ae-9504-ade6-0c7a-89cd21895336.png)

# まとめ
以上が、Teams コネクターの PostMessageToConversation の使い方でした。参考になりましたでしょうか。
Teams コネクターに限らず、各コネクターは様々な要因 (例えば接続先システムの API の仕様変更) で日々 Update されていきます。そのため、類似ケースでの確認・実装時にこの手法が参考になると考えます。
その機会がありましたら、ぜひ本記事を参考にトライしてみてください。

---

### Appendix
#### パラメーター確認のために作成した Power Automate を削除
1. Power Automate を開き、[マイ フロー] - [︙] - [削除] の順に選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366959/7676d797-aeb1-4393-bbf2-0eecba9eccd1.png)

1. [削除] を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366959/37383d39-f961-bec3-f799-7166ef06bcd5.png)

以上、最後に後片付けの手順でした。