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

    View Slide

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

    View Slide

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

    View Slide

  4. Miyake Mito @MiTo60448639
    https://qiita.com/MiyakeMito
    株式会社アイシーソフト
    Technical Manager
    www.icsoft.jp
    https://speakerdeck.com/miya
    kemito
    4
    ななもじさん
    @sumiika88
    感謝

    View Slide

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

    View Slide

  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

    View Slide

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

    View Slide

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

    View Slide

  9. データ操作の仲間た

    View Slide

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

    View Slide

  11. 作成
    Compose

    View Slide

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

    View Slide

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

    View Slide

  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

    View Slide

  15. 直接入力 or 式エディタ入力
    15
    ダイレクト 式エディタ
    文字列 〇 〇(推奨)
    整数 〇 〇
    Float 〇 〇
    ブール値 〇 〇
    オブジェクト 〇 × 入力エラー
    アレイ 〇 × 入力エラー
    null × 入力エラー 〇

    View Slide

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

    View Slide

  17. 結合
    Join

    View Slide

  18. 結合(Join)
    18
    ◼ [次を使用して結合] で指定した区切り記号を各要素間に使用して、単独
    配列内のすべての要素を結合して 1 つの文字列にします
    ◼ 区切り文字は、配列末尾の要素の後方には付与されません
    ◼ 同様の動作をする関数として、join() があります
    マグロとカツオとヒラメ
    アレイ型のみ許可

    View Slide

  19. 区切り文字なしで結合
    19
    配列の各要素を区切り文字無しで
    結合したい場合は、式エディタで
    null を指定する
    Outputは文字列型です

    View Slide

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

    View Slide

  21. 選択
    Select

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  35. 35
    Apply to
    each
    でやると
    アレイのフィルター
    処理(Filter array)
    の動き
    配列変数を初期化
    対象の配列で
    Array to each
    条件コントロールに
    フィルター条件を設定
    条件に合致する要素を
    配列変数に追加

    View Slide

  36. 複数の条件を指定する
    36
    ◼ 基本モードで
    ◼ 詳細設定モードで
    @and(startsWith(item()?['名前'], 'マグロ'),greater(item()?['重量'], 2000))
    and(startsWith(item()?['名前'], 'マグロ'), greater(item()?['重量'], 2000))
    テキストの大文字と
    小文字を区別します

    View Slide

  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

    View Slide

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

    View Slide

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

    View Slide

  40. JSONの解析
    Parse JSON

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  46. CSVテーブルの作成
    Create CSV table

    View Slide

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

    View Slide

  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

    View Slide

  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

    View Slide

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

    View Slide

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

    View Slide

  52. HTMLテーブルの
    作成
    Create HTML
    table

    View Slide

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

    View Slide

  54. HTMLタグの生成
    54
    [
    "パンダ",
    "ライオン",
    null
    ]



    パンダ


    ライオン






    ➢ 単一配列(1次元配列)を出力すると

    View Slide

  55. HTMLタグの生成
    55
    [
    {
    "名前": "パンダ",
    "体長": 150,
    "重量": 125
    },
    {
    "名前": "ライオン",
    "体長": 200,
    "重量": 400
    },
    {
    "名前": "ペンギンロボ",
    "体長": 0,
    "重量": 0.021
    }
    ]



    名前
    体長
    重量




    パンダ
    150
    125


    ライオン
    200
    400


    ペンギンロボ
    0
    0.021



    ➢ 2次元配列を出力すると
    「ヘッダー」が生成される

    View Slide




  56. 名前
    体長
    重量




    パンダ
    150
    125


    ライオン
    200
    400


    ペンギンロボ
    0
    0.021



    スタイル付きのHTMLテーブル
    56
    ➢ 生成されたHTMLテーブルをリッチな表現で出力する



    名前
    体長
    重量




    パンダ
    150
    125


    ライオン
    200
    400


    ペンギンロボ
    0
    0.021



    replace(
    replace(
    replace(body('HTML_テーブルの作成_2'),
    '', ''),
    '', ''),
    '', '')
    https://wataruf.hatenablog.com/entry/2022/04/24/000000 (わたるふさん)

    View Slide

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

    View Slide

  58. まとめ

    View Slide

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

    View Slide

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

    View Slide