Power Automate(パワーオートメイト)のクラウドフローは、動的なコンテンツを選んでいくだけでもある程度は作れます。ただ、「日付を日本時間で 2026/10/31 の形にしたい」「件名から問い合わせ番号だけ抜き出したい」「空の欄があるとフローが落ちる」のような場面は、式を書かないと解決しません。この記事では、式の入れ方、小さな会社のフローでよく使う関数の一覧、UTCの日時を日本時間に直す方法、変数と「作成」の使い分け、JSONの値の取り出し方、null や型の違いで失敗するときの直し方を、社員15名ほどの「サンプル工務店」の例で書きます。関数の名前と書き方は、Microsoftのワークフロー定義言語の関数リファレンスで2026年10月時点のものを確かめています。
この記事の内容
先に決めること
式を書き始める前に、決めておくことが3つあります。
1. 日時をどのタイムゾーンで持つか
Power Automateの中の日時は、ほとんどがUTC(協定世界時)です。utcNow() はUTCで返り、SharePoint リストの日付やメールの受信日時も、実際に動かすとUTCで返ってくることがほとんどです。実行履歴の出力で、値の末尾に Z が付いていればUTCです。日本時間はUTCより9時間進んでいるので、そのまま表示すると朝8時に届いたメールが「前日の23時」と出ます。「比べたり計算したりするのはUTCのまま、人に見せる直前にだけ日本時間に直す」と決めておくと、ずれが起きにくくなります。
2. アクションの名前を先に付ける
式の中では、前のアクションの結果を body('アクション名') や outputs('アクション名') で呼びます。アクション名を「作成 3」「条件 2」のまま式を書くと、あとで名前を変えたときに式が壊れ、何を指しているかも読めなくなります。アクションを置いたらすぐ、「件名から番号を抜く」のように中身の分かる名前に変えてから式を書きます。名前の空白は、式の中では _ に置き換わります。
3. 式で済ませるか、別のアクションにするか
式は1つの欄に長く書けますが、長い式は直す人が読めません。式の長さには8,192文字の上限もあります。実際に運用していると、関数を3つ以上重ねたあたりで直す人が間違え始めます。途中の結果を「作成」アクションに分けて名前を付け、次の式でその結果を使う形にすると、実行履歴でどこまで正しく動いたかを1段ずつ確かめられます。
式の入れ方
式エディターで書く
- 「マイ フロー」で対象のフローを開き、「編集」を押す
- 式を入れたいアクションを選ぶ
- 構成ウィンドウで、式を入れたい欄を選ぶ
- 欄の横に出る
fxを押す - 式エディターに式を書き、「追加」を押す

式エディターでは、動的なコンテンツの値を式の中に差し込めます。式の途中で動的なコンテンツのタブに切り替えて値を選ぶと、triggerOutputs()?['body/subject'] のような形で入ります。クラシック デザイナーでは、動的なコンテンツの一覧の中に「式」のタブがあります。
欄に文字と式を混ぜたいときは、@{ } で囲みます。たとえばメールの件名に「お問い合わせ(10/31)」と入れたいときは、欄に次のように書けます。
お問い合わせ(@{formatDateTime(utcNow(), 'M/d')})
Copilot で式を作る
新しいデザイナーには、Copilot 式アシスタントがあります。2026年10月時点ではプレビューの機能で、テナントで Copilot が有効になっている場合に使えます。
- 式を入れたい欄を選び、
fxを押す - 式エディターで「Copilot で式を作成」を選ぶ
- 「件名から No. の後ろの番号を取り出す」のように、作りたい式を文章で書く
- 「式の作成」を押す
- 出てきた式を確かめ、「OK」→「追加」を押す

