Power Automate for desktop「データ テーブルからJSON文字列の作成方法」

この記事は[「Microsoft Power Automate Advent Calendar 2022」](https://qiita.com/advent-calendar/2022/powerautomate)13日目の参加記事です。

12日目は 
- カレンダー1 [@kinuasaさん](https://twitter.com/kinuasa)の[[Power Automate for desktop]フローがコンソールに表示されなくなった場合の対処法](https://www.ka-net.org/blog/?p=15229)
- カレンダー2 [@mocca1103](https://twitter.com/mocca1103)さんの[Power Automate を始めてチーム内で利用した思い出](https://qiita.com/mocca1103/items/6f5e3ca07f5e09473771)
- カレンダー3 [@ymasaoka](https://twitter.com/mappie_kochi)さんの[Power Automate で SharePoint Online ユーザーグループ列に複数の値を設定する](https://zenn.dev/ymasaoka/articles/howto-set-multi-value-spo-user-row-using-pa)
でした!

## 概要

Power Automate for desktopとの付き合いはかれこれ2年になります。
今回取り上げる「カスタム オブジェクトをJSONに変換」アクションは、2年前あまりうまく動作しませんでした。しかし、いまはさまざまな構造をもつデータをJSON文字列に変換することができます。このアクションを利用し、データ テーブルからJSON文字列を作成します。

https://learn.microsoft.com/ja-jp/power-automate/desktop-flows/actions-reference/variables#convertcustomobjecttojson

## 注意事項

- 2022年12月の情報です
- Power Automate for desktop 2.227.177.23340
- Windows 10 Pro 21H2
- 個人調べであることをご理解ください
- 実験的な試みですので自己責任でお願いいたします


### ひとつのデータ テーブルからJSONを作成する場合

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/70733f72-cf41-36c0-e860-4dbcf197c777.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/ddb176da-a7dc-7f98-bed2-dbf954b20527.png)


1. サンプルデータ
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/badbeed8-b6d3-8a86-8cd5-4a56f9860397.png)
2. カスタム オブジェクトを作成し、プロパティ名を設定、値にデータ テーブルを代入します
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/9fa0f88e-7239-af55-987e-e7f6bd09bff4.png)
    カスタム オブジェクトについて
    https://learn.microsoft.com/ja-jp/power-automate/desktop-flows/variable-data-types#custom-object

    今回はカスタム オブジェクトのプロパティ名に'brother'としてリテラルにしていますが変数を用いて動的にすることも可能です。

3. JSONに変換
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/6d3cc830-2def-7718-970c-aa28b32553f7.png)

2でつくったカスタム オブジェクトを展開すると、値にデータ テーブル型のまま入っています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/5438c75d-0aa5-0b54-1d27-9a4ea3adf9e3.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/3093c039-72d4-b674-aa2c-f8ecb6f38a4c.png)

```
%{ 'brother': { ^['name', 'age', 'phone'], ['ichiro', 32, '000-000-0001'], ['jiro', 25, '000-000-0002'], ['saburo', 20, '000-000-0003'] } }%
```
このようなデータですが、「カスタム オブジェクトをJSONに変換」アクションはいい感じに解析し、JSONに変換してくれています。データ テーブルの列名をプロパティ名に、データを値に振り分け、文字列と数値を判別し、文字列に対し""囲みも行っています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/70733f72-cf41-36c0-e860-4dbcf197c777.png)

### サンプルフロー

```r
Variables.CreateNewDatatable InputTable: { ^['name', 'age', 'phone'], [$'''ichiro''', 32, $'''000-000-0001'''], [$'''jiro''', 25, $'''000-000-0002'''], [$'''saburo''', 20, $'''000-000-0003'''] } DataTable=> DataTable
SET NewVar TO { 'brother': DataTable }
Variables.ConvertCustomObjectToJson CustomObject: NewVar Json=> CustomObjectAsJson
```

### 複数データ テーブルからJSONを作成する（データ テーブルが配列関係の場合）

カスタム オブジェクト>リスト>データ テーブルとネストしていても、しっかり解析されてJSON文字列にしてくれました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/bb5bf8af-36d6-9000-a6ee-4dd510d06285.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/07488e73-25fd-a379-e1e1-310468121195.png)


1. サンプルデータ
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/949f7e3b-9fb7-87d3-9600-cb35c73827dc.png)

