Slide 1

Slide 1 text

JSONと Power Automateと Power Apps 気ままに勉強会 #32 1

Slide 2

Slide 2 text

今日の目標 JSONと配列 コワクナイヨー 2

Slide 3

Slide 3 text

アジェンダ Power AutomateでJSONや配列と仲良くなると JSONとは Power Automate での JSON Power Apps での JSON 3

Slide 4

Slide 4 text

Miyake Mito @MiTo60448639 https://qiita.com/MiyakeMito 株式会社アイシーソフト Technical Manager www.icsoft.jp https://speakerdeck.com/ miyakemito 4

Slide 5

Slide 5 text

Power Automate と Power Virtual Agents で ゲームを作ってます ⚫ オセロ ⚫ 神経衰弱 ⚫ どうぶつしょうぎ ⚫ WORDL 5

Slide 6

Slide 6 text

本日の参考サイト 6 ■ Hiroさん JSONと仲良くなるために (まとめ) https://mofumofupower.hatenablog.com/entry/2020/09/04/190039 Power Automate で JSONの値を取得する 3 (+1) の方法 https://mofumofupower.hatenablog.com/entry/json_value Convert JSON data in Power Apps without Premium license https://mofumofupower.hatenablog.com/entry/2022/09/07/201957 ■ コルネさん Power AppsでJSONがパースできるようになりました!(Preview) https://koruneko.hatenablog.com/entry/2022/09/07/195521

Slide 7

Slide 7 text

免責事項 当スライドは、 2022年9月現在のバージョンでの情報です 今後のアップデート等により、 仕様変更する可能性があります また、私の見解による内容が含まれます 間違いなどありましたらご指摘ください 7

Slide 8

Slide 8 text

Power Automateで JSONや配列と 仲良くなると

Slide 9

Slide 9 text

Power AutomateでのJSON トリガーの Input と Output は JSON です 9

Slide 10

Slide 10 text

アクションの Input と Output も JSON です 10

Slide 11

Slide 11 text

どう活用できるの? 目的の値がダイレクトに取得できる triggerBody()?['events']?[0]?['message']?['type'] 11

Slide 12

Slide 12 text

実行速度が遅い Apply to each を利用したくない時 outputs('開始して承認を待機')?['body']?['responses']?[0]?['responder']?['email'] ダイレクトにコンテンツのを取得することで ループ処理を回避できます 承認者は一人なのに、 自動でApply to each になってしまう 12

Slide 13

Slide 13 text

➢ 例えば、SPOの「アイテムが作成または変更されたとき」から、 「作成」時のみを条件にしたいとき トリガーの実行条件を絞りたいとき トリガーの実行条件を 設定できます ■ トリガーの実行条件を絞れるので、フローの実行回数が節約できます @equals(triggerBody()?['Created'],triggerBody()?['Modified']) 13

Slide 14

Slide 14 text

Adaptive Cards のカスタマイズ JSONの構造が分かると、 カスタマイズし放題です 14

Slide 15

Slide 15 text

JSON とは

Slide 16

Slide 16 text

JSONとは { "名前": "アメリカ合衆国", "地区": "北アメリカ", "地理": { "首都": "ワシントンD.C.", "面積": 9834000, "人口": 331003000, "主要都市": [ {"名前": "ニューヨーク", "人口": 17799861}, {"名前": "ロサンゼルス", "人口": 11789487}, {"名前": "シカゴ", "人口": 8307904}, {"名前": "ホノルル", "人口": 718182} ] }, "言語": [ "英語", "フランス語", "ハワイ語", "スペイン語" ], "渡航歴": true } 16 ◼ 「JavaScript Object Notation」の 略称で、JavaScript オブジェクト表 記法によるデータ記述形式 ✓ テキストベースで軽量なデータ ✓ 人間にとってわかりやすい構造 ✓ 記載ルールが決まっているためコン ピュータも読み書きしやすい ✓ 様々なプログラム言語で利用できる ✓ REST APIで扱われる形式

Slide 17

Slide 17 text

名前,地区,首都,面積,人口 アメリカ合衆国,北アメリカ,ワシントンD.C.,9834000 イタリア共和国,ヨーロッパ,ローマ,302780,60462000 日本,アジア,東京都,377973,1261406099 17 CSV <国> <名前>アメリカ合衆国名前> <地区>北アメリカ地区> <地理> <首都>ワシントンD.C.首都> <面積>9834000面積> <人口>331003000人口> 地理> 国> XML { "名前": "アメリカ合衆国", "地区": "北アメリカ", "地理": { "首都": "ワシントンD.C.", "面積": 9834000, "人口": 331003000 } } JSON JSON は ✓見やすく ✓書きやすく ✓加工しやすい のです 他のテキストフォーマットデータと比較

Slide 18

Slide 18 text