すでに書いた式を選んでから使うと、その式を直す依頼もできます。かっこの閉じ忘れのようなエラーのある式も直してくれます。ただし、出てきた式が正しいとは限りません。生成された式は必ず実行して、実行履歴で結果を確かめてから使います。関数の意味を知らずに使うと、次に壊れたときに直せません。以下の一覧は、そのときに読めるようにするためのものです。
よく使う関数の一覧
| 関数 | やること | 例 | 結果 |
|---|---|---|---|
formatDateTime() | 日時を指定の形にする | formatDateTime('2026-10-31T08:00:00Z', 'yyyy/MM/dd') | 2026/10/31 |
convertTimeZone() | 日時をあるタイムゾーンから別のタイムゾーンへ | convertTimeZone(utcNow(), 'UTC', 'Tokyo Standard Time', 'HH:mm') | 日本時間の時刻 |
convertFromUtc() | UTCの日時を指定のタイムゾーンへ | convertFromUtc(utcNow(), 'Tokyo Standard Time') | 日本時間の日時 |
addDays() | 日数を足す・引く | addDays('2026-10-31T00:00:00Z', -5) | 2026-10-26T00:00:00.0000000Z |
addToTime() | 時・日・週・月・年を足す | addToTime('2026-10-31T00:00:00Z', 1, 'Month') | 1か月後 |
startOfMonth() | その月の1日の0時 | startOfMonth('2026-10-15T13:30:30Z', 'yyyy-MM-dd') | 2026-10-01 |
dayOfWeek() | 曜日を数字で返す | dayOfWeek('2026-10-31T00:00:00Z') | 6(日曜が0) |
concat() | 文字をつなげる | concat('案件-', '0042') | 案件-0042 |
split() | 区切り文字で分けて配列にする | split('a_b_c', '_') | ["a","b","c"] |
substring() | 位置と文字数で切り出す | substring('hello world', 6, 5) | world |
replace() | 文字を置き換える | replace('2026-10-31', '-', '/') | 2026/10/31 |
if() | 真なら1つ目、偽なら2つ目 | if(equals(1, 1), 'yes', 'no') | yes |
empty() | 空なら真 | empty('') | true |
coalesce() | 最初の null でない値 | coalesce(null, '未入力') | 未入力 |
length() | 文字数・配列の数 | length('abcd') | 4 |
first() / last() | 最初・最後の項目 | first(split('a_b_c', '_')) | a |
items() | ループでいま処理している項目 | items('添付ごと')?['name'] | 添付のファイル名 |
triggerOutputs() | トリガーの出力 | triggerOutputs()?['body/subject'] | メールの件名 |
一覧の中で、間違えやすいところを書いておきます。
| 関数 | 気をつけること |
|---|---|
substring() | 開始位置は0から数える。開始位置と文字数の合計が文字列の長さを超えるとエラーになる。超えそうなときは slice() を使う |
replace() | 大文字と小文字を区別する。見つからなければ元の文字をそのまま返す |
indexOf() | 大文字と小文字を区別しない。0から数え、見つからなければ -1 |
coalesce() | 空の文字 '' や空の配列は null ではないので、そのまま返る |
concat() | 引数は2つ以上要る |
dayOfWeek() | 日曜が0、月曜が1、土曜が6 |
formatDateTime() | 3つ目の引数(ロケール)を省くと英語の表記になる |
slice() は開始位置と終了位置で切り出す関数で、範囲を超えてもエラーにならず、ある分だけ返します。slice('Hello World', 6, 20) は World です。
日本時間への変換と、日付の書式
UTCを日本時間に直す
タイムゾーンの名前は Windows の名前で書きます。日本は Tokyo Standard Time です。
convertFromUtc(utcNow(), 'Tokyo Standard Time', 'yyyy/MM/dd HH:mm')
SharePoint リストの日付の列やメールの受信日時のように、値がUTC(末尾が Z)で入っているものも同じです。
convertFromUtc(triggerOutputs()?['body/receivedDateTime'], 'Tokyo Standard Time', 'yyyy/MM/dd HH:mm')
convertTimeZone() は変換元のタイムゾーンも指定できる関数で、元がUTCなら convertFromUtc() と同じ結果になります。
アクションとして使いたい場合は、「日時」のコネクタにタイムゾーンを変換するアクション(英語の画面では Convert time zone)もあります。式に慣れていない人が直す可能性があるフローでは、アクションのほうが設定の画面で読めるので向いています。
よく使う書式
書式の文字は大文字と小文字で意味が違います。MM は月、mm は分、HH は24時間の時、hh は12時間の時です。
| 書式 | 結果の例(2026年10月31日 8時5分) |
|---|---|
yyyy/MM/dd | 2026/10/31 |
yyyy-MM-dd | 2026-10-31 |
M/d | 10/31 |
yyyy年M月d日 | 2026年10月31日 |
HH:mm | 08:05 |
yyyyMMdd | 20261031 |
yyyy年M月d日(ddd) とロケール ja-JP | 2026年10月31日(土) |
曜日を日本語で出すには、3つ目の引数にロケール ja-JP を入れます。
formatDateTime(convertFromUtc(utcNow(), 'Tokyo Standard Time'), 'yyyy年M月d日(ddd)', 'ja-JP')
SharePoint のフィルター クエリやExcelとのやり取りでは yyyy-MM-dd の形が安全です。人に見せるメール本文やTeamsの投稿では M/d(ddd) のような短い形が読みやすくなります。
変数と「作成」の使い分け
変数のアクション
変数は「変数」の中のアクションで扱います。
| アクション | やること |
|---|---|
| 変数の初期化 | 名前・種類・最初の値を決めて変数を作る |
| 変数の設定 | 値を入れ替える |
| 変数を増やす | 整数・浮動小数点数の変数に足す(既定は1) |
| 変数の減分 | 整数・浮動小数点数の変数から引く(既定は1) |
| 配列変数に追加 | 配列の最後に項目を足す |
| 文字列変数に追加 | 文字列の最後に文字を足す |
種類は、ブール値・整数・浮動小数点数・文字列・オブジェクト・配列から選びます。変数の値は式で variables('変数名') と書いて取り出します。

