Dataverse添付ファイル（メモ・タイムライン）をPower Automateで扱う

こんにちは！
今回はDataverseでの添付ファイル（ファイル列ではない）をPower Automateで扱う方法をご紹介しますー！

Dataverseテーブルの設定を編集する際に表示される、「添付ファイルを有効とする（メモとファイルを含む）」にチェックを入れたときの添付ファイルをPower Automateで扱う方法をご紹介します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/9319534b-6746-72d9-c8b9-1dfbe6667839.png)

# 前提
「添付ファイルを有効とする（メモとファイルを含む）」を選択すると標準テーブルの「メモ」テーブル（英語名：「Note」、スキーマ名：「annotation」）とのリレーションが作成されます。
直接テーブルに**列が作成されるのではなく**、リレーションを作り「メモ」テーブル側に保存がされるようになります。

::: note
標準テーブルとは
Dataverseがある環境を作成した時に自動的に作られるテーブル。
https://learn.microsoft.com/ja-jp/power-apps/maker/data-platform/types-of-entities
:::

メモテーブルについては以下を参照ください。

https://learn.microsoft.com/ja-jp/power-apps/developer/data-platform/reference/entities/annotation

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/43b57d99-1eea-6d59-0c4a-fbd5a068fc62.png)
アプリ側（キャンバスアプリとモデル駆動型アプリ）で添付ができるようになります。
キャンバスアプリでは、フォームなどテーブル操作をするコントロールに「Attachments」という項目が追加され、そこで添付ができるようになります。
モデル駆動型アプリでは「タイムライン」というコンポーネントで添付ができるようになります。

モデル駆動型アプリ編集画面での追加の仕方
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/b75fd94f-23c8-1f72-f7ed-c9acace39e3e.png)

モデル駆動型アプリの再生画面での動き
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/fa6379aa-b268-410c-0ae8-c0df676d0892.png)



詳細はこちらの記事が参考になります。

https://qiita.com/Rinatamu/items/916328c8c5b70f763630

# Power Automateで添付ファイルを扱う


今回は以下の画像のような流れでフローを組み、承認フローの中でファイルを添付するというアクションを行いたいと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/c0435668-0ae4-8d97-549d-d12badab94c3.png)

::: note
今回の画面は前のバージョンのデザイナー（編集）画面で行っています。
現時点(2024/1/8)で、モダンデザイナーから前のバージョンのデザイナーを開くには右上のトグルボタンで切り替えできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/4f1b1103-d8f5-57e6-d06d-1ffed9120fd4.png)

:::

## トリガー
トリガーに「行が追加、変更または削除された場合」を使用します。
今回は行が追加されたときの、その新規行のファイルデータをこの後のアクションで扱っていきたいと思います。

メモテーブルの「objecttypecode」列に「親レコードのテーブル論理名(*)」が保存されています。今回はこのテストテーブルに紐づけられる行のみに絞りこみをするために、「行のフィルター」で指定します。

種類の変更：追加
テーブル名：「メモ」テーブル（英語名：「Note」）
スコープ：Organization
行のフィルター：
```
objecttypecode eq '親レコードのテーブル論理名'
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/c0da5185-9fe5-826f-c4f3-e02da0db07be.png)


(*)
「親レコードのテーブル論理名」は以下の方法で取得します。
テーブルの詳細画面で[プロパティ]>[高度なオプション]を開き、論理名をコピーします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/f9be8463-ca70-2cf1-7626-e512ebe418d6.png)

::: note warn 
添付ファイルがテストテーブルに追加されても、もとのテストテーブルの列のアップデートがされるわけではありません。
こちらのトリガーでは、メモテーブルを指定することで、「（モデル駆動型アプリで）タイムラインの添付ファイルが追加されたとき」「（キャンバスアプリで）Attachmentsが追加されたとき」の指定をしています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/697b7a40-1b43-f243-e75e-b5738f8f3950.png)

「テストテーブルに変更があったとき」にしたい場合は、テストテーブルを指定してください。そして、次のアクションで、「行を一覧にする」アクションなどでフィルタリングします。


「行を一覧にする」アクションでの指定方法について後述
[# おまけ：「行を一覧にする」アクションでの行指定方法](#おまけ行を一覧にするアクションでの行指定方法)
:::

## ファイルの利用方法
今回は取得したファイルの情報を承認アクションの中で使用します。

承認アクションについて、今回は承認の種類として、「開始して承認を待機」を選択しました。

承認アクションの中の項目は以下の画像のように指定しました。
大事な添付ファイルについて解説します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/d1d1f834-f294-a8f8-4da7-c7efd7a4a403.png)


ファイルの名前は動的なコンテンツのなかから「File Name」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/aa1f1ec7-e483-8e92-e78d-197a137cba9c.png)

次にファイルコンテンツを指定します。
base64ToBinary式を使用します。
[添付ファイル コンテンツ -1]をクリックし、右のポップアップから[式]を選択
以下の式を入力し、[OK]ボタンをクリック

```
base64ToBinary(triggerOutputs()?['body/documentbody'])
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/f6744b7f-e1c4-3866-c9ab-ab3ff595f449.png)


画像のような値が入ったら、成功です！
フローを保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/823c31a8-c558-fced-92c4-e8a7df4001fa.png)

::: note warn
以下の画像のようにそのままのファイルコンテンツを扱うと、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/a100cd27-fac0-4cbd-0efd-9509b8bcbd6e.png)
「ファイルを読み取れない」というエラーが表示されます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/33e25ffa-7dd2-cc80-9c33-692fc57f1977.png" width=50%>
:::


# 動きの確認

今回は以下のようにモデル駆動型アプリのタイムラインコンポーネントでメモを追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/c5097c49-52a5-a4eb-cbcf-368685c7cd9e.png)


承認アクションが実行され、Teamsに以下のように通知が届き、添付ファイルをクリックすると、ダウンロードできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/58fc4979-217a-31f5-516c-11c45e41229e.png)


中身を見ていくとpdfやjpg、pngなどのファイルを開くことができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/b08f1a8b-1422-8ac5-a337-0f40710a5254.png)

# おまけ：「行を一覧にする」アクションでの行指定方法
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/83ad8d0c-d673-cca4-27e5-42363bc73423.png)
項目の設定は以下のように行います。

テーブル名：「メモ」テーブル（英語名：「Note」、スキーマ名：「annotation」）
「objecttypecode」列に「親レコードのテーブル論理名」、「objectid」列に「親レコードのID(*)」が保存されています。
行のフィルター：

```
objecttypecode eq '親レコードのテーブル論理名' and _objectid_value eq '親レコードのID'
```

(*)
「親レコードのID」は今回、トリガーになっているテストテーブルのGUIDのため、「20231218test」(テーブル名と同じ名前の列)の値を設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/4d9a6594-1132-ea7d-85b8-d24f7dfef92c.png)

::: note
Odataクエリで検索列は以下のように指定します。(`NAME`に列名)
_`NAME`_value

:::