20251213_JSON_Dictionaryを活用してPower_Automateフロー作成をちょっとスマートにするお話

729 Views

December 13, 25

スライド概要

気ままに勉強会 #131
https://kimamani.connpass.com/event/378071/

profile-image

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

シェア

またはPlayer版

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

ダウンロード

関連スライド

各ページのテキスト
1.

JSON Dictionaryを活用して Power Automate フロー作成を ちょっとスマートにするお話 気ままに勉強会 #131 気ままになんでもLT会~第10回~ 2025/12/13 1

2.

自己紹介 • 名前: • 活動場所 わたるふ • ブログ (主な活動場所) ルドルフもわたるふもいろいろあってな https://wataruf.hatenablog.com • こんなひとです • SharePoint Server 2007 からお仕事でMicrosoft 製品に関わる • PowerShell が好き • 公開している登壇資料 https://www.docswell.com/user/wataruf01 • Microsoft Teams が好き • Power Automate が特に好き • マシュマロ (質問を受け付けています) • 活動内容 • 調査・検証したことなどをブログで解説しています • 開発したもの (主にPower Automate のクラウドフロー) をGitHubで公開しています https://marshmallowqa.com/wataruf01?utm_medium=url_text&utm_ source=promotion Microsoft MVP for Business Applications (2023/4~) 2

3.

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

4.

背景 2023年5月20日開催の気ままに勉強会で Power Automate におけるJSON Dictionary の活用方法についてお話しました。 まずは そのときの登壇内容を 振り返りを行います 当時の登壇内容を 次のスライド以降で説明します 4

5.

2023年5月20日開催の気ままに勉強会 登壇内容 「Power Automateによる配列操作で ハマったこと・解決した方法」 当時の表紙スライド 5

6.

主旨 再掲(2023年5月20日 登壇資料) 簡易版 JSON Dictionary という手法をあみだしたら フローの設計・実装の効率がぐっと上がりました 6

7.

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

8.

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

9.

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

10.

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

11.

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

12.

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

13.

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

14.

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

15.

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

16.

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

17.

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

18.

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

19.

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

20.

それを解決するためにあみだした手法があります 再掲(2023年5月20日 登壇資料) それが「簡易版 JSON Dictionary」です。 20

21.

「簡易版 JSON Dictionary」とは 再掲(2023年5月20日 登壇資料) Key-Value形式で情報を検索できる配列をつくる手法です 21

22.

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

23.

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

24.

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

25.

今日の主旨 25

26.

今回のお話 JSON Dictionaryを活用して Power Automate フロー作成を ちょっとスマートにするお話 26

27.

そもそもJSONとは JSONとはデータを「名前(キー)」と「値」の組み合わせで 表現するデータ形式です。 人間が読んでも直観的に理解しやすいシンプルな構造であることが特徴です。 例 27

28.

次に、Dictionaryとは DictionaryもJSONとおなじく、データを「キー(名前)」と「値」の組み合わせで扱う 考え方です。 JSONが「データをどう書くか」という表現形式を指すのに対し、Dictionaryは 「キーを指 定して値を取り出す」ことを目的としたデータの使い方・構造を指します。 例 28

29.

つまり、JSON Dictionaryとは 「辞書」とは本来、言葉を引くとその意味が1つ決まって返ってくるものです。 JSON Dictionaryも同じ考え方で、名前(キー)を指定すると、対応する値が1つ返るように作られて います。つまり、JSON Dictionaryとは「キー(Key)を指定すると対応する値(Value)を取り出せる データ(辞書) 」をJSON形式で表現したものです。 例 29

30.

JSON Dictionaryを使うとどう便利なの? 2つの例題を使って説明します • 例題1: 勘定科目を債権債務区分に置き換える • 例題2:自動送信メールにおける本文テンプレートの多言語対応 30

31.

JSON Dictionaryを使うとどう便利なの? 2つの例題を使って説明します • 例題1: 勘定科目を債権債務区分に置き換える • 例題2:自動送信メールにおける本文テンプレートの多言語対応 31

32.

例題1: 勘定科目を債権債務区分に置き換える 【課題】 表「取引先別残高」の列「勘定科目」を別表のルールをもとに列「債権債務区分」に置き換える 取引先別残高 収支先名 勘定科目 金額 株式会社AAA 売掛金 100 取引先別残高 株式会社BBB 買掛金 30 収支先名 勘定科目 ⇒ 債権債務区分 株式会社CCC 未払金 450 株式会社AAA 売掛金 ⇒ 債権 100 株式会社DDD 売掛金 600 株式会社BBB 買掛金 ⇒ 債務 30 株式会社CCC 未払金 ⇒ 債務 450 株式会社DDD 売掛金 ⇒ 債権 600 【別表】勘定科目ごとの債権債務区分 勘定科目 債権債務区分 売掛金 債権 未収入金 債権 買掛金 債務 未払金 債務 金額 32