変数を作るときの決まりが1つあります。「変数の初期化」は、フローの一番外側にしか置けません。条件・スコープ・ループの中には置けないので、フローの最初のほう、トリガーのすぐ下にまとめて置きます。
作成(Compose)
「データ操作」の中の「作成」は、入れた値や式の結果をそのまま出力するアクションです。英語の画面では Compose で、公式の日本語ドキュメントでは「コンポーズ」と書かれているところもあります。検索で見つからないときは、どちらの名前でも探します。あとから値を変えられない代わりに、どこにでも置けて、実行履歴で中身をすぐ確かめられます。
| 比べるところ | 変数 | 作成 |
|---|---|---|
| あとで値を変える | できる | できない |
| 置ける場所 | 初期化は一番外側だけ | どこでも |
| ループで足し上げる | 向いている | 向かない |
| 途中の結果を残して確かめる | できるが手間 | 向いている |
| 同時実行のループの中 | 値がぶつかるので使わない | 問題なく使える |
| 呼び方 | variables('名前') | outputs('名前') |
決め方は単純です。途中で値が変わるもの(件数を数える、文字を足していく)は変数、1回決まったら変わらないもの(日本時間の今日の日付、件名から抜いた番号)は「作成」にします。サンプル工務店のフローでは、変数を使うのは件数の集計と、ループの中で本文を組み立てる場面くらいで、それ以外は「作成」で済ませています。変数の初期化もアクション1回分として数えられるので、使わずに済むなら作らないほうが要求数も減ります。
動的なコンテンツに出てこない値を取る
トリガーとアクションの出力を直接呼ぶ
動的なコンテンツの一覧には、よく使う値しか出てきません。出てこない値は、実行履歴で出力の中身を見て、式で直接呼びます。
- フローを一度動かす
- 「28 日間の実行履歴」から、その実行を開く
- 値を取りたいアクションのカードを選び、出力を表示する
- 出力の JSON で、取りたい値の名前と場所を確かめる

出力が body の中の from にあるなら、トリガーは triggerOutputs()?['body/from']、アクションなら body('アクション名')?['from'] で取れます。? を付けておくと、その値がないときにエラーにならず null が返ります。
| 取りたいもの | 書き方 |
|---|---|
| トリガーの本文の値 | triggerOutputs()?['body/項目名'] または triggerBody()?['項目名'] |
| アクションの本文の値 | body('アクション名')?['項目名'] |
| 「作成」の結果 | outputs('作成の名前') |
| ループの今の項目 | items('ループ名')?['項目名'] |
| SharePoint の選択肢の列 | triggerOutputs()?['body/列名/Value'] |
| SharePoint のユーザーの列のメール | triggerOutputs()?['body/列名/Email'] |
JSON の解析
外のサービスから返ってきた JSON や、HTTPで受け取った本文は、そのままだと動的なコンテンツに項目が出てきません。「データ操作」の「JSON の解析」にかけると、項目ごとに動的なコンテンツとして選べるようになります。
- 「+」→「アクションの追加」で「JSON の解析」を選ぶ
- 「コンテンツ」に、解析したい本文を入れる
- サンプルからスキーマを作るボタン(「HTTP 要求を受信した場合」トリガーでは「サンプル ペイロードを使用してスキーマを生成する」と表示されるもの)を押し、実行履歴からコピーした実際の JSON を貼る
- 「完了」を押すとスキーマができる