JSONのルール:その1 1. 「キー」と「値」で構成され、コロンで繋げます 2. 「キー」はダブルクオーテーションで囲みます 3. 「キー:値」はカーリーブラケットで囲みます { "名前" : "アメリカ合衆国" } 18

Slide 19

Slide 19 text

{ "名前": "アメリカ合衆国", "地区": "北アメリカ", “地理": { "首都": "ワシントンD.C.", "面積": 9834000, "人口": 331003000 }, "言語": [ "英語", "フランス語", "ハワイ語", "スペイン語" ], "渡航歴": true } JSONのルール:その2 4. 複数「キー:値」が並ぶときは、カン マで区切ります 5. 「値」には以下の型が設定できます ① 文字列 ② 数字 ③ Boolean型(true/false) ④ オブジェクト ⑤ 配列 ⑥ null 今のところ null は [JSONの解析]アクションで エラーになります 19

Slide 20

Slide 20 text

JSONのルール:オブジェクト ➢ 「キー:値」はオブジェクト ➢ 「キー」に対し「キー:値」(オブ ジェクト)を「値」として設定できる ➢ オブジェクトを入れ子にすると構造は 階層化しますが、情報がグループ化さ れ意味付けがされます ➢ データを取得する際は、 [‘上位キー’]⇒[‘下位キー’] と階層を ネストしながら指定します { "地理": { "首都": "ワシントンD.C.", "面積": 9834000, "人口": 331003000 } } 21 JSONを階層化し、 複雑にする要因 その1

Slide 21

Slide 21 text

配列とは • 変数が複数つながり、同一型の複数データを連続的に並べたデー タ構造です • それぞれの箱は、配列の「要素」と呼ばれます • また配列の要素には、「添え字」という番号が割り当てられてい ます • 要素の数は動的です 変数 0 1 2 3 4 5 22

Slide 22

Slide 22 text

JSONのルール:配列 ➢ ブラケットで囲み、各アイテム(要素)はカンマで区切ります ➢ データを取得する際は、添え字(何個目のデータ)を指定します ➢ Power Automateでは添え字を0から、Power Appsでは1から数えます ➢ 各要素は、オブジェクトで指定することも可能です ➢ 文字列も複数文字の連続(=配列)として解釈できます "言語": [ "英語", "フランス語", "ハワイ語", "スペイン語" ] "主要都市": [ {"名前": "ニューヨーク", "人口": 17799861}, {"名前": "ロサンゼルス", "人口": 11789487}, {"名前": "シカゴ", "人口": 8307904}, {"名前": "ホノルル", "人口": 718182} ] 23 JSONを階層化し、 複雑にする要因 その2

Slide 23

Slide 23 text

JSONの階層化 { "名前": "アメリカ合衆国", "地区": "北アメリカ", "地理": { "首都": "ワシントンD.C.", "面積": 9834000, "人口": 331003000, "主要都市": [ {"名前": "ニューヨーク", "人口": 17799861}, {"名前": "ロサンゼルス", "人口": 11789487}, {"名前": "シカゴ", "人口": 8307904}, {"名前": "ホノルル", "人口": 718182} ] }, "言語": [ "英語", "フランス語", "ハワイ語", "スペイン語" ], "渡航歴": true } こんなJSONから、 Power Automate と Power Apps で 目的の「キー」に対する 値を取得する方法を説明 します 24

Slide 24

Slide 24 text

Power Automate での JSON

Slide 25

Slide 25 text

Power Automate での JSON ■ JSON の作成 ➢ 変数等にJSON を入力する ➢ json()などの関数 ■ JSON を参照する ➢ 「JSONの解析」アクションで、動的にコンテンツが取得できる ➢ JSON から、ダイレクトにコンテンツが取得できる 27

Slide 26

Slide 26 text

JSON を作る ① ■ 「データ操作」-「作成」 outputs('作成')?['地理']?['主要都市']?[0]?['名前'] 「JSONの解析」なしでも ↑のようにで取得できます 28 outputs('作成')?[0]

Slide 27

Slide 27 text

JSON を作る ② ■ 「変数を初期化する」 全体が { } で囲まれている ⇒ オブジェクト 全体が [ ] で囲まれている ⇒ アレイ 29 variables('JSONObject')?['地理']?['首都'] variables('JSONObject')?[0]?['地理']?['首都']

Slide 28

Slide 28 text

JSON を作る ③ ■ 関数 30 array() createArray() ➢ 配列を作る range() ➢ JSON を更新する addProperty() setProperty() removeProperty() json() json(concat(…))

Slide 29

Slide 29 text

目的の値を取得 – JSON の解析 「データ操作」-「JSONの解析」でJSONテキストの各プロ パティを動的なコンテンツとして取得できます 31 項目が参照できる JSON ペイロード を貼付け 変数の型も識別 してくれます

Slide 30

Slide 30 text

目的の値を取得 - アクション JSON Pretty Linter (https://lab.syncer.jp/Tool/JSON-Viewer/) ① 実行履歴の未加工出力の表示を JSON Pretty Linter へ貼付けする 32

Slide 31

Slide 31 text

outputs('開始して承認を待機’)? ['body']?['responses']?[0]?['responder']?['displayName'] ② ビューアーで[Path]を有効化し、 目的の値のパスをクリック object['body']['responses'][0]['responder']['displayName'] ③ 「Object」 を 「outputs('Action名')? 」に置換する ④ ブラケット間に”?”を挿入 33 オプション

Slide 32

Slide 32 text

trigger()?['body']?['body']?['content'] ③ ブラケット間に”?”を挿入 目的の値を取得 - トリガー編 ① 実行履歴の 未加工出力の表示を JSON Pretty Linter貼付けする ② 「Object」を「trigger('Trigger名')?」に 置換する object['body']['body']['content'] 34 オプション

Slide 33

Slide 33 text

variables('CountryInformation')?[0]?['名前'] object[0]['名前'] ② 「Object」を「variables('変数名')? 」に置換する ③ ブラケット間に ”?” を挿入 目的の値を取得 - 変数編 ① 変数で入力した値をJSON Pretty Linter貼付けする 35 オプション

Slide 34

Slide 34 text

配列を参照する ① ■ 配列から要素を一つだけ取り出す outputs('アクション名')?[0] ➢ 添え字で指定する 添え字を指定するときは 「 ' ' 」(シングルクオーテーション)で囲まない 36 first() ➢ 最初の要素を取得する last() ➢ 最後の要素を取得する

Slide 35

Slide 35 text

配列を参照する ② ■ 配列から複数の要素を取り出す ➢ Apply to each 37 ➢ 関数 skip() take() intersection() union() …など item() でも可 split() ➢ [データ操作]コネクタ

Slide 36

Slide 36 text

目的の値を取得 38 { "名前": "アメリカ合衆国", "地区": "北アメリカ", "地理": { "首都": "ワシントンD.C.", "面積": 9834000, "人口": 331003000, "主要都市": [ {"名前": "ニューヨーク", "人口": 17799861}, {"名前": "ロサンゼルス", "人口": 11789487}, {"名前": "シカゴ", "人口": 8307904}, {"名前": "ホノルル", "人口": 718182} ] outputs('Action名') or trigger('Trigger名') or variables('変数名') ?['地理'] ?['主要都市'] ?[2] outputs('Action名')?['地理']?['主要都市']?[2]?['人口'] ?['人口'] 階層のつなぎとなる"?"は、 "."(ドット)や"/"(スラッシュ)や 無しでも記載できますが、動作が変 わります。詳しくは https://mofumofupower.hatenablog.co m/entry/json_value ➢ シカゴの 人口は?

Slide 37

Slide 37 text

Power Apps での JSON

Slide 38

Slide 38 text

Power Apps での JSON ■ JSON の作成 ➢ JSON() 関数で、Collection や 変数(レコード型、テーブル型)を JSON に変換できる ■ JSON を参照する ➢ Power Automate で 解析する ➢ JSON を ParseJSON() 関数で解析(実験的な機能) ➢ IsMatch(),MatchAll()と正規表現で解析する方法もある ➢ カスタムコネクタの応答 は Collection(TableやRecord)で扱える 40

Slide 39

Slide 39 text

Power Apps で JSON を作成 ■ JSON() 関数 – Collection や 変数(テーブル、 レコード)を JSON に変換できる Set( txtJSON, JSON( colJSON )) ClearCollect( colJSON, { 国: "アメリカ合衆国", 地理: { 首都: "ワシントンD.C.", 面積: 9834000, 人口: 331003000 } }, { 国: "イタリア共和国", 地理: { 首都: "ローマ", 面積: 302780, 人口: 60462000 } } ); [{"国":"アメリカ合衆国","地理":{"人口":331003000,"面積 ":9834000,"首都":"ワシントンD.C."}},{"国":"イタリア共和国"," 地理":{"人口":60462000,"面積":302780,"首都":"ローマ"}}] Power Automate へ、データ構造を維持しながら パラメータを渡すことができます 41

Slide 40

Slide 40 text

JSON関数の動き ➢ 配列 ➢ レコード [ "値1", "値2", "値3" ] JSON() 関数の結果 { 列1:"値1", 列2:"値2", 列3:"値3" } 1つまたは複数の「キー:値」で構成 ➢ テーブル { 列1:"値1", 列2:"値2", 列3:"値3" }, { 列1:"値4", 列2:"値5", 列3:"値6" } 複数のレコードで構成 42 [ { "Value": "値1" }, { "Value": "値2" }, { "Value": "値3" } ] [ { "列1": "値1", "列2": "値2", "列3": "値3" } ] [ { "列1": "値1", "列2": "値2", "列3": "値3" }, { "列1": "値4", "列2": "値5", "列3": "値6" }, ] 値のみの配列 暗黙的に、"Value"というキーが付与される JSON() JSON() JSON() { "列1": "値1", "列2": "値2", "列3": "値3" } コレクションから 変数から

Slide 41

Slide 41 text

配列を操作/参照する ■ コレクションや変数に格納する ➢ 配列 ➢ レコード ClearCollect(col, [ "値1", "値2", "値3" ]) 暗黙的に"Value"というカラムが 付与されたテーブル型になる 43 ClearCollect(col, { 列1:"値1", 列2:"値2", 列3:"値3" }, { 列1:"値4", 列2:"値5", 列3:"値6" }) Set(tbl, Table({ 列1:"値1", 列2:"値2", 列3:"値3" }, { 列1:"値4", 列2:"値5", 列3:"値6" })) Set(tbl, [ "値1", "値2", "値3" ]) ClearCollect(col, { 列1:"値1", 列2:"値2", 列3:"値3" }) Set(Rec, { 列1:"値1", 列2:"値2", 列3:"値3" }) ➢ テーブル { "列1": "値1", "列2": "値2", "列3": "値3" } [ { "列1": "値1", "列2": "値2", "列3": "値3" } ] JSON() JSON() Value 値1 値2 値3 列1 列2 列3 値1 値2 値3 名前 値 列1 値1 列2 値2 列3 値3 列1 列2 列3 値1 値2 値3 値4 値5 値6 引数がレコードの場合は、Record型に格納される

Slide 42

Slide 42 text

配列を操作/参照する ■ コレクションのレコードを編集 – Patch(),Update(),UpdateIf() 44 ■ コレクションのレコードを削除 – Remove(),RemoveIf() ■ コレクションの値を参照 – Filter(),Search() ,LookUp(),Index() ,First() などで、 行(レコード)を特定し、[.列(カラム)]で列を指定 ■ コレクションにレコードを追加 – Patch() ,Collect() Index(col, 2).列2 Lookup(col, 列1="値1").列2 ForAll() を組み合わせると さらに複雑な操作が可能です Power AppsでもJSONと仲良くなるために https://qiita.com/MiyakeMito/items/ffcc7639b2813dee77ca

Slide 43

Slide 43 text

■ Power Automate から「要求」コネクタ-「応答」 – 複雑なJSONのデータを解析済みで扱える [応答]アクションは プレミアムコネクタです [ { "名前": "アメリカ合衆国", "地区": "北アメリカ", "地理": { "首都": "ワシントンD.C.", "面積": 9834000, "人口": 331003000, "主要都市": [ { "名前": "ニューヨーク", "人口": 17799861 }, { "名前": "ロサンゼルス", "人口": 11789487 }, { "名前": "シカゴ", "人口": 8307904 }, { "名前": "ホノルル", "人口": 718182 } ] Power Apps で JSONを解析 45 JSONペイロードを 張り付け Power Apps には ➢ オブジェクト: レコード型 ➢ 配列: テーブル型 で返ります Collect(col, Flow.Run()); Set(rec, Flow.Run()); Set(tbl, Flow.Run());

Slide 44

Slide 44 text

Power Apps で JSON を解析 ■ ParseJSON() 関数 – JSON(テキスト)をパースし、目的の値が取得可能 Text(First(Table(ParseJSON( txtJSON ))).Value.首都) [ { "人口": 331003000, "面積": 9834000, "首都": "ワシントンD.C." } ] ワシントンD.C. 実験段階の機能である 「ParseJSON function and untyped object」 をONする必要があります 46 Text(ParseJSON( txtJSON ).首都) { "人口": 331003000, "面積": 9834000, "首都": "ワシントンD.C." }

Slide 45

Slide 45 text

ParseJSON() 関数の仕様 Text(First(Table(ParseJSON( txtJSON ))).Value.首都) [ { "人口": 331003000, "面積": 9834000, "首都": "ワシントンD.C." } ] 47 Text(ParseJSON( txtJSON ).首都) { "人口": 331003000, "面積": 9834000, "首都": "ワシントンD.C." } Inputは文字列です ① 配列はTable()で型指定します ② First(),Index()などで行を指定します ③ ".Value"(カラム)を指定します ④ キーを指定します 型指定されていないオブジェクトを返すので、 型変換関数(Text(),Value(),Table()など)で型を指定します

Slide 46

Slide 46 text

まとめ

Slide 47

Slide 47 text

まとめ JSONを制す者は Power Automateを制します (たぶん) JSONと仲良くなれましたか? 49

Slide 48

Slide 48 text

ありがとう ございました 50