【小ネタ】PowerAutomateとLogicAppsからDynamics 365のメモテーブルに書き込む

# はじめに
小ネタで恐縮ですが、Dynamics 365(以下Dynamics)で利用している「メモ」テーブルへPowerAutomateのクラウドフローとLogicAppsから書き込む方法をご紹介したいと思います。

## この記事でわかること

- PowerAutomateとLogicAppsからDynamicsのテーブルへ書き込む方法
- テーブルへのレコード追加時、関連レコードをID指定で紐付ける方法
- PowerAutomateのCDS(CommonDataService)コネクタとLogicAppsのCDSコネクタでは、微妙に指定方法が異なること(ハマった点)
- 概要図<br>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192656/847360cc-9c1e-6a3f-229d-209f7ad15da3.png)


## 前提条件
- 本記事はDynamicsの「メモ」テーブルにレコードを追加する前提で作成しており、他のテーブルでの確認はしていません。（多分同じだとお思うのですが）
- PowerAutomateとLogicAppsは存在していることが前提となり、基本的には設定方法のみを記載し、作成手順などは記載しません。
- 参照している名称や画面は2021/1現在のものとなります。

# 設定方法
## 対象となるテーブル
### 1. 書き込み対象となる「メモ」(annotation)テーブル
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192656/d9c39e6f-961e-1674-6b71-850d0ac7a4bb.png)

### 2.「メモ」へ紐付ける対象となる「営業案件」(opportunity)テーブル
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192656/ab537535-cc09-fb1d-12fd-d6ee985d2098.png)

## 画面側の利用箇所
メモテーブルは、画面側にタイムラインとして表示されています。
今回は更新処理を行ったトリガでPowerAutomateとLogicAppsを動かして、このタイムラインにステータスを書き込みます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192656/43cd246b-cd0f-dafc-74ff-fcfafe9871f9.png)

## PowerAutomateの設定
PowerAutomateで更新トリガを利用した「クラウドフロー」を作成して、メモテーブルへの書き込みとServiceBus Queueへのデータ送信を設定します。
#### 1. トリガを指定してクラウドフローを作成する
自動化フローを「レコードが更新されたとき」をトリガにして作成します。トリガ選択時には「common」と入力すると、CDSのコネクタが表示されてわかりやすいと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192656/ee71fbc9-2204-6763-ce11-68cc7d6f4d57.png)

#### 2. トリガを設定する
先程の画面で利用している「営業案件」テーブルをエンティティに設定します。
今回はサンプルとして営業案件へ更新トリガを設定していますが、環境によっては頻繁にイベントが発生してしまう可能性もあるのでお気をつけください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192656/7205e3b4-80bd-6f8f-a44b-9227a7270630.png)

#### 3. 実行IDの採番を設定する
画面側にメッセージを表示するときわかりやすくしたいため、変数を利用して実行IDの採番をしておきます。
「変数を初期化する」アクションで、値にあらかじめGUIDを採番します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192656/9e512b41-8732-d65e-90a8-ec9efcaf040f.png)

#### 4. メモテーブルへの書込み処理を設定する
Common Data Serviceのアクションで、「新しいレコードの作成」を設定します。
説明がメモの本文になりますので、実行IDを記載しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192656/ac191716-cfe4-b9b8-0b84-23cd07809823.png)
次に「詳細オプションを表示する」をひらき、対象となるデータのキーを設定します。
開いた設定項目を下の方にスクロールすると、「関連(営業案件)」が見つかると思います。
ここに、更新トリガである「営業案件」の一意キーを設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192656/7d876a42-e07f-94b3-98d0-7a9cdb499eab.png)
**注意点１**
ID指定時に**opportunitiesという「営業案件」のエンティティ名の複数形を指定してID値を指定する**必要があります。
ID指定時の形式 ： ```opportunities(営業案件のID値)```
**注意点２**
「オブジェクトの種類」といった**設定が必要そうな項目を指定すると、なぜか私の環境では実行エラー**となりました。
これは環境依存かもしれないのですが、本記事で記載した項目のみで動作しています。

