20230520_Power Automateによる配列操作でハマったこと・解決した方法

17.2K Views

May 20, 23

スライド概要

気ままに勉強会 #56 でLTをさせていただいたときの登壇資料です。
https://kimamani.connpass.com/event/283783/

profile-image

Microsoft 365、Power Platrform、PowerShellについて調べたことや検証したこと

シェア

埋め込む »CMSなどでJSが使えない場合

関連スライド

各ページのテキスト
1.

Power Automateによる 配列操作で ハマったこと・解決した方法 気ままに勉強会 #56 今回のお題:Power Automate なんでもLT会~ 第11回 ~ 2023/5/20 1

2.

自己紹介 • 名前: わたるふ • Twitter: @wataruf01 • ブログ: ルドルフもわたるふもいろいろあってな ・マシュマロ: wataruf01 • GitHub: wataruf01 • SharePoint Server 2007 からMicrosoft 製品に関わる • PowerShell が好き • Microsoft Teams が好き • 今はPower Automate に熱中 • 個人的に調べたことや検証したことなどをブログで公開しています 2

3.

注意事項 • 解説する内容は私の個人的な見解が含まれています • 内容に誤りがある場合はご指摘をいただけると助かります 3

4.

今回のお話 Power Automateによる 配列操作で ハマったこと・解決した方法 フローの配列操作に まだ慣れていないときに 一番悩んだ課題と それを突破した方法のお話です 次のスライドへ 4

5.

主旨 簡易版 JSON Dictionary という手法をあみだしたら フローの設計・実装の効率がぐっと上がりました 5

6.

フローの基本パターンについて (1/4) Power Automate のフローは 1つのトリガー と 1つ以上のアクションで構成されています。 トリガー フローの開始条件であるイベント ➢ 「イベント」とは アクションA ユーザー操作、システム処理、または状態の変 化 自動化された個々の処理 アクションB ➢ 例:メール送信、ファイル 更新 アクションC … 6

7.

フローの基本パターンについて(2/4) フローの基本パターンと入出力情報はこうなります ・【入力】 フローを開始するきっかけなった操作にともなうコンテキスト情報 トリガー ・【出力】 入力情報、および、トリガーの処理の結果として生成された情報 中間アクションA ・【入力】 トリガーの出力、 または先に実行された中間アクションの出力 中間アクションB 最終アクション ・【出力】 アクションの結果として生成された情報 ・【入力】 中間アクションの出力 ・【出力】 このフローの最終的な目的である処理 7

8.

フローの基本パターンについて(3/4) 「先に実行された処理の出力」が「後続のアクションの入力」になってい ることがポイントです。 ・【入力】 フローを開始するきっかけなった操作にともなうコンテキスト情報 トリガー ・【出力】 入力情報、および、トリガーの処理の結果として生成された情報 中間アクションA ・【入力】 トリガーの出力、 または先に実行された中間アクションの出力 中間アクションB 最終アクション ・【出力】 アクションの結果として生成された情報 ・【入力】 中間アクションの出力 ・【出力】 このフローの最終的な目的である処理 8

9.

フローの基本パターンについて(4/4) この数珠つなぎの入出力をいかに無駄なくスマートに行うかが フローつくりのポイントです トリガー ・【入力】 ・【出力】 中間アクションA 例: • 必要な情報のみを抽出 • データの変換 (例:タイムゾーンをUTCから日本時間にする) ・【入力】 ・【出力】 例: 中間アクションB • 最終アクションの入力として使えるように データを整形 (例:配列を作成) 最終アクション ・【入力】 ・【出力】 9

10.

ここからがハマったことのお話。。そのときの課題 SharePointサイトのライブラリにアップロードされたファイルに対して権 限を自動付与するフローを実現したい 使用する権限は既定で存在するすべてのアクセス許可レベルである さあ トリガー、中間アクション、 最終アクションを それぞれどうつくる? 10

11.

まずは基本パターンのフロー図に当てはめる 下図の通りになります トリガー 【フローの開始条件】 ファイルがアップロードされたとき 中間アクションA 中間アクションB そのサイトにあるアクセス許可レベルを すべて取得 既定で存在するアクセス許可レベルのIDを それぞれ取得する 最終アクション トリガーの起点となったファイルに権限を設定 11

12.

ポイントになるのは「中間アクション」 最終アクションの入力情報を提供するアクションの組み方がポイント トリガー 【フローの開始条件】 ファイルがアップロードされたとき 中間アクションA 中間アクションB そのサイトにあるアクセス許可レベルを すべて取得 既定で存在するアクセス許可レベルのIDを それぞれ取得する 最終アクション トリガーの起点となったファイルに権限を設定 12

13.

中間アクションにフォーカスして見てみる(1/5) まずは必要なデータの取得 中間アクションA そのサイトにあるアクセス許可レベルを すべて取得 HTTP要求で アクセス許可レベルを JSON形式で取得します 13