2. サンプルデータ
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/91cafb5d-c4c1-83cf-e941-6c6e3db7e5a3.png)
3. 空のリストを作成
4. リストに1つめのデータ テーブルを%{name:value}%でカスタム オブジェクトとして追加
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/f74cfc1a-650b-b1b1-ac40-53deca1a1c01.png)

5. リストに2つめのデータ テーブルを追加
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/eb9209ef-385c-35a9-cba4-10d5dafa08f9.png)
6. リストをカスタム オブジェクトに格納
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/744d4add-e49c-f100-d4b9-45d7c4b1cad9.png)

7. JSONに変換
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/7207d014-fadc-953b-26be-6317613192db.png)

### サンプルフロー

```r
Variables.CreateNewDatatable InputTable: { ^['Code', 'PuroductsName', 'quantity'], [$'''002''', $'''HDD''', 2], [$'''004''', $'''CPU''', 1], [$'''005''', $'''FAN''', 1] } DataTable=> OrderDataTable1
Variables.CreateNewDatatable InputTable: { ^['Code', 'PuroductsName', 'quantity'], [$'''004''', $'''CPU''', 3], [$'''005''', $'''FAN''', 3], [$'''006''', $'''SSD''', 4] } DataTable=> OrderDataTable2
Variables.CreateNewList List=> List
Variables.AddItemToList Item: { '00001': OrderDataTable1 } List: List
Variables.AddItemToList Item: { '00002': OrderDataTable2 } List: List
SET NewVar TO { 'Order': List }
Variables.ConvertCustomObjectToJson CustomObject: NewVar Json=> CustomObjectAsJson
```

### 複数データ テーブルからJSONを作成する（データ テーブルを入れ子構造にした場合）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/080ef96a-bd49-1aea-50f8-7a3600aef460.png)

1. 子になるデータ テーブルを先に作成
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/2813237f-dd4a-64e3-e5d6-72984a9ca6db.png)

2. 親データ テーブルの作成
    子になるデータ テーブル%OrderDetail%を値に使用し、入れ子にします
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/612f8df5-3066-29ff-39d8-932cd36c4ce8.png)

3. 入れ子になったデータ テーブルをカスタム オブジェクトに格納
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/a2908c4c-6c82-9629-f2c5-26940585ce53.png)

4. JSONに変換
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/ac7b0755-8b0d-1397-06b2-c17dd6cce013.png)

### サンプルフロー

```r
Variables.CreateNewDatatable InputTable: { ^['Code', 'PuroductsName', 'quantity'], [$'''004''', $'''CPU''', 2], [$'''005''', $'''FAN''', 3], [$'''006''', $'''SSD''', 4] } DataTable=> OrderDetail
Variables.CreateNewDatatable InputTable: { ^['CustomerName', 'Email', 'Adress', 'OrderDetail'], [$'''taro yamada''', $'''example@example.com''', $'''Tokyo JAPAN''', OrderDetail] } DataTable=> OrderDataTable
SET NewVar TO { 'order': OrderDataTable }
Variables.ConvertCustomObjectToJson CustomObject: NewVar Json=> CustomObjectAsJson

```

## まとめ

「カスタム オブジェクトをJSONに変換」アクションを使いデータ テーブルからJSON文字列を作成することができ、このアクションすげえってなりました。一方で公式ドキュメントは受入「カスタム オブジェクト」と書かれているだけなので、データ テーブルを値に格納したカスタム オブジェクトはサポートされているのか微妙なところです。なので実用する時はもう少し検証が必要です。

Power Automate for desktopとの付き合いはGAされた2020年12月からなのですが、個人的な学習環境は、こんなことに。
![CleanShot 2022-12-11 at 16.09.08@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/4f01763a-adab-1923-8a2c-77c3adee96ed.png)
ざっとフローを見返したのですが、アウトプットをサボっていると陽の目を見ないフローがいつの間にか増えています。そしてドキュメント化していないものは全く覚えていません。今回のネタも眠っていました。💦
学習したことは都度アウトプットする重要性を痛感しました。

[Microsoft Power Automate Advent Calendar 2022](https://qiita.com/advent-calendar/2022/powerautomate)明日14日目は@fufufu100さん、@yukio_365さん、@MiyakeMitoさんの担当です。今年は賑やかですね！

ついでに、今日は私の誕生日です。😀