Lock in $30 Savings on PRO—Offer Ends Soon! ⏳

Power Automateのデータ操作(Data Operation)について (Ver.モ...

Power Automateのデータ操作(Data Operation)について (Ver.モダンデザイナー)

MiyakeMito

June 15, 2024
Tweet

More Decks by MiyakeMito

Other Decks in Technology

Transcript

  1. アジェンダ データ操作の仲間たち 作成 Compose JSONの解析 Parse JSON 結合 Join 選択

    Select アレイのフィルター処理 Filter array CSVテーブルの作成 Create CSV table HTMLテーブルの作成 Create HTML table 3
  2. 本日の参考サイト 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
  3. データ操作のアクション 9 トリガーは 無いです JSONの配列から CSV テーブルを作成します JSONの配列から HTML テーブルを作成します

    JSONデータを解析し、項目ごとに抽出する 配列から指定した条件に一致する要素を抽出します 選択した区切り記号で配列を区切ります アクションの入力から任意のオブジェクトを構築します 配列内のオブジェクトの形状を変換します
  4. 作成(Compose) 11 ◼ [入力]に設定した値による参照専用のオブジェクトを作成します ◼ 変数アクションのように値を代入し参照できますが、後続の処理でその 値を更新することはできません ◼ 代入した値の参照方法は •

    変数は 変数名を指定 に対し • 作成はアクション名(Default「作成」)を指定します ◼ デバック時に処理内の各値を確認するときにも利用可能 outputs('作成')
  5. [作成]と[変数]の比較 12 作成 変数 参照 〇 〇 再代入 × 〇

    型指定 不要(入力ルールの理解は必要) 必要 命名 不要 必要 初期化 どこでも 最上位階層 利用制限 500まで(Action数の制限) 250まで [作成]は手軽(私見)
  6. 変数 型ごとの入力規則 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 モダンデザイナー でも同じです アレイやオブジェクト 内では直接記述可の場 合もある
  7. 直接入力 or 式エディタ入力 14 変数型 直接入力 式エディタ 文字列 〇 〇(推奨)

    整数 〇 〇 Float 〇 〇 ブール値 〇 〇 オブジェクト 〇 × 入力エラー アレイ 〇 × 入力エラー null × 入力エラー 〇 アレイやオブジェクト内では直接記述可の場合もある
  8. 練習(作成) 15 ① 以下のオブジェクトをフロー内で作りましょう [ { "名前": "パンダ", "大きさ": {

    "体長": 150, "重量": 125 }, "種類": "哺乳類", "草食": true }, { "名前": "ライオン", "大きさ": { "体長": 200, "重量": 400 }, "種類": "哺乳類", "草食": false } ] [ "パンダ", "ライオン", "ペンギンロボ" ]
  9. スキーマの生成 ① 18 { "名前": "パンダ" } { "type": "object",

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

    { "名前": "ライオン", "重量": 150 } ] { "type": "array", "items": { "type": "object", "properties": { "名前": { "type": "string" }, "重量": { "type": "integer" } }, "required": [ "名前", "重量" ] } } "required": [ 解析対象が単一配列(1次元配列) でない場合に付与される
  11. Invalid type. Expected Integer but got Null. 21 ➢ 値にnullが含まれている場合に発生する

    スキーマの を に修正する "type": "データ型" "type": ["データ型", "null"]
  12. 結合(Join) 23 ◼ [Join With] で指定した区切り記号を各要素間に使用して、単独配列内の すべての要素を結合して 1 つの文字列にします ◼

    区切り文字は、配列末尾の要素の後方には付与されません ◼ 同様の動作をする関数として、join() があります ◼ 逆に、文字列を配列に分解する場合は、split() を使います りんごとみかんとバナナ アレイ型のみ許可
  13. 選択(Select)の動き 29 [ { "名前": "マグロ", "部位": "大トロ", "破棄": "ヒレ"

    }, { "名前": "カツオ", "部位": "ハラモ", "破棄": "尾" }, { "名前": "ヒラメ", "部位": "えんがわ", "破棄": "尾頭付き骨" } ] [ { "ネタ": "大トロのお寿司" }, { "ネタ": "ハラモのお寿司" }, { "ネタ": "えんがわのお寿司" } ] 選択 (Select)
  14. Apply to each でやると・・・ 31 Apply to each でやると 配列変数を初期化

    concat( item()?['部位'], 'のお寿司' ) 処理時間も違う 対象の配列で Array to each 項目を編集し 配列変数に追加 item()?['部位']
  15. item() 32 ◼ 配列に対する繰り返しアクションで item() を使うと、繰り返しの間に 配列の現在の要素を返す ◼ その項目のプロパティから値を取得することができる {

    "名前": "カツオ", "部位": "ハラモ", "破棄": "尾" }, item()?['名前'] ⇒ 'マグロ' item()?['名前'] ⇒ 'カツオ' { "名前": "マグロ", "部位": "大トロ", "破棄": "ヒレ" }, { "名前": "ヒラメ", "部位": "えんがわ", "破棄": "尾頭付き骨" } item()?['名前'] ⇒ 'ヒラメ' [ ] ループ 1回目 ループ 2回目 ループ 3回目
  16. [ { "名前": "パンダ", "大きさ": "150/125" }, { "名前": "ライオン",

    "大きさ": "200/400" } ] マップ(キー値モード) 33 [ { "名前": "パンダ", "大きさ": { "体長": 150, "重量": 125 }, "種類": "哺乳類", "草食": true }, { "名前": "ライオン", "大きさ": { "体長": 200, "重量": 400 }, "種類": "哺乳類", "草食": false ] item()?['名前'] concat(string(item()?['大きさ']?['体長']),'/', string(item()?['大きさ']?['重量']))
  17. マップ(テキストモード) 34 item()?['名前'] ➢ 複雑な構造のJSONを出力するとき [ "パンダ", "ライオン", "ペンギンロボ" ]

    ➢ 単一配列(1次元配列)を出力するとき { "哺乳綱": { "食肉目": { "ネコ科": { "ヒョウ属": { "種": "ライオン" } } } } } JSONフォーマットに準ずること
  18. 練習(選択_1) 35 ① 配列の構造を変えてみましょう [ { "名前": "パンダ", "大きさ": {

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

    "体長": 150, "重量": 125 }, "種類": "哺乳類", "草食": true }, { "名前": "ライオン", "大きさ": { "体長": 200, "重量": 400 }, "種類": "哺乳類", "草食": false ] [ "パンダ", "ライオン" ]
  20. アレイのフィルター処理 (Filter array) 38 ◼ [from]で指定した配列の各要素を、指定した条件に一致するサブセット で抽出します ◼ 配列内の要素の形状は変更できません ◼

    Power Automate にはデータのフィルタリング関数は存在しません 複数条件を設定する場合 ① 配列を指定する ② 出力条件を指定する アレイ型のみ許可
  21. アレイのフィルター処理 (Filter array)の動き 40 [ { "名前": "マグロ1", "重量": 2500

    }, { "名前": "マグロ2", "重量": 1800 }, { “名前”: “たい1", "重量": 1000 }, { "名前": "マグロ3", "重量": 3000 } ] [ { "名前": "マグロ1", "重量": 2500 }, { "名前": "マグロ3", "重量": 3000 } ] 重量が 2000 以上の マグロ だけ選ぶ
  22. SQL の SELECT 句で * を指定し、かつ WHERE 句で条件を定義した動きに 近い。 WHER

    句の条件を満たす行の、すべての列を返す動作となる。 • SELECT 句に列名、定数、関数などは指定できない • ORDER BY 句は存在しない 42 SELECT * FROM <table_source> WHERE <search_condition> アレイのフィルター処理 (Filter array)の動き
  23. 複数の条件を指定する 43 ◼ 基本モードで ◼ 詳細設定モードで and(startsWith(item()?['名前'], 'マグロ'), greater(item()?['重量'], 2000))

    テキストの大文字と 小文字を区別します @and(startsWith(item()?['名前'], 'マグロ'),greater(item()?['重量'], 2000)) @はつけなくても 動作する模様
  24. 条件で式を使用 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
  25. まとめ 45 名前 体長 体重 パンダ 150 125 ライオン 200

    150 マグロ 200 400 カツオ 50 4 アシカ 300 600 ゴリラ 180 190 ネコ 75 4.5 イカ 1800 275 ペンギンロボ 0 0.021 種類 哺乳類 哺乳類 魚類 魚類 哺乳類 哺乳類 哺乳類 頭足類 ?? '哺乳類'は 除く 配列の要素を 減らす 配列の要素の形状を変化させる 体重は不要 種類を追加 項目の追加削除だけでなく構 造も変更可能
  26. 練習(アレイのフィルター処理) 46 ① パンダだけを抽出しましょう [ { "名前": "パンダ", "大きさ": {

    "体長": 150, "重量": 125 }, "種類": "哺乳類", "草食": true }, { "名前": "ライオン", "大きさ": { "体長": 200, "重量": 400 }, "種類": "哺乳類", "草食": false ] [ { "名前": "パンダ", "大きさ": { "体長": 150, "重量": 125 }, "種類": "哺乳類", "草食": true } ]
  27. CSVテーブルの作成 (Create CSV table) 48 ◼ JSON 配列の入力をコンマ区切り値 (CSV) テーブルに変更します

    ◼ 出力する項目を選択/編集し、ヘッダーの名称を指定できます (選択(Select)の結果をCSV形式で出力する動作に近い) アレイ型のみ許可 「カスタム」を選ぶと ヘッダーと値を指定できる 「開始」が単一配列かつ 直接入力の場合 「ヘッダー」が表示される (クラシックデザイナーのみ)
  28. ヘッダーの生成 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()?['重量'])
  29. 文字化け 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
  30. 階層の深いオブジェクト 51 [ { "名前": "パンダ", "大きさ": { "体長": 150,

    "重量": 125 }, "種類": "哺乳類", "草食": true }, { "名前": "ライオン", "大きさ": { "体長": 200, "重量": 400 }, "種類": "哺乳類", "草食": false ] 名前,大きさ,種類,草食 パンダ,"{""体長"":150,""重量"":125}",哺乳類,True ライオン,"{""体長"":200,""重量"":400}",哺乳類,False ◼ 3階層以上のデータはJSON構造がそのまま 出力されます
  31. 練習(CSVテーブルの作成) 52 ① JSONからCSVデータを出力しましょう 名前 パンダ ライオン ペンギンロボ [ "パンダ",

    "ライオン", "ペンギンロボ" ] [開始]を、動的な値 で指定する場合は 「カスタム」でヘッダーを指定してください
  32. HTMLテーブルの作成 (Create HTML table) 54 ◼ JSON 配列の入力をHTMLテーブルに変更します ◼ 出力する項目を選択/編集し、ヘッダーの名称を指定できます

    (選択(Select)の結果をHTMLテーブルで出力する動作に近い) 「開始」が単一配列かつ 直接入力の場合 「ヘッダー」が表示される (クラシックデザイナーのみ) アレイ型のみ許可 「カスタム」を選ぶと ヘッダーと値を指定できる
  33. HTMLタグの生成 55 [ "パンダ", "ライオン", null ] <table> <tbody> <tr>

    <td>パンダ</td> </tr> <tr> <td>ライオン</td> </tr> <tr> <td></td> </tr> </tbody> </table> ➢ 単一配列(1次元配列)を出力すると
  34. HTMLタグの生成 56 [ { "名前": "パンダ", "体長": 150, "重量": 125

    }, { "名前": "ライオン", "体長": 200, "重量": 400 }, { "名前": "ペンギンロボ", "体長": 0, "重量": 0.021 } ] <table> <thead> <tr> <th>名前</th> <th>体長</th> <th>重量</th> </tr> </thead> <tbody> <tr> <td>パンダ</td> <td>150</td> <td>125</td> </tr> <tr> <td>ライオン</td> <td>200</td> <td>400</td> </tr> <tr> <td>ペンギンロボ</td> <td>0</td> <td>0.021</td> </tr> </tbody> </table> ➢ 2次元配列を出力すると 「ヘッダー」が生成される
  35. <table border="2"> <thead> <tr> <th style="color: #ffffff; background: #44546A;">名前</th> <th

    style="color: #ffffff; background: #44546A;">体長</th> <th style="color: #ffffff; background: #44546A;">重量</th> </tr> </thead> <tbody> <tr> <td style="background: #8497B0;">パンダ</td> <td style="background: #8497B0;">150</td> <td style="background: #8497B0;">125</td> </tr> <tr> <td style="background: #8497B0;">ライオン</td> <td style="background: #8497B0;">200</td> <td style="background: #8497B0;">400</td> </tr> <tr> <td style="background: #8497B0;">ペンギンロボ</td> <td style="background: #8497B0;">0</td> <td style="background: #8497B0;">0.021</td> </tr> </tbody> </table> スタイル付きのHTMLテーブル 57 ➢ 生成されたHTMLテーブルをリッチな表現で出力する <table> <thead> <tr> <th>名前</th> <th>体長</th> <th>重量</th> </tr> </thead> <tbody> <tr> <td>パンダ</td> <td>150</td> <td>125</td> </tr> <tr> <td>ライオン</td> <td>200</td> <td>400</td> </tr> <tr> <td>ペンギンロボ</td> <td>0</td> <td>0.021</td> </tr> </tbody> </table> https://wataruf.hatenablog.com/entry/2022/04/24/000000 (わたるふさん) replace( replace( replace(body('HTML_テーブルの作成_2'), '<table>', '<table border="2">'), '<th>', '<th style="color: #ffffff; background-color: #44546A;">'), '<td>', '<td style="background-color: #8497B0;">')
  36. 練習(HTMLテーブルの作成) 58 ① JSONからHTMLデータを出力しましょう <table> <thead> <tr> <th>名前</th> </tr> </thead>

    <tbody> <tr> <td>パンダ</td> </tr> <tr> <td>ライオン</td> </tr> <tr> <td>ペンギンロボ</td> </tr> </tbody> </table> [ "パンダ", "ライオン", "ペンギンロボ" ]