Power Automate で JSON を扱う|箱モデルで読む・作成で取り出す・解析で全部使う

Power Automate 実践・Tips

📝 この記事は、Power Automate で JSON を扱う方法を、
実際に動かしながら整理したものです。
式や関数の仕様は
Microsoft 公式(ワークフロー式の関数リファレンス)で確認しています。

🧭 なぜこの記事を書いたのか
2022年から社内で Power Automate を広めてきて、いちばん多くの人が足を止めるのが JSON です。
記号が並んでいるだけで「自分には無理」と判断されてしまう。
実際には覚える記号は2つ、使うアクションは2つしかありません。そこを1本にまとめました。

実行履歴を開くと、波括弧と角括弧が並んだ文字列が出てきます。これが JSON です。
動的コンテンツに欲しい値が出てこないのも、たいていここが原因です。
この記事では、読み方 → 1つだけ取り出す → 全部使えるようにするの順で通します。

JSON を扱った回のアンケートに「抵抗が少なくなった」という声がありました。
説明する内容を「記号2つだけ」に絞ってからの回でした。あれこれ足すより、減らしたほうが届くようです。

📋 この記事で分かること

  • JSON を「棚 → 引き出し → 中身」の3段で読む考え方
  • 1つだけ値が欲しいときの作成(Compose)の使い方
  • 全部を動的コンテンツにしたいときのJSON の解析
  • outputs()body() の違い(ここを外すと式が通りません)
  • null で止まらないようにする書き方
  • 文章に式を混ぜるときに @{ } が要る理由

まず読み方:棚・引き出し・中身の3段

棚([ ])・引き出し({ })・中身{ } = 引き出しが並んだ1つの箱名前“田中”金額1000承認trueキーを指定して1つ取り出す[ ] = 箱を並べた棚{ }1件ぶんのデータ{ }1件ぶんのデータ{ }1件ぶんのデータ何番目か、または全部まわして使う
[ ] が来たら Apply to each が出てくる。中身は { } の集まり

JSON の構造は3段で捉えると迷いません。

配列([ ])= 棚|引き出しがいくつも並んでいる状態。
オブジェクト({ })= 引き出し1つ|1件ぶんの情報のまとまり。
キーと値 = 引き出しの中身|取り出す最小単位。

覚える記号はこの2つだけです。角括弧が来たら「複数ある」、波括弧が来たら「1件ぶん」
入れ子はこの2つが交互に出てくるだけなので、順にたどれば必ず読めます。

💡 Apply to each が勝手に出てくる理由
一覧を取得するアクションの戻りは、たいてい配列です。
配列の中の1件を使おうとすると、Power Automate は
「では全件まわしますね」と判断して Apply to each を自動で足します。
つまり Apply to each が出たら、いま扱っているのは棚だというサインです。

なぜ動的コンテンツに出てこないのか

API のレスポンスなどを受け取ったとき、中身が見えているのに動的コンテンツの一覧に出てこないことがあります。

これは Power Automate 側が、その文字列をまだ「ただの文字列」として持っているためです。
中に何が入っているかを知らないので、項目として提示できません。

解決の道は2つあります。1つだけ欲しいなら「作成」で式を書く
全部を項目として使いたいなら「JSON の解析」でほぐす。順に見ます。

方法①:作成(Compose)で1つだけ取り出す

欲しい値が1〜2個なら、スキーマを定義するより式を1本書くほうが早く済みます。

1基本の形

アクションの戻りからキーを指定します。

body('HTTP要求')?['name']

これを「作成」アクションの入力欄に書けば、出力としてその値が得られます。

2入れ子は続けて書く

階層が深いときは、そのまま連ねます。

body('HTTP要求')?['user']?['email']

棚と引き出しをたどる順に書いていくだけです。

3配列から1件目を取る

角括弧に番号を入れます。番号は0から始まります。

body('HTTP要求')?[0]?['name']

1件目が [0] です。ここは間違えやすいところです。

4アクションに名前を付ける

作成アクションの名前は、あとで参照するときの識別子になります。「申請者名を取得」のように、何を取り出しているかが分かる名前にしておきます。

🔎 作成アクションを「式の置き場」として使う
式を後続アクションの入力欄に直接書き込むと、あとから読めなくなります。
作成アクションに切り出しておけば、実行履歴でその出力だけを確認できるので、
どこで値が壊れたかがすぐ分かります。修正する場所も1か所に集まります。

