Power Apps と Record/Table型変数 と Collection と JSON のまとめ

この記事は、Microsoft Power Apps Advent Calendar 2022に参加しています。
カレンダー1 の 14日目 です。

# はじめに

Power Apps において、Collection や JSON を利用するケースは様々ですが、主に
* コネクタやAPIからの応答
* Power Automate への連携部分

でのシーンが多いと思います。

とっつきにくい感のあるJSONですが、使いこなすと非常に強力です。

しかし、**Power Apps では、Collection と JSON で扱い方は大きくが異なりますし、Record/Table型変数も存在します。**

この記事では、Power Apps における Record/Table型変数 と Collection と JSON の違いと、作成方法、扱い方について記載します。




# 前提

当記事は、[気ままに勉強会 #32 JSON リターンズ](https://kimamani.connpass.com/event/260131/)で登壇した内容の一部を含みます。
Power Automate をメインに、Power Platform について扱う勉強会になりますので、ご興味ある方は是非ご参加ください。

https://kimamani.connpass.com/

また、当記事では、上記で利用したスライドからスクリーンショットを引用します。
実際のスライドは以下をご覧ください。

https://speakerdeck.com/miyakemito/jsonnituite






# Power Apps における Record/Table型変数 と Collection と JSON

この記事で扱う3種は、どれも構造化データとして扱うことが可能です。

## ① Record/Table型変数

 ``UpdateContext()``，``Navigate()``，``set()`` といった関数を使用し、``[ ]`` や ``{ }`` で囲まれた配列やレコード（ {列名：値} の形状を持つ ）と``Table()``関数でテーブルを代入したもの。
下記、② Collection を代入することも可能。

```
Set(tbl, [ "値1", "値2", "値3" ])
Set(rec, { 列1:"値1", 列2:"値2", 列3:"値3" })
Set(tbl, Table({ 列1:"値1", 列2:"値2", 列3:"値3" },{ 列1:"値4", 列2:"値5", 列3:"値6" }))
Set(tbl, col))
```
代入するデータについて、キー値（列1など）をダブルクォーテーションで囲んではいけません。（JSONではありません）

https://learn.microsoft.com/ja-jp/power-platform/power-fx/reference/function-updatecontext?source=recommendations?wt.mc_id=DX-MVP-5005122

https://learn.microsoft.com/ja-jp/power-platform/power-fx/reference/function-set?wt.mc_id=DX-MVP-5005122


## ② Collection

``Collect()``，``ClearCollect()`` といった関数を使用し、``[ ]`` や ``{ }`` で囲まれた配列やレコード、およびテーブルを代入したもの。
上記、① Record/Table型変数 を代入することも可能。

```
ClearCollect(col, [ "値1", "値2", "値3" ])
ClearCollect(col, { 列1:"値1", 列2:"値2", 列3:"値3" })
ClearCollect(col, { 列1:"値1", 列2:"値2", 列3:"値3" },{ 列1:"値4", 列2:"値5", 列3:"値6" })
ClearCollect(col, rec)
ClearCollect(col, tbl)
```
https://learn.microsoft.com/ja-jp/power-platform/power-fx/reference/function-clear-collect-clearcollect


## ③ JSON

``JSON()``関数を使用し、``[ ]`` や ``{ }`` で囲まれた配列やレコード、およびテーブルを代入したもの。
上記 ① Record/Table型変数 や ② Collection を代入することも可能。
JSON()関数の戻り値は文字列（テキスト）型です。

```
Set(txtJSON, JSON(　[ "値1", "値2", "値3" ] ))
Set(txtJSON, JSON( { 列1:"値1", 列2:"値2", 列3:"値3" } ))
Set(txtJSON, JSON( [ { 列1:"値1", 列2:"値2", 列3:"値3" },{ 列1:"値4", 列2:"値5", 列3:"値6" } ] ))
Set(txtJSON, JSON( rec ))
Set(txtJSON, JSON( tbl ))
Set(txtJSON, JSON( col ))
```
https://learn.microsoft.com/ja-jp/power-platform/power-fx/reference/function-json?wt.mc_id=DX-MVP-5005122






# Record/Table型変数 と Collection

Record/Table型変数 と Collection は似ていますが、以下のような違いがあります。

* Collectionでのみ、``Patch()``， ``Collect()``， ``Update()``， ``Remove()``といったCollection操作関数が動作する
* Collectionでのみ``SaveDate()``， ``LoadData()``が動作する

また、データ代入時にも違いがあります。




## Record/Table型変数 と Collection　の作成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/8fd7d7c2-b3ce-2173-41e4-632b8e43a447.png)

Record/Table型変数 と Collection の作成ルールです

二つのデータ型に対しレコードの形式をもつデータを代入すると、**異なった構造でデータを格納します**。



また、気を付けなくてはいけないのが、カラム名の無い配列（``[ ]``で囲まれる ）をTable型変数やCollectionに格納すると、**"Value"をいうキー値（カラム）が暗黙的に付与される**点です。

:::note info
上図では``set()``関数を例としてますが、``UpdateContext()``，``Navigate()``の場合は、コンテキスト変数の定義方法に従います。
```
UpdateContext( { tbl: [ "値1", "値2", "値3" ] } )
```
:::

# Record/Table型変数 と Collection の操作

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/725fdd51-68b7-20c6-7fde-c6043a693859.png)

Record/Table型変数 に対して、``Patch()``， ``Collect()``， ``Update()``， ``Remove()``といったデータ操作関数の利用はできません。

目的の値を取得する際は下記の記事が役に立つと思います。

https://qiita.com/MiyakeMito/items/ffcc7639b2813dee77ca







# JSON の作成

Power Apps で JSON を作成する場合は、前述のとおり、``JSON()``関数を使用します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/b528daa8-1710-b346-5d9d-37b0e0b5a2a7.png)

上記で Record/Table型変数 と Collection の性質を理解していると、生成されるJSONの内容も理由がわかると思います。



# JSON を扱う

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/147f1e28-2de0-331b-3559-4e758828a4da.png)

待望の``ParseJSON()``関数（Preview段階）を利用し、JSONの各要素の値を取得可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/a379aac6-de16-9b09-c910-b70c0b8786bb.png)

``ParseJSON()``関数は、指定した要素に対し、**型指定されていないオブジェクト**を返すため、明示的に型変換関数を使用する必要があります。
また、テーブルのレコードフィールドには、JSONの解析によりValueという名前のカラムが付与されるため、``Value.[テーブルのカラム名]``を指定します。

https://learn.microsoft.com/ja-jp/power-platform/power-fx/working-with-json?wt.mc_id=DX-MVP-5005122


# さいごに

Record/Table型変数 と Collection そして JSON 似ているようで、少しずつ仕様と動作が異なります。
これらにハマらないように、しっかり仕様を押さえていただければ！