Slide 1

Slide 1 text

Power Automateの データ操作 (Data Operation) について 気ままに勉強会 #87 1

Slide 2

Slide 2 text

今日の目標 データ操作を 使いこなそう 2

Slide 3

Slide 3 text

アジェンダ データ操作の仲間たち 作成 Compose JSONの解析 Parse JSON 結合 Join 選択 Select アレイのフィルター処理 Filter array CSVテーブルの作成 Create CSV table HTMLテーブルの作成 Create HTML table 3

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

本日の参考サイト 5 ◼ MoreBeerMorePower(Hiroさん) https://mofumofupower.hatenablog.com/ ◼ データ操作を使用する(Microsoft Learn) https://learn.microsoft.com/ja-jp/power-automate/data-operations ◼ Power Automate の「JSON の解析」でよくあるエラーを回避する(Otaさん) https://idea.tostring.jp/?p=6412 ◼ Microsoft Teamsで投稿に「いいね」をしていないひとに対してスケジュール実 行でメンションする(解説編その4)(わたるふさん) https://wataruf.hatenablog.com/entry/2022/04/24/000000

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

クラシックデザイナー 式エディターの変更 7 ◼ 複数行入力可能な式エディターに変更しよう! ➢ 数式/動的な値を切替え可能になったので1行形式のメリットはなくなりました 設定の前に 必ずフローを保存 実験的な機能を オン! 数式を選択できる 新機能:例から式の作成

Slide 8

Slide 8 text

データ操作の 仲間たち

Slide 9

Slide 9 text

データ操作のアクション 9 トリガーは 無いです JSONの配列から CSV テーブルを作成します JSONの配列から HTML テーブルを作成します JSONデータを解析し、項目ごとに抽出する 配列から指定した条件に一致する要素を抽出します 選択した区切り記号で配列を区切ります アクションの入力から任意のオブジェクトを構築します 配列内のオブジェクトの形状を変換します

Slide 10

Slide 10 text

作成 Compose

Slide 11

Slide 11 text

作成(Compose) 11 ◼ [入力]に設定した値による参照専用のオブジェクトを作成します ◼ 変数アクションのように値を代入し参照できますが、後続の処理でその 値を更新することはできません ◼ 代入した値の参照方法は • 変数は 変数名を指定 に対し • 作成はアクション名(Default「作成」)を指定します ◼ デバック時に処理内の各値を確認するときにも利用可能 outputs('作成')

Slide 12

Slide 12 text

[作成]と[変数]の比較 12 作成 変数 参照 〇 〇 再代入 × 〇 型指定 不要(入力ルールの理解は必要) 必要 命名 不要 必要 初期化 どこでも 最上位階層 利用制限 500まで(Action数の制限) 250まで [作成]は手軽(私見)

Slide 13

Slide 13 text

変数 型ごとの入力規則 13 変数型 入力規則 例 文字列 式エディタ:’ ’(シングルクォーテーション)で囲む 直接入力 :下記変数型に合致しない値で構成する ’ ’(シングルクォーテーション)不要 整数 数字,-(マイナス符号) -2147483647 ~ 2147483647 Float 数字,-,小数点,e,+ -1.7976931348623158e+308 ~ 1.7976931348623158e+308 ブール値 true / false オブジェクト JSONのオブジェクト型 JSONフォーマットに準ずること アレイ JSONの配列型 JSONフォーマットに準ずること null null ※ 式エディタから入力すること タイムスタンプの 文字列(日付) Power Automateの日付関数が日時として認識できる形式 ISO 8601に準拠していれば、まず問題ない -1.797693e+308 -2147483647 Panda Love true { "属":"ジャイアントパンダ属", "種":"ジャイアントパンダ" } [ "ジャイアントパンダ" ,"レッサーパンダ" ] 2022-11-26T20:08:10.00 カンマはNG カンマはNG モダンデザイナー でも同じです アレイやオブジェクト 内では直接記述可の場 合もある

Slide 14

Slide 14 text

直接入力 or 式エディタ入力 14 変数型 直接入力 式エディタ 文字列 〇 〇(推奨) 整数 〇 〇 Float 〇 〇 ブール値 〇 〇 オブジェクト 〇 × 入力エラー アレイ 〇 × 入力エラー null × 入力エラー 〇 アレイやオブジェクト内では直接記述可の場合もある