14.

中間アクションにフォーカスして見てみる(2/5) アクセス許可レベルがJSONで取得できました 中間アクションA そのサイトにあるアクセス許可レベルを すべて取得 はい。 ここまでは 何の問題もないです 14

15.

中間アクションにフォーカスして見てみる(3/5) 権限付与で使うためにアクセス許可レベルのIDを取得します 既定で存在するアクセス許可レベルのIDを 中間アクションB それぞれ取得する 「アレイのフィルター処理」 を使って 対象の要素を取得します 15

16.

中間アクションにフォーカスして見てみる(4/5) フィルタ処理で対象のアクセス許可レベルの要素を取得することができます 既定で存在するアクセス許可レベルのIDを 中間アクションB それぞれ取得する 16

17.

中間アクションにフォーカスして見てみる(5/5) アクセス許可レベルひとつひとつにフィルタのアクションが必要 中間アクションB 既定で存在するアクセス許可レベルのIDを それぞれ取得する 権限付与アクションで 使用する対象が増減すると ←フィルタのアクション このアクションの必要個数も 変わってしまいます ←フィルタのアクション ←フィルタのアクション ←フィルタのアクション ←フィルタのアクション 17

18.

ハマったポイントとは何か? 設計・実装に悩まされたポイントはここ トリガー 最終的に実現したいこと つまり、ファイルの権限設定で 使用するアクセス許可レベルに 中間アクションA 増減があると、、、 中間アクションB その入力情報を提供する 中間アクションの設計・実装に 影響が及んでしまう 最終アクション この依存関係を回避したい 18

19.

それを解決するためにあみだした手法があります それが「簡易版 JSON Dictionary」です。 19

20.

「簡易版 JSON Dictionary」とは Key-Value形式で情報を検索できる配列をつくる手法です 20

21.

「簡易版 JSON Dictionary」はどうやって使う? 基本パターンのフロー図に当てはめると下図の通りになります トリガー 【フローの開始条件】 ファイルがアップロードされたとき 中間アクションA 中間アクションB そのサイトにあるアクセス許可レベルを すべて取得 アクセス許可レベルの配列を JSON Dictionary に変換する 最終アクション トリガーの起点となったファイルに権限を設定 21

22.

JSON Dictionary の作り方(1/5) :選択アクション アクセス許可レベルのJSONを「選択」アクションを使って下記のKeyとValueを持つ配列 に配列に変換します • 【Key】 アクセス許可レベルの名前 • 【Value】 アクセス許可レベルのID "from": "@outputs('SharePoint_に_HTTP_要求を送信します')?['body']?['d']?['results']", "select": { "@{item()?['Name']}": "@item()?['Id']" } 22

23.

JSON Dictionary の作り方(2/5) :選択アクション 選択アクションの出力は下図の通りです。 この構成ではまだ KeyでValueを 取得することができません もうひと手間を加えます 23

24.
[beta]
JSON Dictionary の作り方(3/5) :Dictionary形式に変換
選択アクションの出力を下記の式を使ってDictionary形式に変換します
1.

string関数でJSONを文字列に変換

2.

replace関数で不要な文字列を削除

3.

concat関数を使って全体を中括弧で閉じなおす

4.

json関数でそれをJSONに再変換する

"inputs": "@json(concat('{',replace(replace(replace(replace(string(body('選択-Ke
y(アクセス許可レベルの名前)とValue(ID)の配列を作る')),'{',''),'}',''),'[',''),']',''),'}'))",

24

25.

JSON Dictionary の作り方(4/5) :Dictionary形式に変換 これで完成です これなら KeyでValueを検索できます 25

26.

この手法は様々なフローの作成で活用しています Microsoft Teamsで投稿に「いいね」をしていな いひとに対してスケジュール実行でメンションす る Microsoft Formsのフォームに回答 していないひとに対して自動でメ ンションする URLのクエリストリングを配列として取得する Power Automate でCSVのデータを配 列に変換する 1から100まで自然数から「3の倍数」 「4の倍数」「3の倍数、かつ、4の倍 数」を見つける ExcelテーブルでIDが同じ行の内容欄 を結合する ExcelのテーブルをClearCollect関 数の実行文に変換する 26

27.

ちなみに 今回の内容についてサンプルつきでブログで解説しています。 JSON Dictionary の簡易版という手法を作りました。 https://wataruf.hatenablog.com/entry/2022/06/08/000000 2022/9/7 27

28.

まとめ 汎用的に使えるアイディアひとつあるだけでフローが劇的に良くなります。 フローの組み方について 「これは仕様だと思ってあきらめている」 「もっと良い組みかたはないかな?」 と思っていることがありましたらぜひ共有してみてください。 面白い課題があれば私もぜひ一緒に考えます。(*’ω’*) 28