#### 5. Service Busへのメッセージ送信を設定する
実行IDと営業案件のID値をServiceBus Queueへ送信する設定をします。
ServiceBus Queueへの接続コネクタ設定等については割愛させていただきました。
内容に、JSON形式で実行IDと「営業案件」の一意キーを設定します。(JSONは手書きしてます。他にうまいやり方があるかもしれないのですが・・・)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192656/037da068-3880-33cb-4ffc-ba6dc8760715.png)

これでPowerAutomate側の設定は完了です。

## LogicApps側の設定
こちらもLogicAppsの作成方法など細かい点は割愛させていただき、ステップごとの解説のみ記載していきます。
#### 1. ServiceBus Queue トリガを設定する
今回は「キューで1つ以上のメッセージを受信したとき(オートコンプリート)」を利用して、Service Bus Queueトリガを設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192656/013ccf09-9581-1366-96ac-3c08f8797a5c.png)

#### 2. JSONの解析を設定する
ServiceBus queueに追加されたメッセージはJSON形式にしましたので、JSON解析を行ってからフィールドにマッピングします。
Queueの本文は以下の形式となっており、ContentDataをbase64でdecodeしてあげる必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192656/4950ba51-f80d-636e-978d-f4634673c6f6.png)
そのためJSON解析のコンテンツには、以下のようにtriggerBodyのContentDataを一度base64でdecodeしてから、JSON関数を指定します。
```json(base64ToString(triggerBody()?['ContentData']))```
値を指定時は、「動的なコンテンツの追加」ダイアログから式を選択し、関数を入力してから「更新」ボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192656/5acca807-cde3-9412-b66e-51757af7c3f6.png)
スキーマはPowerAutomate側で指定したJSON形式を指定してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192656/52147b22-a038-cbab-a391-50c9f163e44e.png)
#### 3. メモテーブルへの書込みを設定する
LogicApps側でもCommon Data Serviceのアクションで「新しいレコードの作成」を設定します。
ただお気づきでしょうか、**PowerAutomate側のアクションと微妙に引数が違う**ことに。というよりか、**設定項目が少ない**のです。
この設定項目の違いでかなりハマったのですが、結論としては下記キャプチャの通りに設定すれば書込みが可能です。
ポイントは

- 「関連」に営業案件のIDを**そのままセット**する
   - **※決して「関連」にopportunities(営業案件ID)のようにセットしない(処理が失敗します)**
- 「関連Type」にはopportunitiesを選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192656/54f3157e-c0d5-fa42-b88f-170ae47815e5.png)

これでLogicApps側の設定も完了しました。
次はDynamicsの画面からデータを更新して、正常に動作が行われるか確認します。

## Dynamics側の更新トリガの確認
案件名を変更して、更新トリガを発生させます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192656/2f6a82a9-e4ae-890c-7307-0b52432496af.png)
更新トリガでタイムラインが更新されたことを確認するため、タイムラインの再読み込みを行います。
ServiceBus Queueを経由するので少しタイムラグが発生しましたが、以下のとおりタイムラインにはPowerAutomateとLogicAppsでそれぞれ書き込んだメッセージが表示されました。
実行IDもうまく引き渡されているようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192656/3ad358a4-4b86-0380-4552-a58ab6ce8c91.png)


# おわりに
Dynamicsにおけるタイムラインの本来の使い方では無いかもしれませんが、ユーザにDynamicsの更新トリガを起点とした非同期処理の結果を通知する方法として、今回はメモテーブルからタイムラインへの表示を試してみました。
PowerAutomateフローやLogicAppsには様々なコネクタが用意されていますので、CDSのテーブル更新だけではなく、Teamsへのメッセージ投稿やメール送信などを行うことが可能です。
今回のポイントとしては、同じ機能を持ったコネクタでもPowerAutomateフローとLogicAppsでは微妙に設定項目が異なることです。こういった点が地味にハマるので、そのメモとして作成しました。
かなりニッチな情報だと思いますが、参考になる方がいらっしゃれば幸いです。