サンプルの JSON に空の値があると、スキーマが null を受け付けず、次の実行で空の値が来たときに失敗します。スキーマの中で null になりうる項目は、"type": "string" を "type": ["string", "null"] に直しておきます。
{
"type": "object",
"properties": {
"inquiryNo": { "type": "string" },
"phone": { "type": ["string", "null"] }
}
}
文字として届いた JSON を、式の中だけで扱いたいときは json() で変換します。json('{"fullName": "Sophia Owen"}')?['fullName'] のように書けます。
サンプル工務店の例
問い合わせメールの件名から番号を取り出す
ホームページの問い合わせフォームから info@ に届くメールは、件名が「【お問い合わせ】No.20261031-005 リフォームの相談」の形です。この番号を問い合わせ台帳のリストに入れます。
考え方は、「No.」で分けて後ろ側を取り、その後ろ側を空白で分けて先頭を取る、です。
first(split(last(split(triggerOutputs()?['body/subject'], 'No.')), ' '))
この式には弱点が2つあります。件名に「No.」がないとき、件名の最初の空白までの文字(空白のない件名なら件名全体)が番号として入ってしまうことと、全角の空白で区切られていると番号の後ろの文字まで付いてくることです。実際の運用では、まず全角の空白を半角に直し、「No.」がないときは空にしておきます。式を「作成」アクションに分けて書くと、次のようになります。
- 「作成」を置き、名前を「件名」にして、入力に
replace(trim(triggerOutputs()?['body/subject']), ' ', ' ')を入れる - 「作成」を置き、名前を「問い合わせ番号」にして、入力に次の式を入れる
if(contains(outputs('件名'), 'No.'), first(split(last(split(outputs('件名'), 'No.')), ' ')), '')
- 問い合わせ台帳への「項目を作成する」で、番号の列に
outputs('問い合わせ番号')を入れる

番号が空のときは台帳に入れず事務に知らせる、という分岐を後ろに置いておくと、件名の形が変わったときにすぐ気づけます。
月末日を出す
経費精算の締めや、月次の売上集計で「今月の末日」が要る場面はよくあります。月によって28日から31日まで変わるので、日数を決め打ちにせず、「来月の1日の前の日」として計算します。
- 「作成」を置き、名前を「今日」にして、入力に
convertFromUtc(utcNow(), 'Tokyo Standard Time')を入れる - 「作成」を置き、名前を「月末日」にして、入力に次の式を入れる
addDays(addToTime(startOfMonth(outputs('今日')), 1, 'Month'), -1, 'yyyy-MM-dd')
startOfMonth() で今月の1日にし、addToTime() で1か月足して来月の1日にし、addDays() で1日引くと今月の末日です。先に日本時間に直しておくのは、UTCのままだと毎月1日の朝9時までは前の月として計算されてしまうからです。
今日が月末かどうかを判定するなら、条件で次の式が真かどうかを見ます。
equals(formatDateTime(outputs('今日'), 'yyyy-MM-dd'), outputs('月末日'))
月末や営業日だけ動かすフローの作り方は「Power Automateのスケジュール実行:毎朝・毎週・月末に動くフローを作る」で書いています。