33.

例題1: 勘定科目を債権債務区分に置き換える 条件:2つの表をそれぞれSharePointリストにする 取引先別残高 収支先名 勘定科目 金額 株式会社AAA 売掛金 100 株式会社BBB 買掛金 30 株式会社CCC 未払金 450 株式会社DDD 売掛金 600 SharePointリストで表す 【別表】勘定科目ごとの債権債務区分 勘定科目 債権債務区分 売掛金 債権 未収入金 債権 買掛金 債務 未払金 債務 SharePointリストで表す 33

34.

例題1: 勘定科目を債権債務区分に置き換える 条件:それぞれの表にあるアイテムを「複数の項目」で取得する 34

35.

例題1: 勘定科目を債権債務区分に置き換える 【課題】下図の出力を得るには最低限どんなアクションを追加ればよいか 出力 必要なだけ アクションを追加する (複数の場合あり) 最後はこのアクション ! 35

36.

例題1: 勘定科目を債権債務区分に置き換える 正解: 「選択」アクションと 「作成」アクションだけで 実現できます 36

37.

例題1: 勘定科目を債権債務区分に置き換える 出力 ここでJSON Dictionaryを 作ります 37

38.

例題1: 勘定科目を債権債務区分に置き換える ここでJSON Dictionaryを 使います ※詳しくは次スライドでお見せします 出力 38

39.

