Power Automate でTeams投稿に添付ファイルをつける

# はじめに
Power Automate によるTeams投稿にファイルへの参照を付けたい場合、従来ではHTMLの`<a>`タグを利用して、リンクを付けることが一般的でした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/a7fe9ca7-74e3-123a-5ef3-760ff8a8fefc.png)


しかし、この方法では、文章が長くなった場合など、埋もれてしまって気づかれにくいとい問題がありました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/56773966-d245-62b3-9ac5-8f84dbf2e400.png)


手動で添付ファイルを付けたのと同じく、添付ファイルがわかりやすいように、Power Automate でも投稿ができるようになったよ！というのが本記事の内容です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/7df99f25-111b-c9a5-5961-d95bb16fcaac.png)

:::note info
なお、プレミアムコネクタは必要ありません。
:::

# 忙しい人向けの概要
Microsoft Graph APIを使用するために、Power Automate でTeamsコネクタの「Microsoft Graph HTTP 要求を送信する」を使用します。

下記ページの`例 4: 添付ファイルを含むメッセージを送信する`をご参照ください。
ただし、`id`には`eTag`に含まれる添付ファイルID である`GUID`を使用する必要があります。

https://learn.microsoft.com/ja-jp/graph/api/chatmessage-post?view=graph-rest-1.0&tabs=http#example-4-send-a-message-with-file-attachment-in-it

# フローの解説

## 事前準備
メッセージを投稿するために必要な情報をあらかじめ調べておきます。
- チームを特定するための ID
- チャネルを特定するための ID
- ファイルを保存しているSharePoint サイトのホームURL
- ファイルを特定するための ID やパス

これら4つの情報が必要です。

今回のフローではあらかじめ調べて変数に文字列として格納しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/b896f0e7-f592-0a66-e6ab-10b139947ad5.png)

:::note info
チームIDやチャネルIDを調べるためには、下記のようなアクションを利用することもできます。
また、これらのアクションを利用して動的に投稿先を指定することも可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/e30ee8ff-d069-b7b1-3d8b-48f284b9fa6a.png)
:::

## ファイルのGUIDを取得する
APIの仕様説明では、`driveId`や`itemId`を使用し、かつ、`$select=webDavUrl`を使用するAPIを使って取得できることが記載されています。
もちろんその方法でも問題ありませんが、Power Automate のアクションでも情報を取得できるので、今回はそちらを使用します。

具体的には下記のようなアクションを使用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/8d08ddcc-316b-c9c2-f83b-b4097448a7f1.png)

:::note warn
どちらを使っても問題ありませんが、今回はファイルの特定のためにパスを使用する関係で、「パスによるファイル メタデータの取得」を使用しています。
:::

実行結果から`Etag`を確認すると、`{}`で囲まれたGUIDを確認することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/b86ff30c-56a8-6014-d7a8-b091318fbcd9.png)

よって、文字列操作関数を利用するなどして、このGUIDを取り出すことができればOKです。

`{`と`}`のそれぞれの位置を取得して、`substring関数`を使って取り出すのが一般的な手法だと思いますが、私はよく`split関数`を使用しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/476d988d-7f75-67cc-5ffc-c3b46c76e87f.png)

```powerfx:GUIDの取り出し
split(split(outputs('パスによるファイル_メタデータの取得')?['body/ETag'],'{')?[1],'}')?[0]
```

## メッセージの送信
必要な情報がそろったので、いよいよ添付ファイルのついたメッセージを送ります。
「Microsoft Graph HTTP 要求を送信する」アクションを使用して、Graph API リファレンスと同じようにHTTPリクエストを送信します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/0517f771-b462-6950-9dbf-590d336e03d6.png)

```plaintext:URI
https://graph.microsoft.com/v1.0/teams/@{variables('teamId')}/channels/@{variables('channelId')}/messages
```

```json:本文(body)
{
    "body": {
        "contentType": "html",
        "content": "ファイルを送ります <attachment id=\"@{variables('GUID')}\"></attachment>"
    },
    "attachments": [
        {
            "id": "@{variables('GUID')}",
            "contentType": "reference",
            "contentUrl": "@{variables('contentUrl')}",
            "name": "@{outputs('パスによるファイル_メタデータの取得')?['body/Name']}"
        }
    ]
}
```
ここで、投稿本文(body/content)の中の`<attachment>`タグ中の`id`と、添付ファイル(attachment)中の`id`を揃えることに注意しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/300e4af6-2ba5-dcec-c786-d9effc19a100.png)

また、`contentUrl`はファイルへのリンクとなるURLを入力するのですが、少なくともサイトを間違えることのないように注意しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/d6186f73-dae9-563c-5e57-9bf09c0e987a.png)

# 余談(GUIDが必要なワケ)
ファイルへのリンクとなる`contentUrl`さえあれば、`GUID`がなくても良さそうなものですが、実際に正しい`contentUrl`と適当な`id`で投稿した添付ファイルでは、ファイルを開くことができなくなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/f6579e0e-e7e9-a259-186e-303b6b5c8af9.png)

逆に、ファイルのGUIDが正しければ、リンクとなるURLが間違っていてもよいのでしょうか？
実際にありそうなケースとして、『ファイルを添付した後に、保存フォルダを変更する』ということを試してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/c7730b7c-9155-1d89-af20-18ad069dcfe6.png)

ファイルを移動させても、投稿に保存されたリンクは、移動する前の元の保存場所を示しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/0641c223-fab9-493a-8e0b-7c733fcfdbd2.png)

間違ったリンクになっているはずですが、それでもちゃんとファイルを開くことができますし、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/58a70f69-9f40-2824-dd02-f7b4a3c7665f.png)

取得した「既存のアクセス権を持つユーザー」へのリンクには、移動した後のフォルダ名が指定されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/fa97931a-5d04-b0e3-265a-fce788a719ce.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/115f4cae-f9f8-fcb8-0ad2-7394a542a942.png)

公式の説明文書を見つけられていませんが、Teamsで投稿した添付ファイルの保存場所やファイル名が変わったとしても、リンクを活かすために、ファイル固有のGUIDを使って特定するという動きが組み込まれているようです。