Power Automate Desktop  の変数（7）「カスタムオブジェクト型」

## 概要  

Power Automate Desktop(以下PAD) の変数についての記事最終回「カスタムオブジェクト型」です。PADのベース言語Robinのドキュメントを参考に試したものをまとめました。「変数の設定」アクションを中心に簡略化した例を挙げながら整理してみようと思います。コードはPADにコピペで試せます。

## 目次

1. [概要、数値型](https://qiita.com/sys_zero/items/13e06a41834cf40988ea)
2. [テキスト型](https://qiita.com/sys_zero/items/0f5b54dd4dbbf0d31e71)
3. [Datetime型](https://qiita.com/sys_zero/items/7804ffffea5b244c46c4)
4. [ブール型](https://qiita.com/sys_zero/items/68deda047c4b50c66458)
5. [リスト型](https://qiita.com/sys_zero/items/82951049466791b2b728)
6. [データテーブル型](https://qiita.com/sys_zero/items/171d73ba24e123dd1b66)
7. カスタムオブジェクト型<今回の記事>

## 注意

- すでに使いこなしているかた向けの記事ではありません。
- Robin言語はあくまでベースであるためPADと異なる部分があります。
- この記事の内容はすべて試していますが公式の見解とは異なる可能性がありますのでご注意ください。
- Power Automateクラウドフローの入出力変数については触れていません。
- 2021年3月の記事です。
- あくまでも個人のまとめです。
- 誤りがありましたらコメントでご指摘いただけると幸いです。
- Robinの公式サイトは2021年4月30日に終了しました。

## カスタムオブジェクト型変数について 

カスタムオブジェクト型変数はJSON形式のデータを読み込んでPADで扱うことのできるようにする変数です。JSONはPADからは単なるテキスト値としか認識しません。カスタムオブジェクト変数に代入することにより「名前（key）と値」としてPADに認識されます。

JSONもカスタムオブジェクトも名前（Key）は必ず文字列です。値は数値、文字、リストやブールなど、ほとんどの型が使えます。
名前と値を：コロンで分離して波括弧｛｝で囲います。この構造がJSON、カスタムオブジェクトの最小単位です。

```JSONObject = {"Name":Value}```
```CustomObject = {'Name':Value}```

JSONは文字列を""ダブルクォーテーションで囲いますがカスタムオブジェクト型では文字列をシングルクォーテションで囲います。「JSONをカスタムオブジェクトに変換」アクションを使った場合、文字列の囲みはシングルクオーテーションに変換されます。逆にカスタムオブジェクトに対して「カスタムオブジェクトをJSON文字列に変換」アクションをつかうとダブルクォーテーションに変換されます。

### 「変数の設定」アクションでカスタムオブジェクトを作成

#### カスタムオブジェクト最小単位
CustomObject1
{'Name':Value}の形式を%で囲むとカスタムオブジェクトになります。くどいようですがカスタムオブジェクトの文字列はシングルクォーテションで囲みます。シングルクオーテーションで囲まれていない文字列は変数として扱われます。変数の設定アクションからこの形式で記述した場合、ダブルクオーテーションは自動的にシングルクオーテーションに変換されます。


![](2021-02-24-20-52-49.png)![2021-02-24-20-52-49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/440e14c4-2bb1-b18b-a4ab-33abb52d294d.png)

![](2021-02-24-20-54-21.png)![2021-02-24-20-54-21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/91d7dcfe-e418-e843-42cd-0c8466ceee0f.png)

#### カスタムオブジェクトに項目を増やす　

CustomObject2
![](2021-02-24-23-03-19.png)![2021-02-24-23-03-19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/9646ddf2-7fb3-cb5a-4149-a5b9ad176c03.png)

![](2021-02-24-23-03-39.png)![2021-02-24-23-03-39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/c761c5d1-8ab2-7627-86cb-859eb908f736.png)

#### カスタムオブジェクトの項目にリスト　

CustomObject3
![](2021-02-24-22-32-20.png)![2021-02-24-22-32-20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/094cb8dd-4f68-f6a3-3d5d-42cdafa5dff1.png)

![](2021-02-24-22-34-41.png)![2021-02-24-22-34-41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/d298854c-f74e-9796-f0bd-3cacf914a950.png)

詳細を表示すると追加したリストの値を表示できます。
![](2021-02-24-22-36-06.png)![2021-02-24-22-36-06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/86f34c46-90de-9879-50f1-33d4895963d4.png)

#### カスタムオブジェクトの入れ子

内容を少し変えたカスタムオブジェクトをもう1個つくります。
CustomObject4
![](2021-02-24-22-39-58.png)![2021-02-24-22-39-58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/c4b28ff2-4008-2c87-f209-7ed5b6fcbe4b.png)


新たに名前にbrother、値としてリスト[CustomObject3,CustomObject4]で入れ子になったカスタムオブジェクトを作成します。CustomObject5
![](2021-02-24-22-50-59.png)![2021-02-24-22-50-59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/095c1e85-d1aa-0ab6-3ce6-b474ffb9e266.png)

![](2021-02-24-22-53-13.png)![2021-02-24-22-53-13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/fef5a160-9d69-1295-5f0d-f46fdedc80a1.png)

詳細を表示すると入れ子になっているのがわかります。
![](2021-02-24-22-54-46.png)![2021-02-24-22-54-46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/f394fb68-aab2-c6d6-efef-f69dbc17ac4f.png)

![](2021-02-24-22-55-06.png)![2021-02-24-22-55-06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/6b2dfb4a-b3cd-7911-b609-5e183b2223a6.png)

#### 値へのアクセス

ichiroのPhone1の値にアクセスする場合のパスは次の通りです。
CustomObject5['brothers'][0]['Phone'][1]
![](2021-02-24-22-59-32.png)![2021-02-24-22-59-32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/ef50f6c0-c195-b41c-7973-387a1afc7b4c.png)

変数ペインから詳細を表示していくことで、どのようなパスで値にアクセスすればよいのか簡単に視認できます。

#### 別の値へのアクセス記述

CustomObject.Name[1]のような書き方でも値にアクセス可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/e414cd85-45da-9e34-9b03-1787c71f63bc.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/78013d3c-8372-28ea-f650-ca217bd54c26.png)

#### カスタムオブジェクト内のリストのカウント

入れ子になっているカスタムオブジェクト内のリストはプロパティ値ではカウントできません。
PADで今のところ唯一使える関数countをつかうこで深い階層のリストをカウントすることができます。
便利な小技です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/de74adad-1477-75c3-bde7-5f1d2a4cf350.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/e7061a59-c28b-2d0f-fd3d-508814b10c34.png)


### カスタムオブジェクトをJSONに変換

PADから他のシステムにJSONを渡す場合カスタムオブジェクトを変換する必要があるかもしれません。。
PADには「カスタムオブジェクトをJSONに変換」アクションがあります。上記CustomObject2のように**入れ子になっていない単純なカスタムオブジェクトであればJSONに変換できる**のですが、~~CustomObject5のようなリストを含んだカスタムオブジェクトは2021年3月時点での自分の環境ではエラーになります。~~

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/f034424c-0e83-2f93-cb3b-abf1ff958ae5.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/bc8884fe-5790-a09d-6cb4-3046fe9f515f.png)

2022年10月時点ではエラーなく出力されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/25818597-9cce-4953-1298-ae47d4acec3d.png)


#### ここからはただのトライ（失敗）です

そこで次のような方法でカスタムオブジェクトをJSONに変換してみようと試みました。
![](2021-02-25-00-46-10.png)![2021-02-25-00-46-10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/00259006-79bc-5a32-cea8-16ddaf19f15d.png)

![](2021-02-25-00-48-10.png)![2021-02-25-00-48-10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/ae76e9d7-df6f-3d21-1eb1-64a55f12ee10.png)

検索するテキストに'シングルクオーテーション
置き換え先のテキストに"ダブルクォーテーション
![](2021-02-25-00-50-00.png)![2021-02-25-00-50-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/55653115-4157-0053-31d3-db6646671c44.png)

VS Codeで開いてみます。
![](2021-02-25-01-53-52.png)![2021-02-25-01-53-52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/864ac27a-b30a-704c-8a66-2acd09704d8b.png)

値のテキスト値にダブルクオーテーションがありません。カスタムオブジェクト内で型は維持をするのですが文字の囲みが戻らないようです。
値が数値であればこの方法が使えそうですが、とりあえず駄目ですね。

ちなみにWinautomationのJSONへの変換アクションではカスタムオブジェクトから整形されたJSONに変換できるのでPADもそのうちなおるかもしれません。（希望）
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/2d9046a3-5473-74c6-aa01-cf47e0008308.png)


失敗ですが記録ということで消さずに載せます。何かの役に立つかもしれないしね。

## 今回のコード  

```
SET CustomObject1 TO { 'Name': 'ichiro' }
SET CustomObject2 TO { 'Name': 'ichiro', 'Age': 30 }
SET CustomObject3 TO { 'Name': 'ichiro', 'Age': 30, 'Phone': ['03-0000-0000', '090-0000-0000'] }
SET CustomObject4 TO { 'Name': 'jiro', 'Age': 25, 'Phone': ['03-0000-0001', '090-0000-0001'] }
SET CustomObject5 TO { 'brothers': [CustomObject3, CustomObject4] }
SET Jiro TO CustomObject5.brothers[1]
SET CountCustomObject TO count(CustomObject5['brothers'][0]['Phone'])
Variables.ConvertCustomObjectToJson CustomObject: Jiro Json=> CustomObjectAsJson
Text.JoinText.Join List: CustomObject5 Result=> JoinedText
Text.Replace Text: JoinedText TextToFind: $'''\'''' IsRegEx: False IgnoreCase: False ReplaceWith: $'''\"''' ActivateEscapeSequences: False Result=> OutJSON
Folder.GetSpecialFolder SpecialFolder: Folder.SpecialFolder.DesktopDirectory SpecialFolderPath=> SpecialFolderPath
File.WriteText File: $'''%SpecialFolderPath%/out.json''' TextToWrite: OutJSON AppendNewLine: True IfFileExists: File.IfFileExists.Overwrite Encoding: File.FileEncoding.UTF8

```

## 今回のまとめ

JSONについては優れた記事がたくさんあるので今更書くことがありませんでした(;´∀｀)

JSON文字列はダブルクオーテーション、カスタムオブジェクトはシングルクオーテーションで囲みます。
PADは「JSON読み込み」>「JSONをカスタムオブジェクトに変換」することで値にアクセスできるようになります
カスタムオブジェクト内の要素はcount関数で数えることができます。
「カスタムオブジェクトをJSONに変換」アクションは今のところリストを含むと上手くいかないようです。

## 全体のまとめ

「変数の設定」アクションばかりの、とても地味な全7回という長い記事最終回です。
私自身は公式ドキュメントだけでは理解できていなかった部分が結構あったように感じます。
Robin言語のドキュメントを読みながら確認したことでいろいろな発見がありました。
何かと何かをつなぐためには、どのように変数を加工して渡すのか、上手に変数と付き合えるようになりたいです。
おわり！