null・空・型の違いで失敗するパターン
式のエラーは、実行履歴で失敗したアクションを開くと、式を処理できなかったという内容の英語のメッセージで表示されることが多くあります。原因の多くは、値が null だった、型が違った、のどちらかです。
| 症状 | 原因 | 直し方 |
|---|---|---|
| 任意の列が空のときだけ失敗する | null を文字や数値として扱った | coalesce(値, '') や coalesce(値, 0) で埋めてから使う |
substring() で失敗する | 文字が想定より短い | slice() に変えるか、length() で長さを確かめてから切る |
| 数値の比較が思いどおりにならない | 文字の '100' と数値の 100 を比べている | int() か float() で数値にそろえる |
int() で失敗する | 空の文字や、1,200 のようなカンマ入りの文字を変換した | replace() でカンマを消し、空なら0にしてから変換する |
| 値がないとエラーになる | ? を付けずに項目を呼んだ | ?['項目名'] の形で呼ぶ |
| 「JSON の解析」が失敗する | スキーマが null を受け付けない | 該当の項目の型に "null" を足す |
| 日付が1日ずれる | UTCのまま日付だけ取り出した | 先に日本時間に直してから書式を整える |
| 空の判定が効かない | 空の文字 '' と null は別もの | empty() で判定する。coalesce() は '' を素通しする |
string() は null を空の文字 '' に変えます。ただ、null どうしの比較と空の文字どうしの比較は同じではないので、比べる前にどちらかにそろえます。
応用:式を読みやすく保つ
式が長くなってきたら、次の3つで読みやすく保ちます。1つ目は、途中の結果を「作成」に分けて名前を付けることです。2つ目は、同じ式を何か所にも書かず、「作成」で1回だけ計算して outputs() で使い回すことです。日本時間の今日の日付をフローの最初で1回作っておくと、どこを直せばよいかが1か所に決まります。3つ目は、アクションの「…」からメモを付け、式が何をしているかを日本語で残すことです。半年後に直すのは、多くの場合、作った本人ではありません。
できないことと、その代わり
| やりたいこと | 式でできるか | 代わりの手 |
|---|---|---|
| 正規表現で文字を抜き出す | 標準の式にはない | split() と indexOf() を組み合わせる。複雑なら Excel の関数や Office スクリプトに任せる |
| 祝日を判定する | 祝日の情報を持っていない | SharePoint リストに祝日の一覧を作り、フローから引く |
| 数万行の配列を式で集計する | 遅く、上限にかかりやすい | Excelのピボットやデータベースに任せる |
| メール本文から住所や金額を読み取る | 形が決まっていなければ難しい | フォームで項目ごとに受け取る形に変える。AI Builder の利用も検討する |
| 和暦に変換する | 式の書式で和暦を出す方法は公式に書かれていない | 年から引き算する式を作るか、表で変換する |
形の決まっていない文章から値を取り出す仕事は、式で頑張るより、入口で項目を分けて受け取るように変えるほうが、止まらない仕組みになります。
よく詰まるところ
| 症状 | 原因 | 直し方 |
|---|---|---|
| 式エディターで「追加」が押せない | かっこや引用符の閉じ忘れ | かっこの数を数える。Copilot で式を作成から直す |
| 日本語のアクション名を呼ぶと失敗する | 名前の空白を _ にしていない | 空白を _ にして書く。名前を変えたら式も直す |
| 朝の通知の日付が前日になる | UTCのまま日付を出した | convertFromUtc() で日本時間に直してから書式を整える |
| 曜日が英語で出る | ロケールを付けていない | formatDateTime() の3つ目に 'ja-JP' を入れる |
| 月と分を取り違える | MM と mm の書き間違い | 月は MM、分は mm |
ループの外で items() を書いて失敗する | items() はループの中でしか使えない | ループの中で使う。外では body() から配列を取る |
| 変数を条件の中で初期化できない | 初期化は一番外側だけ | トリガーのすぐ下に初期化をまとめる |
| 選択肢の列の比較が常に偽 | 列の値はオブジェクトで、文字は Value の中 | ?['列名']?['Value'] まで書く |
トリガーの欄の utcNow() が毎回同じ日時 | トリガーの式は保存したときに一度だけ計算される | 日付の計算はトリガーの後ろのアクションで行う |
| Copilot が作った式が別の値を返す | 依頼文があいまいだった | 実行履歴で結果を確かめ、関数の一覧と照らして直す |
次にやること
式を条件やループの中で使う方法は「Power Automateの条件分岐とループ:条件・スイッチ・Apply to eachの使い方」に書いています。日付の式を使って毎朝・月末に動かすなら「Power Automateのスケジュール実行:毎朝・毎週・月末に動くフローを作る」へ進んでください。式のエラーで止まったフローの直し方と再実行は「Power Automateのエラー処理と実行履歴:失敗に気づき、直して再実行する」、外のサービスの JSON を扱う場面は「Power AutomateのHTTPとカスタムコネクタ:APIで外のサービスとつなぐ」が次の記事です。