ユーザー定義型(User Defined Type:UDT)が試験段階機能で追加!ParseJSONも更新され型定義に使える!

はじめに

2024/10月の更新情報でYouTubeビデオ「Power Apps Pulse October 2024」を見ていたら
ユーザー定義型(UDT)が新たに追加されたことを確認しました!(現状はまだ試験段階です)
さっそく試したところ、かなり使い勝手が良い機能と思いましたので記事にしてみました。

この記事は、Microsoft Power Apps Advent Calendar 2024 12月7日担当分の記事です。

NOTE!本機能は試験段階のため今後更新や挙動変更となる可能性が十分あります。実運用アプリへの適用などはお勧めできないため、用途に合わせてご利用ください。

ユーザー定義型の機能オン(新しい分析エンジンもオンが必要)

既定ではオフになっているので、機能をオンにする必要があります。
また、本機能をオンにするには「新しい分析エンジン」も併せてオンとする必要があります。

  • 設定>更新>新規で「新しい分析エンジン」をオン
  • 設定>更新>試験段階で「ユーザー定義型」をオン
    ※ダイアログでOKをクリック

また、オンにした後にアプリを再起動する必要がありますので、一旦アプリを保存してから再起動してください。

NOTE※新しい分析エンジンをオンにすると以前と挙動が変わったりエラー発生するケースもあるので、変更する際は十分動作確認ください

TIPS以前から試験段階にある機能「ユーザー定義関数」についてはユーザー定義型の利用にあたっては必須ではありません。今回はユーザー定義型のみ説明していますので、気になる方はコルネさんの記事などご参考ください。
【Power Apps】Preview機能で追加されたユーザー定義関数(UDF)を試してみる – コルネの進捗や備忘録が記されたなにか

オンにした後には再起動を行う。

ユーザー定義型(UDT)

現時点(2024/11月末)ではドキュメント系での更新が確認出来てないので、上記YouTubeの動画と実際の動きをもとにした検証となりますのでご容赦ください。今後変更となっていく可能性も十分あります。

NOTEユーザー定義型について、現時点ではドキュメントの更新は確認できてりません。
伴いParseJSON関数も引数が増えているのですが、そちらも更新されておらず。
そのうちにそれぞれドキュメントの更新や展開があると思われます。

App.Formulasにユーザー定義型を定義する

定義する場所はユーザー定義関数と同じくApp.Formulasとなります。

書式は以下の感じのようです(動画からの推測と実装サンプルより)
レコード型の場合とテーブル型の場合とサンプルを用意しました。

  • ユーザー定義型名を付けて半角スペース、そのあとに「 := 」を付けます
  • そのあとに「Type( ) 」を付けます。この中に型を定義します
  • 列名を指定して「 : 」の後に型名を指定します。用意されている型は以下の10種のようです。(ユーザー定義関数同様)インテリセンスで表示されます。
  • 末尾にはセミコロン「;」を付けます。

Code【書式:レコード形式の場合】
<ユーザー定義型名> := Type({<列名>  :  <型名>, ・・・・・});
【書式:テーブル形式の場合】
<ユーザー定義型名> := Type([{<列名>  :  <型名>, ・・・・・}]);
※大枠が[]で囲まれている違い

App.Formulas に定義するサンプル
【レコード形式のサンプル】
SampleDef := Type({ID:Number, Value:Text, Flag:Boolean});
【テーブル形式のサンプル】
JSONDef := Type([{No:Number, 名前:Text, 単価:Number, 数量:Number, 合計:Number}]);

ParseJSONで利用する(第2引数で指定)

上記のようにユーザー定義型を定義したら、ParseJSONの第2引数で指定が出来ます!

NOTE※11・28確認時点ではParseJSONのリファレンスには更新反映しておりませんでした。そのうちに反映されると思います。
ParseJSON 関数 – Power Platform | Microsoft Learn

以下レコード型で定義した「SampleDef」をJSON文字列をParseJSONで囲って、第2引数に指定した例です。
指定した型で

Code//JSON文字列で作ったデータをParseJSONで型指定して、そのうちのValue列を表示
ParseJSON(“{“”ID””:10,””Value””:””テスト文字列です!!!””,””Flag””:true}” ,SampleDef ).Value

ラベルに表示してみると、指定したテキスト型でちゃんと出力されていますね。

誤った型の場合はエラーを表示してくれる

上記定義に合わせた内容で型指定して取ってくれますが、試しにJSON文字列を別の型にした場合は以下のようなエラーが出てくれます。親切です!

定義していないデータがある場合はエラーとなる

ユーザー定義型で定義していないデータを含む情報をParseJSONした場合、以下のようにエラーが発生しました。レコードやテーブルの場合は型はちゃんと合わせて定義が必要なようです。
※自由度を上げるために無視してくれる方が個人的にはうれしいですが、そのうち変わったりしないかな?

定義に含まれるデータがない場合は空白となる

含まれない項目は空白とされます。※必須とか定義しているわけではないので想定通りの挙動かと

ParseJSONで利用する:テーブル形式の場合

テーブル形式も同じですが、以下のように型とあってればちゃんと型を特定して表示してくれます!
クラウドフローからの応答(HTTP応答でない方)で受け取った値だったり、JSON文字列としてSPOの複数行列に入れたものをキャストする場合などに超便利です!

以下ではサンプルで作ったSPO複数行列(明細情報列)にテーブル形式で明細(No、名前、単価、数量、合計)×複数行でJSON文字列として登録、それをParseJSONで戻して同じコントロールに表示している例です。

TIPSこの部分の実装概要はちょっと長くなったため、別記事でご紹介します。

テーブル形式のデータをフォームのテーブル情報に保持してSPO複数行列にJSON格納するサンプル

