【UiPath】Integration Service版Microsoft Teamsアクティビティで添付ファイルありのメッセージを送る

# はじめに
* タイトルの通り、Integration Service 版 Microsoft Teams アクティビティパッケージ「UiPath.MicrosoftTeams.IntegrationService.Activities」を利用して添付ファイル付きのメッセージを送信する方法を紹介します。

:::note info
Integration Service 版 Microsoft Teams アクティビティパッケージの最新版 v5.0.6 のリリースに合わせて記事を修正しました。
:::

:::note info
2023年11月13日時点では、Integration Service 版 Microsoft Teams アクティビティパッケージはプレビュー公開となっています。そのため、今後仕様が変更される可能性があることご了承ください。
:::

Microsoft Teams アクティビティ パッケージ (プレビュー) について

https://docs.uipath.com/ja/activities/other/latest/integration-service/uipath-microsoft-teams-about

# プロジェクトへの追加方法

:::note warn
v5.0.6 のリリースに伴い、**Windows レガシ版の提供が過去バージョンも含めて廃止されたようです。** Integration Service 版 Microsoft Teams アクティビティパッケージを利用いただくには Windows またはクロスプラットフォームをご利用いただく必要があります。
:::

* 「パッケージを管理」から Integration Service 版 Microsoft Teams アクティビティパッケージを追加します。
* 「Microsoft Teams」が表示されたら、「インストール」、「保存」を押してプロジェクトに追加します。

:::note warn
~~* 最新バージョンの v5.0.5-preview では任意項目であるはずの ```File Resource``` が必須項目となっている不具合があります。~~
~~* そのため、ひとつ前のバージョン v4.0.4-preview をご利用ください。本事象はWindowsとクロスプラットフォームのみで発生しており、Windowsレガシには影響がありません。~~

**v5.0.6 では上記不具合が解消されていること確認しました。**
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322296/6962bfc5-3010-58d9-a22d-1d02d9f6f709.png)

# ファイル添付の方法
Teams アクティビティでは以下の2つの方法でメッセージにファイルを添付することができます。以下順番に説明します。

**方法1** . ```画像``` プロパティを使った方法
**方法2** . プロパティ ```添付ファイル - ID```、```コンテンツ URL```、```添付ファイルのリソース名```を使った方法

## 方法1 ```画像``` プロパティを使った方法
* プロパティ名の通りですが画像ファイルのみ添付することができます。
* ```UiPath.Platform.ResourceHandling.IResource``` 型のインタフェースを実装したクラスの変数を設定することで画像ファイル付きのメッセージを送信することができます。
* ```IResource``` 型インタフェースを実装するクラスは、UiPath が提供する OneDrive や SharePoint、Google ドライブ、Dropbox などのクラウドストレージ用アクティビティから取得できます。
* 今回は「UiPath.MicrosoftOffice365.Activities」アクティビティパッケージを利用して SharePoint に格納された画像ファイルを添付してみます。

:::note
v5.0.6 ではローカルの画像ファイルを Teams メッセージに添付できるようになりました。
:::

:::note warn
**注意事項その1（UiPath.MicrosoftOffice365.Activities について）**
* 「UiPath.MicrosoftOffice365.Activities」では、「Office 365」と「Office 365 - クラシック」の2種類のアクティビティで SharePoint 及び OneDrive にあるファイルの操作をすることができます。
* 「ファイル/フォルダーを取得」等のアクティビティが「Office 365」と「Office 365 - クラシック」両方から提供されていますが、```IResource``` 型を実装したクラスの変数が取得できるのは **「Office 365」で提供されているアクティビティのみ** となります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322296/04e729ab-8527-8c53-e54f-0e6d95600ead.png)
:::

:::note warn
**注意事項その2（画像形式について）**
* ```File Resource``` プロパティを利用して添付できるファイルは **JPEG または PNG 形式の画像ファイルのみとなります。** JPEG や PNG 以外のファイル形式を添付したい場合は方法2を利用する必要があります。

JPEG や PNG 以外のファイル形式を設定して実行した場合にスローされる例外
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322296/18c642a5-5c49-2549-3d17-0a2a297d0069.png)
:::

