Upgrade to Pro — share decks privately, control downloads, hide ads and more …

データ操作について

MiyakeMito
November 26, 2022

 データ操作について

MiyakeMito

November 26, 2022
Tweet

More Decks by MiyakeMito

Other Decks in Technology

Transcript

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

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

  3. アジェンダ データ操作の仲間たち 作成 Compose 結合 Join 選択 Select アレイのフィルター処理 Filter

    array JSONの解析 Parse JSON CSVテーブルの作成 Create CSV table HTMLテーブルの作成 Create HTML table 3
  4. Miyake Mito @MiTo60448639 https://qiita.com/MiyakeMito 株式会社アイシーソフト Technical Manager www.icsoft.jp https://speakerdeck.com/miya kemito

    4 ななもじさん @sumiika88 感謝
  5. connpass (独立発行者) コネクタ が認定されました 5 https://learn.microsoft.com/ja-jp/connectors/connpassip/ イベント情報のキャッチ や管理などに便利です 是非ご活用ください!

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

  8. 式エディターの変更 8 ◼ 複数行入力可能な式エディターに変更しよう! ➢ 数式/動的な値を切替え可能になったので1行形式のメリットはなくなりました 設定の前に 必ずフローを保存 実験的な機能を オン!

    数式を選択できる 新機能:例から式の作成
  9. データ操作の仲間た ち

  10. データ操作のアクション 10 トリガーは 無いです CSV テーブルを作成します HTML テーブルを作成します JSONデータを解析し、項目ごとに抽出する 配列から指定した条件に一致する要素を抽出します

    選択した区切り記号で配列を区切ります アクションの入力から任意のオブジェクトを構築します 配列内のオブジェクトの形状を変換します
  11. 作成 Compose

  12. 作成(Compose) 12 ◼ [入力]に設定した値による参照専用のオブジェクトを作成する ◼ 変数アクションのように値を代入し参照できますが、後続の処理でその 値を更新することはできません ◼ 代入した値の参照方法は •

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

    型指定 不要(入力ルールの理解は必要) 必要 命名 不要 必要 初期化 どこでも 最上位階層 利用制限 500まで(Action数の制限) 250まで [作成]は手軽(私見)
  14. 変数 型ごとの入力規則 14 変数型 入力規則 例 文字列 式エディタ:’ ’(シングルクォーテーション)で囲む 直接入力

    :下記変数型に合致しない値で構成する ’ ’(シングルクォーテーション)不要 整数 数字,-(マイナス符号) -2147483647 ~ 2147483647 Float 数字,-,小数点,e,+ -1.7976931348623e+308 ~ 1.7976931348623e+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
  15. 直接入力 or 式エディタ入力 15 ダイレクト 式エディタ 文字列 〇 〇(推奨) 整数

    〇 〇 Float 〇 〇 ブール値 〇 〇 オブジェクト 〇 × 入力エラー アレイ 〇 × 入力エラー null × 入力エラー 〇
  16. 練習(作成) 16 ① 以下のオブジェクトをフロー内で作りましょう [ { "名前": "パンダ", "大きさ": {

    "体長": 150, "重量": 125 }, "種類": "哺乳類", "草食": true }, { "名前": "ライオン", "大きさ": { "体長": 200, "重量": 400 }, "種類": "哺乳類", "草食": false ] [ "パンダ", "ライオン", "ペンギンロボ" ]
  17. 結合 Join

  18. 結合(Join) 18 ◼ [次を使用して結合] で指定した区切り記号を各要素間に使用して、単独 配列内のすべての要素を結合して 1 つの文字列にします ◼ 区切り文字は、配列末尾の要素の後方には付与されません

    ◼ 同様の動作をする関数として、join() があります マグロとカツオとヒラメ アレイ型のみ許可
  19. 区切り文字なしで結合 19 配列の各要素を区切り文字無しで 結合したい場合は、式エディタで null を指定する Outputは文字列型です

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

  21. 選択 Select

  22. 選択(Select) 22 ◼ 配列内の各オブジェクトの形状を変換(追加、削除、名前変更など)し ます ◼ [開始]で指定した配列の各要素を、マップで設定したフォーマットで出 力します ◼ 配列の要素の数は変更できません

    "マップ" の入力は JSON形式に切替可 ① 配列を指定する ② 出力するマップ (フォーマット) を指定する アレイ型のみ許可
  23. 選択(Select)の動き ① 魚から切り身と骨に分ける ② 切り身は寿司に加工できる ③ 不要な骨は破棄することもできる item()?[‘切り身‘] item()?[‘骨尾頭付き‘] concat(item()?[‘切り身‘],

    ‘シャリ‘) 配列(array) 選択 (Select)
  24. 選択(Select)の動き 24 [ { "名前": "マグロ", "部位": "大トロ", "破棄": "ヒレ"

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

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

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

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

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

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

    "体長": 150, "重量": 125 }, "種類": "哺乳類", "草食": true }, { "名前": "ライオン", "大きさ": { "体長": 200, "重量": 400 }, "種類": "哺乳類", "草食": false ] [ "パンダ", "ライオン" ]
  31. アレイの フィルター処理 Filter array

  32. アレイのフィルター処理 (Filter array) 32 ◼ [差出人]で指定した配列の各要素を、指定した条件に一致するサブセッ トで抽出します ◼ 配列内の要素の形状は変更できません ◼

    Power Automate にはデータのフィルタリング関数は存在しません 複数条件を設定する場合 ① 配列を指定する ② 出力条件を指定する アレイ型のみ許可
  33. アレイのフィルター処理 (Filter array)の動き 魚の種類と大きさで抽出します 配列(array) アレイのフィ ルター処理 (Filter array)

  34. アレイのフィルター処理 (Filter array)の動き 34 [ { "名前": "マグロ1", "重量": 2500

    }, { "名前": "マグロ2", "重量": 1800 }, { "名前": "カツオ1", "重量": 1000 }, { "名前": "マグロ3", "重量": 3000 } ] [ { "名前": "マグロ1", "重量": 2500 }, { "名前": "マグロ3", "重量": 3000 } ] 重量が 2000 以上の マグロ だけ選ぶ
  35. 35 Apply to each でやると アレイのフィルター 処理(Filter array) の動き 配列変数を初期化

    対象の配列で Array to each 条件コントロールに フィルター条件を設定 条件に合致する要素を 配列変数に追加
  36. 複数の条件を指定する 36 ◼ 基本モードで ◼ 詳細設定モードで @and(startsWith(item()?['名前'], 'マグロ'),greater(item()?['重量'], 2000)) and(startsWith(item()?['名前'],

    'マグロ'), greater(item()?['重量'], 2000)) テキストの大文字と 小文字を区別します
  37. 条件で式を使用 37 ◼ 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
  38. まとめ 38 名前 体長 体重 パンダ 150 125 ライオン 200

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

    "体長": 150, "重量": 125 }, "種類": "哺乳類", "草食": true }, { "名前": "ライオン", "大きさ": { "体長": 200, "重量": 400 }, "種類": "哺乳類", "草食": false ] [ { "名前": "パンダ", "大きさ": { "体長": 150, "重量": 125 }, "種類": "哺乳類", "草食": true } ]
  40. JSONの解析 Parse JSON

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

  42. スキーマの生成 ① 42 { "名前": "パンダ" } { "type": "object",

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

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

    スキーマの を に修正する "type": "データ型" "type": ["データ型", "null"]
  45. Required properties are missing from object: 45 ◼ 単一でない配列で、要素の構成が不一致の場合に発生していた 要素ごとの項目が

    アンマッチ ➢エラーにならなく なった (2022年11月時点)
  46. CSVテーブルの作成 Create CSV table

  47. CSVテーブルの作成(Create CSV table) 47 ◼ JSON 配列の入力をコンマ区切り値 (CSV) テーブルに変更します ◼

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

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

    "ライオン", "ペンギンロボ" ] [開始]を、動的な値 で指定する場合は 「カスタム」でヘッダーを指定してください
  52. HTMLテーブルの 作成 Create HTML table

  53. HTMLテーブルの作成(Create HTML table) 53 ◼ JSON 配列の入力をHTMLテーブルに変更します ◼ 出力する項目を選択/編集し、ヘッダーの名称を指定できます (選択(Select)の結果をHTMLテーブルで出力する動作に近い)

    アレイ型のみ許可 「開始」が1次元の配列の場合 「ヘッダー」が表示される 「カスタム」を選ぶと ヘッダーと値を指定できる
  54. HTMLタグの生成 54 [ "パンダ", "ライオン", null ] <table> <tbody> <tr>

    <td>パンダ</td> </tr> <tr> <td>ライオン</td> </tr> <tr> <td></td> </tr> </tbody> </table> ➢ 単一配列(1次元配列)を出力すると
  55. HTMLタグの生成 55 [ { "名前": "パンダ", "体長": 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次元配列を出力すると 「ヘッダー」が生成される
  56. <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テーブル 56 ➢ 生成された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> replace( replace( replace(body('HTML_テーブルの作成_2'), '<table>', '<table border="2">'), '<th>', '<th style="color: #ffffff; background-color: #44546A;">'), '<td>', '<td style="background-color: #8497B0;">') https://wataruf.hatenablog.com/entry/2022/04/24/000000 (わたるふさん)
  57. 練習(HTMLテーブルの作成) 57 ① JSONからHTMLデータを出力しましょう 名前 パンダ ライオン ペンギンロボ [ "パンダ",

    "ライオン", "ペンギンロボ" ]
  58. まとめ

  59. まとめ データ操作を使いこなすと Power Automate で 実現可能な事が増えます! 是非使いこなして 素敵なフローを作成してください 59

  60. ありがとうございました 60