Slide 15

Slide 15 text

練習(作成) 15 ① 以下のオブジェクトをフロー内で作りましょう [ { "名前": "パンダ", "大きさ": { "体長": 150, "重量": 125 }, "種類": "哺乳類", "草食": true }, { "名前": "ライオン", "大きさ": { "体長": 200, "重量": 400 }, "種類": "哺乳類", "草食": false } ] [ "パンダ", "ライオン", "ペンギンロボ" ]

Slide 16

Slide 16 text

JSONの解析 Parse JSON

Slide 17

Slide 17 text

JSONの解析(Parse JSON) 17 ◼ JSONデータを解析し、項目ごとに抽出します ◼ 解析された項目は、後続処理にて「動的な値」として指定可能です

Slide 18

Slide 18 text

スキーマの生成 ① 18 { "名前": "パンダ" } { "type": "object", "properties": { "名前": { "type": "string" } } } "type": "object" "properties": { "名前" "type": "string" [ "パンダ", "ライオン", "ペンギン" ] { "type": "array", "items": { "type": "string" } } "type": "array", "items": { "type": "string" この値が、後続処理にて「動的な値」のタイトルとして表示される スキーマを直接修正してわかりやすい項目名に変えても良い

Slide 19

Slide 19 text

スキーマの生成 ② 19 [ { "名前": "パンダ", "重量": 125 }, { "名前": "ライオン", "重量": 150 } ] { "type": "array", "items": { "type": "object", "properties": { "名前": { "type": "string" }, "重量": { "type": "integer" } }, "required": [ "名前", "重量" ] } } "required": [ 解析対象が単一配列(1次元配列) でない場合に付与される

Slide 20

Slide 20 text

Required properties are missing from object: 20 ◼ 単一でない配列で、要素の構成が不一致の場合に発生していた 要素ごとの項目が アンマッチ ➢ エラーにならなくなった (2022年11月時点)

Slide 21

Slide 21 text

Invalid type. Expected Integer but got Null. 21 ➢ 値にnullが含まれている場合に発生する スキーマの を に修正する "type": "データ型" "type": ["データ型", "null"]

Slide 22

Slide 22 text

結合 Join

Slide 23

Slide 23 text

結合(Join) 23 ◼ [Join With] で指定した区切り記号を各要素間に使用して、単独配列内の すべての要素を結合して 1 つの文字列にします ◼ 区切り文字は、配列末尾の要素の後方には付与されません ◼ 同様の動作をする関数として、join() があります ◼ 逆に、文字列を配列に分解する場合は、split() を使います りんごとみかんとバナナ アレイ型のみ許可

Slide 24

Slide 24 text

区切り文字なしで結合 24 区切り文字無しで結合したい場 合は、式エディタで null を指定 する Outputは文字列型です

Slide 25

Slide 25 text

練習(結合) 25 ① 次の配列を結合した文字列を作成しましょう [ "パンダ", "ライオン", "ペンギンロボ" ] パンダ&ライオン&ペンギンロボ

Slide 26

Slide 26 text

選択 Select

Slide 27

Slide 27 text

選択(Select) 27 ◼ 配列内の各オブジェクトの形状を変換(追加、削除、名前変更など)し ます ◼ [From]で指定した配列の各要素を、[Map]で設定したフォーマットで出力 します ◼ 配列の要素の数は変更できません "マップ" の入力は JSON形式に切替可 ① 配列を指定する ② 出力するマップ (フォーマット) を指定する アレイ型のみ許可

Slide 28

Slide 28 text

選択(Select)の動き ① 魚から切り身と骨に分ける ② 切り身は寿司に加工できる ③ 不要な骨は破棄することもできる item()?[‘切り身‘] item()?[‘骨尾頭付き‘] concat(item()?[‘切り身‘], ‘シャリ‘) 配列(array) 選択 (Select)

Slide 29

Slide 29 text

選択(Select)の動き 29 [ { "名前": "マグロ", "部位": "大トロ", "破棄": "ヒレ" }, { "名前": "カツオ", "部位": "ハラモ", "破棄": "尾" }, { "名前": "ヒラメ", "部位": "えんがわ", "破棄": "尾頭付き骨" } ] [ { "ネタ": "大トロのお寿司" }, { "ネタ": "ハラモのお寿司" }, { "ネタ": "えんがわのお寿司" } ] 選択 (Select)

Slide 30

Slide 30 text

SQL の SELECT 句で、 定数、関数、または列名、定数、関数を演算子で組み合わせたものを 指定する動きに近い。 • WHERE 句は存在しない • ORDER BY 句も存在しない 選択(Select)の動き 30 SELECT 式 (expression) FROM

Slide 31

Slide 31 text

Apply to each でやると・・・ 31 Apply to each でやると 配列変数を初期化 concat( item()?['部位'], 'のお寿司' ) 処理時間も違う 対象の配列で Array to each 項目を編集し 配列変数に追加 item()?['部位']

Slide 32

Slide 32 text

item() 32 ◼ 配列に対する繰り返しアクションで item() を使うと、繰り返しの間に 配列の現在の要素を返す ◼ その項目のプロパティから値を取得することができる { "名前": "カツオ", "部位": "ハラモ", "破棄": "尾" }, item()?['名前'] ⇒ 'マグロ' item()?['名前'] ⇒ 'カツオ' { "名前": "マグロ", "部位": "大トロ", "破棄": "ヒレ" }, { "名前": "ヒラメ", "部位": "えんがわ", "破棄": "尾頭付き骨" } item()?['名前'] ⇒ 'ヒラメ' [ ] ループ 1回目 ループ 2回目 ループ 3回目

Slide 33

Slide 33 text

[ { "名前": "パンダ", "大きさ": "150/125" }, { "名前": "ライオン", "大きさ": "200/400" } ] マップ(キー値モード) 33 [ { "名前": "パンダ", "大きさ": { "体長": 150, "重量": 125 }, "種類": "哺乳類", "草食": true }, { "名前": "ライオン", "大きさ": { "体長": 200, "重量": 400 }, "種類": "哺乳類", "草食": false ] item()?['名前'] concat(string(item()?['大きさ']?['体長']),'/', string(item()?['大きさ']?['重量']))

Slide 34

Slide 34 text

マップ(テキストモード) 34 item()?['名前'] ➢ 複雑な構造のJSONを出力するとき [ "パンダ", "ライオン", "ペンギンロボ" ] ➢ 単一配列(1次元配列)を出力するとき { "哺乳綱": { "食肉目": { "ネコ科": { "ヒョウ属": { "種": "ライオン" } } } } } JSONフォーマットに準ずること

Slide 35

Slide 35 text

練習(選択_1) 35 ① 配列の構造を変えてみましょう [ { "名前": "パンダ", "大きさ": { "体長": 150, "重量": 125 }, "種類": "哺乳類", "草食": true }, { "名前": "ライオン", "大きさ": { "体長": 200, "重量": 400 }, "種類": "哺乳類", "草食": false ] [ { "名前": "パンダ", "食性": "草食" }, { "名前": "ライオン", "食性": "肉食" } ]

Slide 36

Slide 36 text

練習(選択_2) 36 ② 名前だけの配列をつくってみましょう [ { "名前": "パンダ", "大きさ": { "体長": 150, "重量": 125 }, "種類": "哺乳類", "草食": true }, { "名前": "ライオン", "大きさ": { "体長": 200, "重量": 400 }, "種類": "哺乳類", "草食": false ] [ "パンダ", "ライオン" ]

Slide 37

Slide 37 text

アレイの フィルター処理 Filter array

Slide 38

Slide 38 text

アレイのフィルター処理 (Filter array) 38 ◼ [from]で指定した配列の各要素を、指定した条件に一致するサブセット で抽出します ◼ 配列内の要素の形状は変更できません ◼ Power Automate にはデータのフィルタリング関数は存在しません 複数条件を設定する場合 ① 配列を指定する ② 出力条件を指定する アレイ型のみ許可

Slide 39

Slide 39 text

アレイのフィルター処理 (Filter array)の動き 魚の種類と大きさで抽出します 配列(array) アレイのフィ ルター処理 (Filter array)

Slide 40

Slide 40 text

アレイのフィルター処理 (Filter array)の動き 40 [ { "名前": "マグロ1", "重量": 2500 }, { "名前": "マグロ2", "重量": 1800 }, { “名前”: “たい1", "重量": 1000 }, { "名前": "マグロ3", "重量": 3000 } ] [ { "名前": "マグロ1", "重量": 2500 }, { "名前": "マグロ3", "重量": 3000 } ] 重量が 2000 以上の マグロ だけ選ぶ

Slide 41

Slide 41 text

41 Apply to each でやると 配列変数を初期化 条件コントロールに フィルター条件を設定 条件に合致する要素を 配列変数に追加 item() 対象の配列で Array to each Apply to each でやると・・・

Slide 42

Slide 42 text

SQL の SELECT 句で * を指定し、かつ WHERE 句で条件を定義した動きに 近い。 WHER 句の条件を満たす行の、すべての列を返す動作となる。 • SELECT 句に列名、定数、関数などは指定できない • ORDER BY 句は存在しない 42 SELECT * FROM WHERE アレイのフィルター処理 (Filter array)の動き

Slide 43

Slide 43 text

複数の条件を指定する 43 ◼ 基本モードで ◼ 詳細設定モードで and(startsWith(item()?['名前'], 'マグロ'), greater(item()?['重量'], 2000)) テキストの大文字と 小文字を区別します @and(startsWith(item()?['名前'], 'マグロ'),greater(item()?['重量'], 2000)) @はつけなくても 動作する模様

Slide 44

Slide 44 text

条件で式を使用 44 https://learn.microsoft.com/ja-jp/power-automate/use-expressions-in-conditions 内容 式 備考 次の値を含む/含まない contains('A', 'B') / not(contains('A', 'B') 次の値に等しい/等しくない equals('A', 'B') / not(equals('A', 'B')) 次の値より大きい greater('A', 'B') 次の値以上 greaterOrEquals('A', 'B') 次の値未満 less('A', 'B') 次の値以下 lessOrEquals('A', 'B') 次のもので始まる/始まらない startsWith('A', 'B') / not(startsWith('A', 'B') ) 次のもので終わる/終わらない endswith('A', 'B') / not(endswith('A', 'B')) 論理積 and 論理和 or 空であるか empty ""(空白) および null の場合True 否 not 条件 if

Slide 45

Slide 45 text

まとめ 45 名前 体長 体重 パンダ 150 125 ライオン 200 150 マグロ 200 400 カツオ 50 4 アシカ 300 600 ゴリラ 180 190 ネコ 75 4.5 イカ 1800 275 ペンギンロボ 0 0.021 種類 哺乳類 哺乳類 魚類 魚類 哺乳類 哺乳類 哺乳類 頭足類 ?? '哺乳類'は 除く 配列の要素を 減らす 配列の要素の形状を変化させる 体重は不要 種類を追加 項目の追加削除だけでなく構 造も変更可能

Slide 46

Slide 46 text

練習(アレイのフィルター処理) 46 ① パンダだけを抽出しましょう [ { "名前": "パンダ", "大きさ": { "体長": 150, "重量": 125 }, "種類": "哺乳類", "草食": true }, { "名前": "ライオン", "大きさ": { "体長": 200, "重量": 400 }, "種類": "哺乳類", "草食": false ] [ { "名前": "パンダ", "大きさ": { "体長": 150, "重量": 125 }, "種類": "哺乳類", "草食": true } ]

Slide 47

Slide 47 text

CSVテーブルの作成 Create CSV table

Slide 48

Slide 48 text

CSVテーブルの作成 (Create CSV table) 48 ◼ JSON 配列の入力をコンマ区切り値 (CSV) テーブルに変更します ◼ 出力する項目を選択/編集し、ヘッダーの名称を指定できます (選択(Select)の結果をCSV形式で出力する動作に近い) アレイ型のみ許可 「カスタム」を選ぶと ヘッダーと値を指定できる 「開始」が単一配列かつ 直接入力の場合 「ヘッダー」が表示される (クラシックデザイナーのみ)

Slide 49

Slide 49 text

ヘッダーの生成 49 [ { "名前" : "パンダ", "体長" : 150, "重量" : 125, "種類" : "哺乳類", "草食" : true }, { "名前" : "ライオン", "体長" : 200, "重量" : 400, "種類" : "哺乳類", "草食" : false }, { "名前" : "ペンギンロボ", "体長" : 0, "重量" : 0.021, "種類" : "文豪AI", "草食" : false } ] 名前,体長,重量,種類,草食 パンダ,150,125,哺乳類,True ライオン,200,400,哺乳類,False ペンギンロボ,0, 0.021,文豪AI,False 品種,大きさ,種類 パンダ,150/125,哺乳類 ライオン,200/400,哺乳類 ペンギンロボ,0/0.021,文豪AI item()?['名前'] concat(item()?['体長’], '/',item()?['重量'])

Slide 50

Slide 50 text

文字化け 50 ◼ OneDrive for Business 等に保存したcsvファイ ルをExcelで開くと文字化けします ◼ Power Automate によって作成された CSV 形 式のテキスト ファイルは文字コードが UTF-8 であるのに対し、 Excel Online は文字コード が ANSI (Shift_JIS) であると見なして処理して しまうため concat(decodeUriComponent('%EF%BB%BF'),body('CSV_テーブルの作成')) BOM (Byte Order Mark) を付与する https://jpdynamicscrm.github.io/blog/powerautomate/Avoid-Character-Corruption-Methods/#more

Slide 51

Slide 51 text

階層の深いオブジェクト 51 [ { "名前": "パンダ", "大きさ": { "体長": 150, "重量": 125 }, "種類": "哺乳類", "草食": true }, { "名前": "ライオン", "大きさ": { "体長": 200, "重量": 400 }, "種類": "哺乳類", "草食": false ] 名前,大きさ,種類,草食 パンダ,"{""体長"":150,""重量"":125}",哺乳類,True ライオン,"{""体長"":200,""重量"":400}",哺乳類,False ◼ 3階層以上のデータはJSON構造がそのまま 出力されます

Slide 52

Slide 52 text

練習(CSVテーブルの作成) 52 ① JSONからCSVデータを出力しましょう 名前 パンダ ライオン ペンギンロボ [ "パンダ", "ライオン", "ペンギンロボ" ] [開始]を、動的な値 で指定する場合は 「カスタム」でヘッダーを指定してください

Slide 53

Slide 53 text

HTMLテーブルの 作成 Create HTML table

Slide 54

Slide 54 text

HTMLテーブルの作成 (Create HTML table) 54 ◼ JSON 配列の入力をHTMLテーブルに変更します ◼ 出力する項目を選択/編集し、ヘッダーの名称を指定できます (選択(Select)の結果をHTMLテーブルで出力する動作に近い) 「開始」が単一配列かつ 直接入力の場合 「ヘッダー」が表示される (クラシックデザイナーのみ) アレイ型のみ許可 「カスタム」を選ぶと ヘッダーと値を指定できる

Slide 55

Slide 55 text

HTMLタグの生成 55 [ "パンダ", "ライオン", null ] パンダ ライオン ➢ 単一配列(1次元配列)を出力すると

Slide 56

Slide 56 text

HTMLタグの生成 56 [ { "名前": "パンダ", "体長": 150, "重量": 125 }, { "名前": "ライオン", "体長": 200, "重量": 400 }, { "名前": "ペンギンロボ", "体長": 0, "重量": 0.021 } ] 名前 体長 重量 パンダ 150 125 ライオン 200 400 ペンギンロボ 0 0.021 ➢ 2次元配列を出力すると 「ヘッダー」が生成される

Slide 57

Slide 57 text

名前 体長 重量 パンダ 150 125 ライオン 200 400 ペンギンロボ 0 0.021 スタイル付きのHTMLテーブル 57 ➢ 生成されたHTMLテーブルをリッチな表現で出力する 名前 体長 重量 パンダ 150 125 ライオン 200 400 ペンギンロボ 0 0.021 https://wataruf.hatenablog.com/entry/2022/04/24/000000 (わたるふさん) replace( replace( replace(body('HTML_テーブルの作成_2'), '', ''), '', ''), '', '')

Slide 58

Slide 58 text

練習(HTMLテーブルの作成) 58 ① JSONからHTMLデータを出力しましょう 名前 パンダ ライオン ペンギンロボ [ "パンダ", "ライオン", "ペンギンロボ" ]

Slide 59

Slide 59 text

まとめ

Slide 60

Slide 60 text

まとめ データ操作を使いこなすと Power Automate で できる事が増えます! 是非使いこなして 素敵なフローを作成してください 60

Slide 61

Slide 61 text

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