例題1: 勘定科目を債権債務区分に置き換える 処理後の「取引先別残高」 入力情報は「取引別残高」のアイテム一覧 = 収支先名 勘定科目 ⇒ 債権債務区分 金額 株式会社AAA 売掛金 ⇒ 債権 100 株式会社BBB 買掛金 ⇒ 債務 30 株式会社CCC 未払金 ⇒ 債務 450 株式会社DDD 売掛金 ⇒ 債権 600 item()?['AccountTitle’]] outputs('作成:勘定科目を債権債務区分に変換-JSON_Dictionary')?[ = JSON Dictionaryで 勘定科目(AccountTitle)というKeyを指定して 債権債務区分というValueを取得します 例題1 完了 39

40.

JSON Dictionaryを使うとどう便利なの? 2つの例題を使って説明します • 例題1: 勘定科目を債権債務区分に置き換える • 例題2:自動送信メールにおける本文テンプレートの多言語対応 40

41.

例題2:自動送信メールにおける本文テンプレートの多言語対応 【課題】選択された言語の本文テンプレートを使ってメールを送信する 日本語ver 英語ver 41

42.

例題2:自動送信メールにおける本文テンプレートの多言語対応 【課題】テンプレートで満たすべき要件は下記の4つ 日本語ver ① 件名が、指定された言語であること ③ 宛名をいれること ② 本文が、指定された言語であること 英語ver ④ 回答フォームURLを指定できること 42

43.

例題2:自動送信メールにおける本文テンプレートの多言語対応 【条件】下記の通りメールの件名・本文・回答フォームURLを定義したSharePointリストを用意する (JSON Dicitionary の元ネタ用) 43

44.

例題2:自動送信メールにおける本文テンプレートの多言語対応 【条件】下記の通りJSON Dictionary とSharePointリストの1件分の情報を取得します 出力 出力 44

45.

例題2:自動送信メールにおける本文テンプレートの多言語対応 【課題】要件をすべて満たすメールを送信するためには最低限どんなアクションを追加ればよい か 日本語ver 出力 必要なだけ アクションを追加する (複数の場合あり) 最後はこのアクション ! 45

46.

例題2:自動送信メールにおける本文テンプレートの多言語対応 回答: 「メールの送信」アクション だけで実現できます 46

47.
[beta]
例題2:自動送信メールにおける本文テンプレートの多言語対応
▼宛先
outputs('作成:台帳の1件目')?['メールアドレス']

▼件名
outputs('作成-SystemSettings-JSON_Dictionary')?[concat('情報提供依頼メール_件名_',
outputs('作成:台帳の1件目')?['言語'])]

▼本文
replace(
replace(
replace(
outputs('作成-SystemSettings-JSON_Dictionary')?[
concat(
'情報提供依頼メール_本文_',
outputs('作成:1件目')?['言語']
)
],
'{% 本人氏名 %}',
outputs('作成:1件目')?['本人氏名']
),
'{% 回答フォームURL %}',
concat(
'<a href="',
outputs('作成-SystemSettings-JSON_Dictionary')?['情報提供依頼_回答フォームURL'],
'">',
outputs('作成-SystemSettings-JSON_Dictionary')?['情報提供依頼_回答フォームURL'],
'</a>'
)
),
decodeUriComponent('%0A'),
'<br/>'
)

47

48.
[beta]
例題2:自動送信メールにおける本文テンプレートの多言語対応
▼宛先
outputs('作成:台帳の1件目')?['メールアドレス']

▼件名
outputs('作成-SystemSettings-JSON_Dictionary')?[concat('情報提供依頼メール_件名_',
outputs('作成:台帳の1件目')?['言語'])]

▼本文
replace(
replace(
replace(
outputs('作成-SystemSettings-JSON_Dictionary')?[
concat(
'情報提供依頼メール_本文_',
outputs('作成:1件目')?['言語']
)
],
'{% 本人氏名 %}',
outputs('作成:1件目')?['本人氏名']
),
'{% 回答フォームURL %}',
concat(
'<a href="',
outputs('作成-SystemSettings-JSON_Dictionary')?['情報提供依頼_回答フォームURL'],
'">',
outputs('作成-SystemSettings-JSON_Dictionary')?['情報提供依頼_回答フォームURL'],
'</a>'
)
),
decodeUriComponent('%0A'),
'<br/>'
)

余談ですが・・・

ここまで複雑な式は
可読性とメンテナンス性を
考慮した方法に
置き換えることを推奨します。

例題2 完了

48

49.

つまりJSON Dictionaryの便利さとは • 「何らかの値」を「別の値に置き換える」という処理を 簡単に行うことができる(繰り返し処理を省略できるケースが多い) • 置き換えのマッピング表に変更があった場合でも JSON Dictionaryの作成処理は 何も手を加えなくてOK 49

50.

JSON Dictionaryの使いどころ 例題2で解説したSystemSettingsリストはフローの用途に限らず 活用できる方法なのでおすすめします。(※下図は活用例です) フロー フロー 子フローとして 使用 System Settingsリストに 子フローとして 使用 登録されているアイテム一覧を JSON Dictionaryに変換するフロー 参照 フロー 子フローとして 使用 フローの設定値を定義しているSharePointリスト (System Settings) 50

51.

JSON Dictionary の作り方(1/4) :選択アクション アクセス許可レベルのJSONを「選択」アクションを使って下記のKeyとValueを持つ配列 に配列に変換します 例 • Keyとして使いたい列 ・・・ 「SettingKey」列 • Valueとして使いたい列 ・・・ 「SettingValue」列 51

52.

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

53.

JSON Dictionary の作り方(3/4) :式を使って変換 選択アクションの出力を Dictionary 形式に変換する手順 ①string 関数 json( replace( substring( string( body('選択-Key(Settingkey)とValue(SettingValue)の配列を作成') ), 1, sub( length( string( body('選択-Key(Settingkey)とValue(SettingValue)の配列を作成') ) ), 2 ) ), '},{', ※2023年5月20日開催 ',' 気ままに勉強会で解説した式を ) 改良しました ) 選択アクションの出力(JSON 配列)を 文字列に変換する ②substring 関数 先頭の [ と末尾の ] を削除する ③replace 関数 },{ を , に置き換え、複数オブジェクトを1つにまとめる ④json 関数 整形した文字列を JSON に再変換し、 Dictionary として扱えるようにする 53

54.

JSON Dictionary の作り方(4/4) :完成 これで完成です これなら KeyでValueを検索できます 54

55.

解説は以上です 今後ブログでより詳しい内容を掲載する予定です。 55

56.

Power AutomateのフローやTIPSをブログで公開しています • 興味を持っていただけたかたは下記のURLからいらしてください https://wataruf.hatenablog.com 56

57.

ましゅまろで質問をうけつけています • 匿名でのご質問も可です。 • X(旧Twitter)にマシュマロのリンクを公開しています。 • 回答内容はブログで投稿します。 57

58.

最後に JSON Dictionaryを活用してPower Automate フロー作成を ちょっとスマートにするお話をさせていただきました。 これがどなたかのお役に立てれば幸いです。 フィードバック・ご意見をいただけると とても嬉しいです。 58