式を直接埋め込んだフローは、3か月後に自分で読めなくなります。
名前を付けた作成アクションに逃がしておくと、実行履歴を開いたときに追えます。ひと手間かかりますが、私はこの形にしています。

方法②:JSON の解析で全部を項目にする

同じデータから何度も値を取り出すなら、最初にほぐしておくほうが結局ラクです。

1アクションを追加する

「JSON の解析」を追加し、コンテンツ欄に前のアクションの出力を指定します。

2スキーマを自動生成する

スキーマ欄は手書きしません。「サンプルから生成」に実際のレスポンスを貼り付ければ、構造を読み取って作ってくれます。

{{"name": "田中太郎", "amount": 40000, "approved": true}}

3後続で動的コンテンツとして選ぶ

解析を通したあとは、name・amount・approved が動的コンテンツの一覧に並びます。あとは選ぶだけです。

🧩 スキーマは「どんな形が来るか」の宣言

スキーマと聞くと身構えますが、やっていることは
「この形の箱が来ます」と先に伝えているだけです。
形が分かっているから、Power Automate は中身を項目として提示できます。

ここから先が、実務で効いてくるところ

ここまでは手順です。実際に止まるのは、次の4つのどれかであることがほとんどです。

📌 outputs() と body() は返すものが違う

outputs() と body() は返すものが違うoutputs(‘HTTP’) = 封筒ごと全部statusCode200headers{ … }body「ほしい中身」body(‘HTTP’)はこれだけ作成(Compose)だけは例外。body を持たないので outputs(‘作成’)
式のトラブルで一番多い原因。Compose だけ例外になる

この2つは似ていますが、返ってくるものが別物です。

outputs('アクション名') は、そのアクションの出力をまるごと返します。
コネクタのアクションなら、statusCodeheaders まで含んだ形です。

outputs('HTTP') → {{ "statusCode": 200, "headers": {{…}}, "body": {{…}} }}

body('アクション名') は、そのうちのbody の部分だけを返します。

body('HTTP') → {{ "name": "田中太郎", … }}

つまり欲しい値が body の中にあるなら body() を使うのが基本です。
outputs() で書いて中身が取れないときは、?['body'] が一段抜けています。

作成(Compose)アクションは例外です。
作成アクションには body がありません。参照するときは outputs('作成') を使います。
ここだけ扱いが違うので、覚えておくと迷いません。

式が思ったとおりに動かないという話は、これが原因のことが多いです。
「合っているはずなのに空になる」というとき、outputs と body の取り違えだったことが何度かありました。

📌 「?」を付ける意味と、null が来たときの備え

式の中の ? は、そのキーが無くてもそこで止まらないようにするための書き方です。
付けずに存在しないキーを参照すると、フローはエラーで停止します。

ただし ? を付けても、返ってくるのは null です。
null のまま後続に渡すと、そこで別のエラーになります。

空だったときの既定値を決めておくなら coalesce() を使います。
この関数は並べた中から最初の null でない値を返します。全部 null なら null を返します。

coalesce(body('HTTP')?['nickname'], body('HTTP')?['name'], '(名前なし)')

この書き方なら、ニックネームが無ければ本名、それも無ければ固定文字、と段階的に落とせます。

🧪 スキーマは「作った時点の形」に固定される
「JSON の解析」は、生成したスキーマと実際のデータが食い違うと失敗します。
とくにあるはずの項目が null で返ってきたときに止まりやすいところです。
値が入らないことがある項目は、スキーマ側で
null も受け付ける型に直しておくと安定します。

📌 文章に式を混ぜるときは @{ } が要る

メール本文のように、文字列の中に式を差し込む場面があります。
このとき、式をそのまま書くと解釈されません。

公式にも、インラインで書くときは波括弧で囲む形にする、と明記されています。

正しい:〜/@{{outputs('作成')}}/〜

誤り :〜/@outputs('作成')/〜

式だけを入力欄に置くときは波括弧は不要で、
文章と混ぜるときだけ必要になります。この違いを知らないと、
「同じ式なのに動いたり動かなかったりする」ように見えます。

📌 ループの中では item() と items()

Apply to each の中では、いま処理している1件を指す関数が用意されています。

