Power Automate でチームやチャネルにメンションする

# はじめに
Power Automate でこれまでできなかった、チーム宛てのメンションやチャネル宛てのメンションを、TeamsコネクタのHTTPリクエストを使用して実現します。

この方法はプレミアムコネクタこそ必要ないものの、少し難しいアクションを使用しますので、本当に必要かどうかは慎重にご判断の上ご利用ください。

# これまで
Power Automate のMicrosoft Teamsコネクタであつかえるメンションは、個人宛てのメンションとタグメンションの2種類だけでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/94c49376-cf4d-ae09-fbc5-1816d6179e2f.png)

`<at>`タグで何とか頑張ってみても、チームやチャネルに対するメンションはできませんでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/f055524e-371e-b94d-461a-681f971c587a.png)



# 参考資料
Microsoft Graph API を使用することで、これまでできなかったことができるようになります。
下記のページの2つの例を参考に、Power Automate からリクエストを送信します。

---
- 例 7: @mention チャネル・メッセージ内のチャネル
- 例 8: @mention チャネル メッセージ内のチーム

https://learn.microsoft.com/ja-jp/graph/api/chatmessage-post?view=graph-rest-1.0&tabs=http

# やりかた

このチームを使って実演します。
既定で作成される`一般(Genaral)`チャネルに加えて、3種類すべてのチャネルを用意しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/f0236dae-98dc-0578-453a-24984d54a9ca.png)

## 情報の取得
メッセージの投稿やメンションのために、チームとチャネルそれぞれのIdが必要になります。

今回はすべての種類のチャネルでメンションが遅れるか確認するために、すべてのチャネルの情報を取得します。
下記のアクションで、チームの情報とそのチームのチャネルの一覧の情報を取得します。

- チームを取得
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/460197b9-b392-bd92-29f3-e876c061ee54.png)

- チャネルの一覧を取得
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/2815e233-642a-7dbb-d473-9d9045eb8dac.png)


今回は取得したすべてのチャネルを対象にするため、そのまま「それぞれに適応する(`Apply to each`)」を使用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/15beb6d0-046b-fc21-c713-d4ff35aba00a.png)


:::note info 
送信先のチャネルを絞り込みたい場合は、アレイのフィルター処理を使うなどするとよいと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/e22469dd-9b10-a576-84b3-bd585ea45f7d.png)
:::

## チームメンション
取得した情報を使って、「Microsoft Graph HTTP 要求を送信する」アクションを使用することで、チームメンションを行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/fba9dfb8-37bd-6ee5-6348-66ddaf99c253.png)

```uri:URI
https://graph.microsoft.com/v1.0/teams/@{outputs('チームの取得')?['body/id']}/channels/@{items('それぞれに適用する')?['id']}/messages
```

チーム宛てのメンションは`conversationIdentityType`を`team`にします。

```json:本文
{
    "body": {
        "contentType": "html",
        "content": "<div><div><at id=\"0\">@{outputs('チームの取得')?['body/displayName']}</at>&nbsp;チームメンションができるよ！</div></div>"
    },
    "mentions": [
        {
            "id": 0,
            "mentionText": "@{outputs('チームの取得')?['body/displayName']}",
            "mentioned": {
                "conversation": {
                    "id": "@{outputs('チームの取得')?['body/id']}",
                    "conversationIdentityType": "team"
                }
            }
        }
    ]
}
```

---

この`本文`で大事な点が3つあります。
1. `mentions`と`content`で指定している`id`を揃える
1. `mentionText`と`<at>`タグ内のテキストを揃える
1. チームのIdを使用する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/df166885-440b-4241-915f-8b8f1bd62629.png)

ここを守っていれば、メンションとしての表示名を、チーム名以外にすることもできるようです。

また、`displayName`はあってもなくても問題ありませんでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/a796d5d7-7627-5dd4-69ef-981bc26564bf.png)


## チャネルメンション
チャネルメンションを行う場合も、「Microsoft Graph HTTP 要求を送信する」アクションを使用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/09c5d7e9-6d47-0109-96e5-915d6511dd20.png)

```uri:URL
https://graph.microsoft.com/v1.0/teams/@{outputs('チームの取得')?['body/id']}/channels/@{items('それぞれに適用する')?['id']}/messages
```

チャネル宛てのメンションは`conversationIdentityType`を`channel`にします。

```json:本文
{
    "body": {
        "contentType": "html",
        "content": "<div><div><at id=\"0\">@{items('それぞれに適用する')?['displayName']}</at>&nbsp;チャネルメンションもできるよ！</div></div>"
    },
    "mentions": [
        {
            "id": 0,
            "mentionText": "@{items('それぞれに適用する')?['displayName']}",
            "mentioned": {
                "conversation": {
                    "id": "@{items('それぞれに適用する')?['id']}",
                    "conversationIdentityType": "channel"
                }
            }
        }
    ]
}
```
こちらも注意点はチーム宛ての場合と同様です。

# 結果
結果は以下の通り、すべてのチャネルでチーム・チャネルメンションをそれぞれ行うことができました。
![2024-05-12_00h44_53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/6aaddea6-23d7-24f3-dd0c-04c2615f1f15.png)
![2024-05-12_00h45_09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/804a73af-3548-4b45-43a9-e509c88cce8c.png)
![2024-05-12_00h45_14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/5d62672c-9923-4097-9675-c60c1032efe3.png)
![2024-05-12_00h45_20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/cda5bcab-7c3b-df3a-ff3a-187158f68abd.png)


## ちょっと不思議な結果
本来、チームメンションができないはずの、プライベートチャネル・共有チャネルでも、Graph API を使うとチームメンションができてしまうようです。
だからと言ってこれといった用途や不都合は思いつきませんが、仕様の違いには注意しておきましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/33cdb43f-4827-d34e-d799-69b6ca44426a.png)