こんにちは、あんこ先生です。
PowerAppsには他アプリと連携できる便利なコネクタがありますよね。
大抵は満足できるのですが、ちょこちょこ制限があってむず痒いことがあります。
例えばOutlookならグループのイベントは取得できない、Plannerのタスク取得は1プラン最新400件までといった具合です。
そんなとき、PowerAutomate経由でHTTP接続すれば様々なデータを取得できます。
しかし、PowerAppsにテーブル型で値を返そうとするとプレミアムプラン(有償プラン)を使う必要があります。
そしてそのプレミアムプランを利用するには、偉い人を説得するといった金銭コスト以上の大仕事が待っています。
正直そんなことはやっていられません。
そこで、今回はPowerAutomate経由の値をJSON文字列で取得して、テーブルとして扱う方法を画像とコード付きで解説します。
ちょっと使い方にクセがありますが、追加でお金も説得も必要ないのでオススメです。
Contents
文字列をテーブル変換するParseJSON関数の使い方
ParseJSON関数とは
はじめに、ParseJSON関数は実験段階の機能です。
実験段階の機能は、今後仕様が変更される可能性があることを留意してください。
このParseJSON関数は、有効なJSON文字列を解析し、型指定されていないオブジェクトを返します。
この型指定されていないというのが特徴で、使用する都度データ型を明示的に変換する必要があります。
ParseJSON関数を有効にする
ParseJSON関数はそのままでは使用できません。
使用するには設定からParseJSON関数の機能を有効にする必要があります。
あらかじめ設定しておきましょう。
ParseJSON関数の指定方法
基本的な記述方法はプロパティにJSON文字列を指定するだけです。
//JSON文字列を参照する場合
ParseJSON(JSON文字列)
//ギャラリーのソースとして利用する場合
Table(ParseJSON(JSON文字列))
PowerAutomateからJSON型文字列を取得する
テストデータはOutlookから甘党の極みグループのイベント情報(A会議・B会議)を取得してPowerAppsに返します。
グループのイベントはOutlookコネクタでは対応していないため、PowerAutomate経由で取得します。
PowerAutomateの全体像
ステップごとに作成方法を解説するとそちらがメインの記事になってしまうので重要な部分のみ記載します。
HTTP要求です。詳細は公式サイトでご確認ください。
グループのイベント情報をリクエストし、JSON文字列で取得します。
その後、PowerAutomateで扱えるようJSONの解析を行います。
選択から、欲しい情報を絞り込みます。
マップの左側が列名、右側がそこに格納する値と思ってください。
今回はイベント名(subject)、イベント開始日(start)、イベントid(id)の3つを抽出します。
選択のアウトプットはテーブル型なので変数を経由して文字列にします。
それをアプリに返します。
アプリからPowerAutomateを起動する
まず、アプリにフローを登録します。
画面左側にPowerAutomateのアイコンがあるのでそこから登録できます。
アプリ編集中にフローを更新した場合、再読み込みしないと古い内容で実行されるので注意してください。
フローの登録ができたら、適当なボタンなどに下記コードを記載して実行します。
フローを実行するだけならフロー名.Run()のみの記載で動きます。
今回は値を返させるのでそれをコレクションに保存させるため、ClearCollect関数で囲んでいます。
//値をフローに渡さない場合
ClearCollect(colFlow,グループイベント取得.Run());
//指定日以降のイベントを取得するなど値をフローに渡す場合
ClearCollect(colFlow,グループイベント取得.Run(Text(DateAdd(Today(),-1,Days),"yyyy-mm-dd")&"T00:00:00"));
これを実行すると下図のように文字列がコレクションに格納されます。
ちゃんと必要な情報が抜けてますね。
ParseJSON関数でテーブルに変換する
ようやく準備も整ったので、JSON文字列で取得したイベント情報をギャラリーに展開します。
冒頭でも記載しましが、ParseJSON関数は、型指定されていないオブジェクトを返します。
コード記述も特徴があるので、そのあたりを解説していきます。
ギャラリーに展開する
さっそく特徴がありすぎる記載になります。
ParseJSON関数はプロパティにJSON文字列を指定します。
まずJSON文字列を格納したコレクションはテーブル型のため、First関数で1行目をレコード型で抽出し、json列を指定します。
これをギャラリーに指定すれば展開されるかと思いきや、データ型が不明であるとエラーが返されます。
これはParseJSON関数が、型指定されていないオブジェクトを返すためです。
そのため、いったんTable関数で囲みテーブル型に変換したものをギャラリーに指定します。
Table(ParseJSON(First(colFlow).json))
ギャラリーテンプレートを設計する
ここもセオリー通りにはいきません。
まず、先ほどTable関数で囲んだため、すべてValue列の入れ子扱いになります。
さらに型がないため、使うたびに指定が必要です。
例えばイベント名を格納したSubjectは、Text関数で文字列であることを明示しなければなりません。
開始日のstartであれば、Text関数の他にDateValue関数でも扱えます。
このように、必ず型を指定することに留意して利用しましょう。
ギャラリーのデータ構造
ギャラリーのAllItemsをコレクションに落として中身を確認してみました。
親階層のValue列は何もありませんね。
おそらく型指定されていないためと思われます。
そのため、コード記載時にも候補が表示されないんでしょうね。
余談│ParseJSON関数を使わない場合
ParseJSON関数がなかったころは、ForAll関数やSubstitute関数などを使って地道に変換していました。
この作業から解放されるので、ぜひ使い方をマスターしましょう!
Clear(colEvent);Clear(colEventTmp);
ForAll(
//総当たりで文字列置き換え&テーブル化
Split(
Substitute(
Substitute(
Substitute(
Substitute(
Substitute(
Substitute(First(colFlow).json ,"""",""),
"[{subject:",","),
"start:",""),
"}",""),
"id:",""),
",{subject:",","),
","),
//インデックス付与してコレクション化
Collect(colEventTmp,
{
Index:CountRows(colEventTmp), //連番付与
Result:Result
}
)
);
//レコード化
ForAll(colEventTmp,
If(Mod(ThisRecord.Index,3)=0,
With({cnt:CountRows(colEvent)*3},
Collect(
colEvent,
{
subject:LookUp(colEventTmp,Index=(cnt)+1).Result,
start:DateValue(LookUp(colEventTmp,Index=(cnt)+2).Result),
id:LookUp(colEventTmp,Index=(cnt)+3).Result
}
)
)
)
);
文字列をテーブル変換するParseJSON関数の使い方のまとめ
今回は、文字列をテーブル変換するParseJSON関数の使い方を紹介しました。
型が指定されていないという新しい概念が含まれること、テーブル化しないとギャラリーで使えないことなどクセが強いです。
実際に手を動かして触ってみないと理解は難しいです。
それでも有償プランを使わずHTTP要求データを手軽に扱えるのは特筆すべき強みです。
各種コネクタが優秀なので、なかなか出番がないかもしれませんが、こんなことができるよってのは覚えておいてください。
いつかきっと役に立ちますよ。
イベント開始日などの日時データは時間が含まれています。
不要な場合は関数であらかじめ除外しておくと扱いしやすいですよ。