サンプルワークフローと送信結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322296/95f20a58-1841-7acf-f41f-54ce5a37cf73.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322296/ae1872c1-d00c-9a9b-aaf1-06b2aa78e97d.png)

## 方法2. プロパティ ```添付ファイル - ID```、```コンテンツ URL```、```添付ファイルのリソース名```を使った方法
* こちらの方法では、```IResources```型のファイル変数を指定する代わりに、SharePoint または OneDrive に格納されているファイルの ID、URL 及び名前を指定することでメッセージにファイルを添付します。
* 方法1では画像ファイルのみ指定できましたが、方法2ではファイル形式に制限はなく指定することが出来ます。

### 何の値をプロパティに設定すればよいのか？
公式ドキュメントの[チャンネル メッセージを送信](https://docs.uipath.com/ja/activities/other/latest/integration-service/uipath-microsoft-teams-send-channel-message)アクティビティの説明を見ると次のように書かれています。コンテンツ URL と添付ファイルのリソース名は何となくわかりますが、添付ファイルIDが何者なのかこれだけではわからないですね。

> * **添付ファイル ID** - SharePoint アセットの ID です。 このフィールドは任意です。SharePoint コンテンツをアップロードする場合のみ必須です。
> * **コンテンツ URL** - SharePoint または DriveItem の URL です。 このフィールドは任意です。SharePoint コンテンツをアップロードする場合のみ必須です。
> * **添付ファイルのリソース名** - SharePoint アセットの名前です。 このフィールドは任意です。SharePoint アセットをアップロードする場合のみ必須です。

### Microsoft Graph APIのドキュメントを確認してみる
* [テクニカル リファレンス](https://docs.uipath.com/ja/activities/other/latest/integration-service/uipath-microsoft-teams-technical-references)によると、「チャンネル メッセージを送信」アクティビティは Microsoft Graph API である「[チャンネルまたはチャットでチャットメッセージを送信する - POST](https://learn.microsoft.com/ja-jp/graph/api/chatmessage-post?view=graph-rest-1.0&tabs=http)」を利用していることが書かれています。
* 何かヒントがあるかもしれないので、API のドキュメントを確認してみましょう。

[例 4: 添付ファイルを含むメッセージを送信する](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 は driveItem の ETag の GUID であることがわかりました。

> メモ： ファイルは既に SharePoint に存在している必要があります。 ファイルのプロパティを見つけるには、ファイルの driveItem を取得します。 たとえば、/drives/{id}/items/{id}です。 添付ファイル ID は driveItem の eTag の GUID、添付ファイル contentURL は driveItem のフォルダーの webUrl と driveItem の名前、添付ファイル名は driveItem の名前です。

### 実装してみる
:::note warn
**注意事項その3**
* 方法1では、「UiPath.MicrosoftOffice365.Activities」の「Office 365」を利用する必要がありましたが、「Office 365」配下のアクティビティの出力からはETagを取得する手段がないため**方法2では、「Office 365 - クラシック」のアクティビティを利用する必要があります。**
:::

* 方法1と同様に、「ファイル/フォルダーを取得」アクティビティで SharePoint または OneDrive に格納されているファイルを取得します。
* ファイルの取得ができたら、変数の以下のプロパティを Teams の「チャンネル メッセージを送信」アクティビティに設定していきます。

| プロパティ              | 設定する値                                 |
|:-----------------------|:------------------------------------------|
| 添付ファイル - ID       | ```file.ETag``` （※1）                    |
| コンテンツ URL          | ```file.WebUrl``` + "/" + ```file.Name``` |
| 添付ファイルのリソース名 | ```file.Name```                           |

※1 file.ETag の値は、```{0A1CE4AF-2871-47CF-8A75-B784737525C2},5```の形式となっており、鍵括弧内の値（この例では ```0A1CE4AF-2871-47CF-8A75-B784737525C2```）を抽出して ```Attachement ID``` に設定する必要があります。正規表現 ```(?<=\{)[^\(\)]+(?=\})``` を利用することで値を抽出することが出来ます。

サンプルワークフローと送信結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322296/44b90bc7-e70a-32d3-0c28-5d409a6169ec.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322296/e9dbd371-2627-3d4c-a503-ee8ac17eea1c.png)

# おわりに
* 本記事で紹介した内容が皆様のお役に立てれば幸いです。