item()|そのループの現在の要素を返します。
items('ループ名')|名前を指定して、そのループの現在の要素を返します。

ループが入れ子になったとき、item() だけだと
どちらのループを指しているか分からなくなります。
入れ子にするなら items(‘ループ名’) で明示するのが安全です。

実行履歴で JSON を読む

式を書く前に、実物を見るのがいちばん早いです。
実行履歴を開いて、アクションを1つクリックすると「入力」と「出力」が出てきます。

ここに表示されているのが、そのアクションが受け取ったものと返したものです。
動的コンテンツに出てこない値でも、ここには出ています。式は、この画面を見ながら組み立てます。

見るときのコツはいちばん外側から順にたどることです。
角括弧で始まっていれば配列なので、まず [0] で1件目を開く。
波括弧で始まっていればオブジェクトなので、キー名をそのまま書く。
この2択をくり返すだけで、どんな深さでもたどり着けます。

🔍 「出力」をコピーしてスキーマに貼る
実行履歴の出力をそのままコピーして、「JSON の解析」の
サンプルから生成に貼れば、実データに合ったスキーマができます。
手で書くより速く、間違いも起きません。

あわせて覚えたい関数

JSON を扱いはじめると、次の4つがよく必要になります。どれも1行で書けます。

件数を数える|配列がいくつあるかを見ます。0件のときの分岐にも使えます。

length(body('HTTP要求'))

最初と最後を取る|並び順が決まっているなら、これで足りることが多いです。

first(body('HTTP要求'))?['name'] / last(body('HTTP要求'))?['name']

1本の文字列にまとめる|配列をメール本文に並べたいときに使います。

join(body('選択'), '、')

必要な件だけ残す|「フィルター配列」アクションで絞ってから、上の関数を使うと扱いやすくなります。

0件のときを必ず考えておくこと。
first() は、配列が空だと値を返せません。
件数で分岐してから使うか、coalesce() で既定値を用意しておくという形にしておくと止まりません。

実務での使いどころ

JSON が読めると、扱えるものが一気に増えます。よく出てくるのはこの3つです。

API の応答を使う|社内システムや外部サービスから受け取った結果を、
そのままフローの後続で使えるようになります。

一覧の中から必要な行だけ処理する|SharePoint や Excel から取得した配列を、
条件で絞ってから回します。全件まわすより速く、失敗も減ります。

アダプティブカードを組み立てる|Teams に送るカードは JSON そのものです。
構造が読めれば、既存のカードを直して使い回せます。

どちらを使うかの判断

✅ 使い分けの目安

  • 作成(Compose)|取り出す値が1〜2個。まず動かして確かめたいとき
  • JSON の解析|同じデータから何度も値を使うとき。動的コンテンツで選びたいとき

迷ったら作成から始めて構いません。
参照する箇所が3か所を超えたあたりから、解析に切り替えたほうが読みやすくなります。

まとめ

📌 この記事のポイント

  • JSON は棚[ ]→ 引き出し{ }→ 中身の3段。覚える記号は2つだけ
  • 1つだけ欲しいなら作成、全部使うならJSON の解析
  • outputs() は丸ごと、body() は本体だけ。作成アクションだけは outputs()
  • ? は止まらないための書き方。空の備えは coalesce()
  • 文章に混ぜるときは @{ }、単独なら不要

📚 仕様の出典

outputs()body()coalesce()item()items() の戻り値と、
インラインで式を書くときの波括弧の扱いは、
ワークフロー式の関数リファレンス(Microsoft Learn)
記載されている内容です。

PA45 は毎週やっています

テーマを1つに絞った45分のオンライン講座です。プログラミング未経験でも、手を動かしながら1つずつ覚えられます。

次回のPA45を見る

※ 本記事は公開日時点の内容です。筆者が実際に試した手順をまとめたもので、
Power Automate の仕様は今後変わる可能性があります。
※ 記事の構成・図解の一部は、AIを壁打ち相手にしながら作成しています。

\ 最新情報をチェック /

💌

最新のPower Automate Tipsを毎日チェック

1枚スライドで関数・概念をわかりやすく解説しています。

𝅧 @isamu_Automate をフォロー →

PA45 — 45分でPower Automateを一緒に学ぼう

毎週木曜夜・オンライン・無料のハンズオン講座。初心者歓迎。

次回PA45に参加する →

コメント

PAGE TOP