この記事は、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 リターンズで登壇した内容の一部を含みます。
Power Automate をメインに、Power Platform について扱う勉強会になりますので、ご興味ある方は是非ご参加ください。
また、当記事では、上記で利用したスライドからスクリーンショットを引用します。
実際のスライドは以下をご覧ください。
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ではありません)
② 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)
③ 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 ))
Record/Table型変数 と Collection
Record/Table型変数 と Collection は似ていますが、以下のような違いがあります。
- Collectionでのみ、
Patch()
,Collect()
,Update()
,Remove()
といったCollection操作関数が動作する - Collectionでのみ
SaveDate()
,LoadData()
が動作する
また、データ代入時にも違いがあります。
Record/Table型変数 と Collection の作成
Record/Table型変数 と Collection の作成ルールです
二つのデータ型に対しレコードの形式をもつデータを代入すると、異なった構造でデータを格納します。
また、気を付けなくてはいけないのが、カラム名の無い配列([ ]
で囲まれる )をTable型変数やCollectionに格納すると、"Value"をいうキー値(カラム)が暗黙的に付与される点です。
上図ではset()
関数を例としてますが、UpdateContext()
,Navigate()
の場合は、コンテキスト変数の定義方法に従います。
UpdateContext( { tbl: [ "値1", "値2", "値3" ] } )
Record/Table型変数 と Collection の操作
Record/Table型変数 に対して、Patch()
, Collect()
, Update()
, Remove()
といったデータ操作関数の利用はできません。
目的の値を取得する際は下記の記事が役に立つと思います。
JSON の作成
Power Apps で JSON を作成する場合は、前述のとおり、JSON()
関数を使用します。
上記で Record/Table型変数 と Collection の性質を理解していると、生成されるJSONの内容も理由がわかると思います。
JSON を扱う
待望のParseJSON()
関数(Preview段階)を利用し、JSONの各要素の値を取得可能です。
ParseJSON()
関数は、指定した要素に対し、型指定されていないオブジェクトを返すため、明示的に型変換関数を使用する必要があります。
また、テーブルのレコードフィールドには、JSONの解析によりValueという名前のカラムが付与されるため、Value.[テーブルのカラム名]
を指定します。
さいごに
Record/Table型変数 と Collection そして JSON 似ているようで、少しずつ仕様と動作が異なります。
これらにハマらないように、しっかり仕様を押さえていただければ!