Power Automateを使ってTeamsのチャネルメンション付き投稿をしたい

# はじめに
Microsoft Team使ってますか？
この記事を見ている方は使ってますよね。
Power Automate使ってますか？
こちらも使ってますよね。

この2つそれぞれはとても便利で、Power AutomateからTeamsへメッセージを送るコネクタも用意されているのでここも楽ができていいんです！
が、Power Automateからの投稿ではチームやチャネルにメンションできないんです:cry:
人やタグに対してならメンションできるんで、チャネルにだってメンションする手段はあるだろう。ということで探し、試した記録です。

[おわりに](#おわりに)へ記載していますが、すでに同様の悩みをもっていて解決された方の記事を元に自分が触れる環境でも試したよというの投稿です。

## 結論
Power AutomateのTeams用コネクタでは実現できませんが、
Microsoft Graphを使ってPower AutomateからPOSTリクエストを投げることで実現できます。
チャネルあてにメンションした投稿をするには、こうなりました。
投稿者は、コネクタの接続に利用しているアカウントになります。
![connector_setting.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72763/12691a66-38d3-202d-9447-a6bcfb9499eb.png)


## 実現方法
チャネルメンション付き投稿をするまでに大きく2つのステップが必要です。

## ステップ1：チームID、チャネルIDを取得する
Graphを使うためにチームとチャネルのIDが必要になります。
これを取得するためにGraph ExplorerなどからID取得のリクエストをしてもよいのですが、自分の使っている環境では叶いませんでした。
取得しようと試みたのですが、permission不足でした。管理者により制限されており、いくつか必要な権限の内1つをリクエストしてみたら、管理者から「どういうこと？」って連絡来ちゃいまして、、、諦めました！
ではどうするかというと、Teamsから取得します。
![teams_geturl.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72763/7f357868-da54-2c55-7a97-2001892fca55.png)
投稿したいチャネルの「…」をクリックして「チャネルへのリンクを取得」を選びます。
![copy_url.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72763/cef37147-2258-1a2d-76a8-6c2c1c2331d9.png)
そして表示されたリンクをコピーします。
（ほとんど塗りつぶしていますが。。）
このリンクはURLエンコードされているため、デコードします。
デコードの方法は何でも良いですが、元記事でも紹介されていた[Webサービス(https://meyerweb.com/eric/tools/dencoder/)](https://meyerweb.com/eric/tools/dencoder/)を使いました。
デコードするとこうなります。
（「*」はマスキングしている箇所です）
```html:デコード前
https://teams.microsoft.com/l/channel/19%3ad0f*************************04bc%40thread.skype/%25E9%2596%258B%25E7%2599%25BA%25E7%2594%25A8%25E3%2581%25A1%25E3%2582%2583%25E3%2581%25AD%25E3%2582%258B?groupId=3c4******************************1b2&tenantId=7ef******************************812
```
```html:デコード後
https://teams.microsoft.com/l/channel/19:d0f*************************04bc@thread.skype/%E9%96%8B%E7%99%BA%E7%94%A8%E3%81%A1%E3%82%83%E3%81%AD%E3%82%8B?groupId=3c4******************************1b2&tenantId=7ef******************************812
```
このデコードしたURLから`チームID`と`チャネルID`を取得します。
URLはこのルールで作られています。（元記事と少し違いました）
```html:URLの形式
https://teams.microsoft.com/l/channel/{チャネルID}/{チャネル名}?groupId={チームID}&tenantId={テナントID}
```
このルールに従って先程のデコード後のURLからチームIDとチャネルIDを抜き出します。

## ステップ2：Power Automateでフローを作る
Power Automateで任意のフローを作成または、編集中の場合はメンション付き投稿をしたい箇所を開いて、コネクタを追加します。
この時、「HTTP」で検索するとプレミアムコネクタの「HTTP」がでてきますが、それは使いません。
プレミアムコネクタが使えない環境でもHTTPリクエストをすることができるコネクタがあります。
`Office 365 Groups`を探してください。
そして`HTTP 要求を送信します`アクションを選択します。
![o365groups.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72763/805005ac-1c19-e68d-2918-03d4e74b34ec.png)
次の通り設定します。
本文の形式は[Microsoftサイト(https://learn.microsoft.com/ja-jp/graph/api/chatmessage-post?view=graph-rest-1.0&tabs=javascript#example-7--mention-a-channel-in-a-channel-message)](https://learn.microsoft.com/ja-jp/graph/api/chatmessage-post?view=graph-rest-1.0&tabs=javascript#example-7--mention-a-channel-in-a-channel-message)も参考にしてください。

| 項目 | 値 |
| --- | --- |
| URI | ```https://graph.microsoft.com/v1.0/teams/{チームID}/channels/{チャネルID}/messages``` |
| メソッド | POST |
| 本文 | (テーブル外に記載します） |
| コンテンツタイプ | application/json |

```json:本文
{
  "body": {
    "contentType": "html",
    "content": "<at id=\"0\">開発用ちゃねる</at>はろー"
  },
  "mentions": [
    {
      "id": 0,
      "mentionText": "開発用ちゃねる",
      "mentioned": {
                        "conversation": {
                            "id": "{チャネルID}",
                            "conversationIdentityType": "channel"
                        }
      }
    }
  ]
}
```

これで完成です！
フローを実行するとこんな感じでメッセージが飛びました。
（黒塗りだらけですが）
![result.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72763/1750ea97-d809-b24e-ab6e-b66dc758808a.png)



# おわりに
本記事は
https://www.teijitaisya.com/powerautomate-team-mention/
の内容を元に作業した記録を兼ねています。
元記事の作成、公開に感謝します。