Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Speaker Deck
PRO
Sign in
Sign up for free
データ操作について
MiyakeMito
November 26, 2022
Technology
0
550
データ操作について
MiyakeMito
November 26, 2022
Tweet
Share
More Decks by MiyakeMito
See All by MiyakeMito
AI Builderについて
miyakemito
0
910
アムロは成長しているのか AIから分析する
miyakemito
1
370
Power Automate の新関数について
miyakemito
0
370
Power Virtual Agents について
miyakemito
0
2.6k
Power Platform のconnpassコネクタについて
miyakemito
0
1.5k
JSONについて
miyakemito
2
1.4k
Lobeによるガンプラの識別
miyakemito
0
630
Power Automate for desktop から SharePoint Online リストを直接利用する方法
miyakemito
1
300
カスタム コネクタとは
miyakemito
0
570
Other Decks in Technology
See All in Technology
金属加工屋の営業マンがSTマイクロで・・・
usashirou
0
160
経営統合をきっかけに会社をエンジニアリングした話 / btconjp-2023
carta_engineering
0
150
地方自治体業務あるある ーアナログ最適化編-
y150saya
1
270
データベースの発表には RDBMS 以外もありますよ
maroon1st
0
240
OVN-Kubernetes-Introduction-ja-2023-01-27.pdf
orimanabu
1
390
CUEとKubernetesカスタムオペレータを用いた新しいネットワークコントローラをつくってみた
hrk091
1
280
証明書って何だっけ? 〜AWSの中間CA移行に備える〜
minorun365
3
2.1k
Pentesting Password Reset Functionality
anugrahsr
0
470
Deep dive in Reserved Instance ~脳死推奨量購入からの脱却~
kzkmaeda
0
540
Oracle Cloud Infrastructure:2023年1月度サービス・アップデート
oracle4engineer
PRO
0
160
CES_2023_FleetWise_demo.pdf
sparkgene
0
120
Raspberry Pi Camera 3 介紹
piepie_tw
PRO
0
150
Featured
See All Featured
Designing the Hi-DPI Web
ddemaree
273
32k
How To Stay Up To Date on Web Technology
chriscoyier
779
250k
What's in a price? How to price your products and services
michaelherold
233
9.7k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
2
400
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
349
27k
How GitHub (no longer) Works
holman
298
140k
Reflections from 52 weeks, 52 projects
jeffersonlam
338
18k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
182
15k
WebSockets: Embracing the real-time Web
robhawkes
58
6k
YesSQL, Process and Tooling at Scale
rocio
159
12k
Git: the NoSQL Database
bkeepers
PRO
419
60k
The Art of Programming - Codeland 2020
erikaheidi
35
11k
Transcript
Power Automateの データ操作 (Data Operation) について 気ままに勉強会 #38 1
今日の目標 データ操作を 使いこなそう 2
アジェンダ データ操作の仲間たち 作成 Compose 結合 Join 選択 Select アレイのフィルター処理 Filter
array JSONの解析 Parse JSON CSVテーブルの作成 Create CSV table HTMLテーブルの作成 Create HTML table 3
Miyake Mito @MiTo60448639 https://qiita.com/MiyakeMito 株式会社アイシーソフト Technical Manager www.icsoft.jp https://speakerdeck.com/miya kemito
4 ななもじさん @sumiika88 感謝
connpass (独立発行者) コネクタ が認定されました 5 https://learn.microsoft.com/ja-jp/connectors/connpassip/ イベント情報のキャッチ や管理などに便利です 是非ご活用ください!
本日の参考サイト 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
免責事項 当スライドは、 2022年11月現在のバージョンでの情報です 今後のアップデート等により、 仕様変更する可能性があります また、私の見解による内容が含まれます 間違いなどありましたらご指摘ください 7
式エディターの変更 8 ◼ 複数行入力可能な式エディターに変更しよう! ➢ 数式/動的な値を切替え可能になったので1行形式のメリットはなくなりました 設定の前に 必ずフローを保存 実験的な機能を オン!
数式を選択できる 新機能:例から式の作成
データ操作の仲間た ち
データ操作のアクション 10 トリガーは 無いです CSV テーブルを作成します HTML テーブルを作成します JSONデータを解析し、項目ごとに抽出する 配列から指定した条件に一致する要素を抽出します
選択した区切り記号で配列を区切ります アクションの入力から任意のオブジェクトを構築します 配列内のオブジェクトの形状を変換します
作成 Compose
作成(Compose) 12 ◼ [入力]に設定した値による参照専用のオブジェクトを作成する ◼ 変数アクションのように値を代入し参照できますが、後続の処理でその 値を更新することはできません ◼ 代入した値の参照方法は •
変数は 変数名を指定 に対し • 作成はアクション名(Default「作成」)を指定します ◼ デバック時に処理内の各値を確認するときにも利用可能 outputs('作成')
[作成]と[変数]の比較 13 作成 変数 参照 〇 〇 再代入 × 〇
型指定 不要(入力ルールの理解は必要) 必要 命名 不要 必要 初期化 どこでも 最上位階層 利用制限 500まで(Action数の制限) 250まで [作成]は手軽(私見)
変数 型ごとの入力規則 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
直接入力 or 式エディタ入力 15 ダイレクト 式エディタ 文字列 〇 〇(推奨) 整数
〇 〇 Float 〇 〇 ブール値 〇 〇 オブジェクト 〇 × 入力エラー アレイ 〇 × 入力エラー null × 入力エラー 〇
練習(作成) 16 ① 以下のオブジェクトをフロー内で作りましょう [ { "名前": "パンダ", "大きさ": {
"体長": 150, "重量": 125 }, "種類": "哺乳類", "草食": true }, { "名前": "ライオン", "大きさ": { "体長": 200, "重量": 400 }, "種類": "哺乳類", "草食": false ] [ "パンダ", "ライオン", "ペンギンロボ" ]
結合 Join
結合(Join) 18 ◼ [次を使用して結合] で指定した区切り記号を各要素間に使用して、単独 配列内のすべての要素を結合して 1 つの文字列にします ◼ 区切り文字は、配列末尾の要素の後方には付与されません
◼ 同様の動作をする関数として、join() があります マグロとカツオとヒラメ アレイ型のみ許可
区切り文字なしで結合 19 配列の各要素を区切り文字無しで 結合したい場合は、式エディタで null を指定する Outputは文字列型です
練習(結合) 20 ① 次の配列を結合した文字列を作成しましょう [ "パンダ", "ライオン", "ペンギンロボ" ] パンダ&ライオン&ペンギンロボ
選択 Select
選択(Select) 22 ◼ 配列内の各オブジェクトの形状を変換(追加、削除、名前変更など)し ます ◼ [開始]で指定した配列の各要素を、マップで設定したフォーマットで出 力します ◼ 配列の要素の数は変更できません
"マップ" の入力は JSON形式に切替可 ① 配列を指定する ② 出力するマップ (フォーマット) を指定する アレイ型のみ許可
選択(Select)の動き ① 魚から切り身と骨に分ける ② 切り身は寿司に加工できる ③ 不要な骨は破棄することもできる item()?[‘切り身‘] item()?[‘骨尾頭付き‘] concat(item()?[‘切り身‘],
‘シャリ‘) 配列(array) 選択 (Select)
選択(Select)の動き 24 [ { "名前": "マグロ", "部位": "大トロ", "破棄": "ヒレ"
}, { "名前": "カツオ", "部位": "ハラモ", "破棄": "尾" }, { "名前": "ヒラメ", "部位": "えんがわ", "破棄": "尾頭付き骨" } ] [ { "ネタ": "大トロのお寿司" }, { "ネタ": "ハラモのお寿司" }, { "ネタ": "えんがわのお寿司" } ] 選択 (Select)
選択(Select) 25 Apply to each でやると 配列変数を初期化 対象の配列で Array to
each 項目を編集し 配列変数に追加 concat( item()?['部位'], 'のお寿司' ) item()?['部位'] 処理時間も違う
item() 26 ◼ 配列に対する繰り返しアクションで item() を使うと、繰り返しの間に 配列の現在の要素を返す ◼ その項目のプロパティから値を取得することができる {
"名前": "カツオ", "部位": "ハラモ", "破棄": "尾" }, item()?['名前'] ⇒ 'マグロ' item()?['名前'] ⇒ 'カツオ' { "名前": "マグロ", "部位": "大トロ", "破棄": "ヒレ" }, { "名前": "ヒラメ", "部位": "えんがわ", "破棄": "尾頭付き骨" } item()?['名前'] ⇒ 'ヒラメ' [ ] ループ 1回目 ループ 2回目 ループ 3回目
[ { "名前": "パンダ", "大きさ": "150/125" }, { "名前": "ライオン",
"大きさ": "200/400" } ] マップ(キー値モード) 27 [ { "名前": "パンダ", "大きさ": { "体長": 150, "重量": 125 }, "種類": "哺乳類", "草食": true }, { "名前": "ライオン", "大きさ": { "体長": 200, "重量": 400 }, "種類": "哺乳類", "草食": false ] item()?['名前'] concat(string(item()?['大きさ']?['体長']),'/', string(item()?['大きさ']?['重量']))
マップ(テキストモード) 28 item()?['名前'] ➢ 複雑な構造のJSONを出力するとき [ "パンダ", "ライオン", "ペンギンロボ" ]
➢ 単一配列(1次元配列)を出力するとき { "哺乳綱": { "食肉目": { "ネコ科": { "ヒョウ属": { "種": "ライオン" } } } } } JSONフォーマットに準ずること
練習(選択_1) 29 ① 配列の構造を変えてみましょう [ { "名前": "パンダ", "大きさ": {
"体長": 150, "重量": 125 }, "種類": "哺乳類", "草食": true }, { "名前": "ライオン", "大きさ": { "体長": 200, "重量": 400 }, "種類": "哺乳類", "草食": false ] [ { "名前": "パンダ", "食性": "草食" }, { "名前": "ライオン", "食性": "肉食" } ]
練習(選択_2) 30 ② 名前だけの配列をつくってみましょう [ { "名前": "パンダ", "大きさ": {
"体長": 150, "重量": 125 }, "種類": "哺乳類", "草食": true }, { "名前": "ライオン", "大きさ": { "体長": 200, "重量": 400 }, "種類": "哺乳類", "草食": false ] [ "パンダ", "ライオン" ]
アレイの フィルター処理 Filter array
アレイのフィルター処理 (Filter array) 32 ◼ [差出人]で指定した配列の各要素を、指定した条件に一致するサブセッ トで抽出します ◼ 配列内の要素の形状は変更できません ◼
Power Automate にはデータのフィルタリング関数は存在しません 複数条件を設定する場合 ① 配列を指定する ② 出力条件を指定する アレイ型のみ許可
アレイのフィルター処理 (Filter array)の動き 魚の種類と大きさで抽出します 配列(array) アレイのフィ ルター処理 (Filter array)
アレイのフィルター処理 (Filter array)の動き 34 [ { "名前": "マグロ1", "重量": 2500
}, { "名前": "マグロ2", "重量": 1800 }, { "名前": "カツオ1", "重量": 1000 }, { "名前": "マグロ3", "重量": 3000 } ] [ { "名前": "マグロ1", "重量": 2500 }, { "名前": "マグロ3", "重量": 3000 } ] 重量が 2000 以上の マグロ だけ選ぶ
35 Apply to each でやると アレイのフィルター 処理(Filter array) の動き 配列変数を初期化
対象の配列で Array to each 条件コントロールに フィルター条件を設定 条件に合致する要素を 配列変数に追加
複数の条件を指定する 36 ◼ 基本モードで ◼ 詳細設定モードで @and(startsWith(item()?['名前'], 'マグロ'),greater(item()?['重量'], 2000)) and(startsWith(item()?['名前'],
'マグロ'), greater(item()?['重量'], 2000)) テキストの大文字と 小文字を区別します
条件で式を使用 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 名前 体長 体重 パンダ 150 125 ライオン 200
150 マグロ 200 400 カツオ 50 4 アシカ 300 600 ゴリラ 180 190 ネコ 75 4.5 イカ 1800 275 ペンギンロボ 0 0.021 種類 哺乳類 哺乳類 魚類 魚類 哺乳類 哺乳類 哺乳類 頭足類 ?? '哺乳類'は 除く 配列の要素を 減らす 配列の要素の形状を変化させる 体重は不要 種類を追加 項目の追加削除だけでなく構 造も変更可能
練習(アレイのフィルター処理) 39 ① パンダだけを抽出しましょう [ { "名前": "パンダ", "大きさ": {
"体長": 150, "重量": 125 }, "種類": "哺乳類", "草食": true }, { "名前": "ライオン", "大きさ": { "体長": 200, "重量": 400 }, "種類": "哺乳類", "草食": false ] [ { "名前": "パンダ", "大きさ": { "体長": 150, "重量": 125 }, "種類": "哺乳類", "草食": true } ]
JSONの解析 Parse JSON
JSONの解析(Parse JSON) 41 ◼ JSONデータを解析し、項目ごとに抽出します ◼ 解析された項目は、後続処理にて「動的な値」として指定可能です
スキーマの生成 ① 42 { "名前": "パンダ" } { "type": "object",
"properties": { "名前": { "type": "string" } } } "type": "object" "properties": { "名前" "type": "string" [ "パンダ", "ライオン", "ペンギン" ] { "type": "array", "items": { "type": "string" } } "type": "array", "items": { "type": "string" この値が、後続処理にて「動的な値」のタイトルとして表示される スキーマを直接修正してわかりやすい項目名に変えても良い
スキーマの生成 ② 43 [ { "名前": "パンダ", "重量": 125 },
{ "名前": "ライオン", "重量": 150 } ] { "type": "array", "items": { "type": "object", "properties": { "名前": { "type": "string" }, "重量": { "type": "integer" } }, "required": [ "名前", "重量" ] } } "required": [ 解析対象が単一配列(1次元配列) でない場合に付与される
Invalid type. Expected Integer but got Null. 44 ➢ 値にnullが含まれている場合に発生する
スキーマの を に修正する "type": "データ型" "type": ["データ型", "null"]
Required properties are missing from object: 45 ◼ 単一でない配列で、要素の構成が不一致の場合に発生していた 要素ごとの項目が
アンマッチ ➢エラーにならなく なった (2022年11月時点)
CSVテーブルの作成 Create CSV table
CSVテーブルの作成(Create CSV table) 47 ◼ JSON 配列の入力をコンマ区切り値 (CSV) テーブルに変更します ◼
出力する項目を選択/編集し、ヘッダーの名称を指定できます (選択(Select)の結果をCSV形式で出力する動作に近い) 「開始」が1次元の配列かつ 直接入力の場合 「ヘッダー」が表示される 「カスタム」を選ぶと ヘッダーと値を指定できる アレイ型のみ許可
ヘッダーの生成 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 ◼ 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 [ { "名前": "パンダ", "大きさ": { "体長": 150,
"重量": 125 }, "種類": "哺乳類", "草食": true }, { "名前": "ライオン", "大きさ": { "体長": 200, "重量": 400 }, "種類": "哺乳類", "草食": false ] 名前,大きさ,種類,草食 パンダ,"{""体長"":150,""重量"":125}",哺乳類,True ライオン,"{""体長"":200,""重量"":400}",哺乳類,False ◼ 3階層以上のデータはJSON構造がそのまま 出力されます
練習(CSVテーブルの作成) 51 ① JSONからCSVデータを出力しましょう 名前 パンダ ライオン ペンギンロボ [ "パンダ",
"ライオン", "ペンギンロボ" ] [開始]を、動的な値 で指定する場合は 「カスタム」でヘッダーを指定してください
HTMLテーブルの 作成 Create HTML table
HTMLテーブルの作成(Create HTML table) 53 ◼ JSON 配列の入力をHTMLテーブルに変更します ◼ 出力する項目を選択/編集し、ヘッダーの名称を指定できます (選択(Select)の結果をHTMLテーブルで出力する動作に近い)
アレイ型のみ許可 「開始」が1次元の配列の場合 「ヘッダー」が表示される 「カスタム」を選ぶと ヘッダーと値を指定できる
HTMLタグの生成 54 [ "パンダ", "ライオン", null ] <table> <tbody> <tr>
<td>パンダ</td> </tr> <tr> <td>ライオン</td> </tr> <tr> <td></td> </tr> </tbody> </table> ➢ 単一配列(1次元配列)を出力すると
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次元配列を出力すると 「ヘッダー」が生成される
<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 (わたるふさん)
練習(HTMLテーブルの作成) 57 ① JSONからHTMLデータを出力しましょう 名前 パンダ ライオン ペンギンロボ [ "パンダ",
"ライオン", "ペンギンロボ" ]
まとめ
まとめ データ操作を使いこなすと Power Automate で 実現可能な事が増えます! 是非使いこなして 素敵なフローを作成してください 59
ありがとうございました 60