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. アジェンダ データ操作の仲間たち 作成 Compose 結合 Join 選択 Select アレイのフィルター処理 Filter

    array JSONの解析 Parse JSON CSVテーブルの作成 Create CSV table HTMLテーブルの作成 Create HTML table 3
  2. 本日の参考サイト 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
  3. データ操作のアクション 10 トリガーは 無いです CSV テーブルを作成します HTML テーブルを作成します JSONデータを解析し、項目ごとに抽出する 配列から指定した条件に一致する要素を抽出します

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

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

    型指定 不要(入力ルールの理解は必要) 必要 命名 不要 必要 初期化 どこでも 最上位階層 利用制限 500まで(Action数の制限) 250まで [作成]は手軽(私見)
  6. 変数 型ごとの入力規則 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
  7. 直接入力 or 式エディタ入力 15 ダイレクト 式エディタ 文字列 〇 〇(推奨) 整数

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

    "体長": 150, "重量": 125 }, "種類": "哺乳類", "草食": true }, { "名前": "ライオン", "大きさ": { "体長": 200, "重量": 400 }, "種類": "哺乳類", "草食": false ] [ "パンダ", "ライオン", "ペンギンロボ" ]
  9. 選択(Select)の動き 24 [ { "名前": "マグロ", "部位": "大トロ", "破棄": "ヒレ"

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

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

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

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

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

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

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

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

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

    対象の配列で Array to each 条件コントロールに フィルター条件を設定 条件に合致する要素を 配列変数に追加
  19. 条件で式を使用 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
  20. まとめ 38 名前 体長 体重 パンダ 150 125 ライオン 200

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

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

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

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

    スキーマの を に修正する "type": "データ型" "type": ["データ型", "null"]
  25. CSVテーブルの作成(Create CSV table) 47 ◼ JSON 配列の入力をコンマ区切り値 (CSV) テーブルに変更します ◼

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

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

    "ライオン", "ペンギンロボ" ] [開始]を、動的な値 で指定する場合は 「カスタム」でヘッダーを指定してください
  30. HTMLタグの生成 54 [ "パンダ", "ライオン", null ] <table> <tbody> <tr>

    <td>パンダ</td> </tr> <tr> <td>ライオン</td> </tr> <tr> <td></td> </tr> </tbody> </table> ➢ 単一配列(1次元配列)を出力すると
  31. 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次元配列を出力すると 「ヘッダー」が生成される
  32. <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 (わたるふさん)