従来だとForAllして型定義、列名.Valueからの調整が必要だったのがとてもスマートに!

ユーザー定義型を使わない場合、ParseJSONをすると定義されていないオブジェクト型で取得されます。
単純に表示するレベルであればそのまま(自動型推測)でギャラリー表示なども出来るのですが、型を正しく指定するにはForAllしてキャスト(型指定)する必要がありました。
さらにやっかいなのがそのままだと、<列名>.Value という形式で取れるので、この.Valueの部分が通常の型と合わないのでそのままギャラリーに戻すなどの際に事前に調整する必要がありました。

ParseJSONの公式は以下参照ください。
ParseJSON 関数 – Power Platform | Microsoft Learn

以下は上記のサンプルアプリでそれぞれ実装した場合の比較です。同じ事が出来ますが、出来ればユーザー定義型を使いたいところですね。早くプレビュー、GAしてほしいですね!

Code//ユーザー定義型を利用したサンプルの場合
ClearCollect(meisaiCol,ParseJSON(LookUp(UDF検証用,ID=ThisItem.ID,明細情報JSON),JSONDef));

//ForAllでテーブル化して型指定、再定義し直したサンプルの場合
ClearCollect(meisaiCol2,
    ForAll(Table( ParseJSON(LookUp(UDF検証用,ID=ThisItem.ID,明細情報JSON)) ) As j ,
        { No:Value(j.Value.No),名前:Text(j.Value.名前),単価:Value(j.Value.単価),数量:Value(j.Value.数量),合計:Value(j.Value.合計)}
  )
);

TIPS

TIPS比較するとものすごくスマートになっていますし、ループ処理(それほど負荷ないらしいが)も不要でパフォーマンスもよさそうですね。メンテナンス性の面でも完全にユーザー定義型がいいと思います。
※ただし現時点試験段階なので、プレビューやGAまでは待つのが安全かとは思います

フロー返却値(JSON文字列)をユーザー定義型でParseJSON

その他、よくある例としてフローでなんらかの処理を行い返却値を受け取る場合の利用があるかと思います。
有償版の場合はHTTP応答コネクタでJSONをそのままコレクションに格納することが出来ますが、Basicライセンスの場合は使えませんので、JSON文字列を返却してアプリ側でParseJSONをして利用します。
こちらの場合もユーザー定義型で使えば扱いが楽かなと思います。簡単なサンプルを作ってみました。

NOTE前途したとおり、定義にない列が返却される場合はエラーとなるのでケースバイケースですかね

サンプルのフローを作成してJSON文字列でアプリへ返却

以下サンプルとしてユーザープロフィールをフローで取得してアプリへ返却するサンプルです。
※サンプル用にフローで取っているだけでアプリ側で取れる情報なので、実際の利用では別のデータとして考えてもらえればと思います。

マイ プロフィールの取得アクションで必要な列を定義して取得しています。
※指定しないと多数の項目が取れるため必要なものに絞ってます。

それをそのままアプリ側へ返却しています。

App.Formulasにユーザー定義型を定義

上記戻り値に合わせたユーザー定義型をApp.Formulasに追加します。

Code//サンプルフロー用のJSON型定義:ユーザー情報系
FLOWDef := Type({‘@odata.context’:Text, id:Text, displayName:Text, mail:Text, department:Text, mySite:Hyperlink});

NOTE※戻ってくる型を定義する必要があるため利用はしませんが 「@odata.context」も定義しています。
こちらは@やドットが含まれるためシングルクォーテーションで囲って定義します

アプリ側でフローを起動、戻り値をUDTを使いParseJSONで解析

アプリ側ではフローを実行し、結果の戻り値を(比較用に一旦)FlowResult という変数に入れています。
その後に上記をユーザー定義型を使ってParseJSONしています。

CodeSet(FlowResult, UDT検証用フロープロフィール取得.Run());
Set(FlowResultAfter,ParseJSON(FlowResult.result,FLOWDef));

→比較用のために分けているので、以下のように直接ParseJSONしちゃってもよい
Set(FlowResultAfter,ParseJSON(UDT検証用フロープロフィール取得.Run().result,FLOWDef));

各項目を表示するようにテキストコントロールを用意しています。
それぞれのValueには「FlowResultAfter.displayName」、「FlowResultAfter.mail」のように対応する項目を定義してます。

各テキストには上記のように戻り値.項目名で対応する値を指定

フローを実行すると以下のようになります。
JSON文字列をそのまま入れた変数は文字列として格納されています。

それをユーザー定義型でParseJSONした後が以下です。ちゃんと型定義されたレコード値となっています。

テキストには各情報を指定した内容が表示されます。

TIPS表示のみであれば、通常のParseJSONのみでも自動型推測してくれるので型指定不要なケースもあります。
その後にデータソースに登録したりする場合はこのようにした方が扱いやすいですね。

おわりに

今回は新たに追加されたユーザー定義型(UDT)について概要記載しました。
次回記事では上記のサンプル(SPOへJSON文字列で保持)の概要について書こうと思います。

また、こちらのUDTですが、コレクションの型定義(空データで)も使えそうだったので、その点も別記事に上げたいと思います。

ユーザー定義関数(UDF)もそうですがこの辺ずっと試験段階に残るイメージなので、、出来れば早くGAしてほしい機能ですね!それでは!

関連記事

関連ポスト

この記事は役に立ちましたか?

もし参考になりましたら、下記のボタンで教えてください。

ヨウセイ

ヨウセイ

一般職からSharePoint、C#、.NET系技術者へ、そこからPower App、Power Automate技術者へと転身。 ワンランク上のおっさんはPower Appsでシステム開発が出来る〜! qiitaや自社HPでも技術ブログを書いていました。

関連記事

コメント

この記事へのコメントはありません。

CONTENTS