Power Automate の条件分岐まとめ|equals と contains・if()・null 対策

Power Automate 実践・Tips

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

🧭 なぜこの記事を書いたのか
フローが「動くけれど、たまに変な結果になる」という相談の多くは、条件の書き方が原因です。
比較の演算子を1つ取り違えただけで、意図しないものまで通ってしまう。
しかもエラーにならないので、気づくのが遅れます。

条件アクションを置いたのに、思ったように分かれない。
原因はたいてい、比較の方法か、型か、空欄のどれかです。
この記事では、条件の3つの欄・equalsとcontains・if()・null対策を1本にまとめます。

条件は「置けば動く」ので、間違っていても気づきにくいところです。
講座では、わざと誤判定するデータを流すようにしています。言葉で説明するより、1回動かしたほうが早いと思ったからです。

📋 この記事で分かること

  • 条件アクションの3つの欄が何を意味しているか
  • equals と contains の違いと、取り違えたときに起きること
  • アクションを増やさずに済む if() の書き方
  • 空欄(null)でフローが止まるのを防ぐ coalesce()
  • 比較が通らないときに真っ先に疑う「型」

条件アクションは「質問を1つ作る」だけ

条件アクションは「質問を1つ作る」だけ条件ステータス次の値に等しい ▾承認済み左:いまの値中:比べ方右:比べる相手はい → 処理Aいいえ → 処理Bここを空にすると、静かに終わる
「いいえ」側を空にすると、動かなかったことに気づけない

設定画面に欄が3つ並んでいて戸惑いますが、やっていることは単純です。

=いま持っている値。
=どう比べるか。
=比べる相手。

「タイトルは(左)、会議という言葉を(右)、含んでいますか(中)」という
1つの質問を組み立てているだけです。答えが「はい」か「いいえ」で処理が分かれます。

💡 「いいえ」側も必ず埋める
「はい」だけ処理を書いて「いいえ」を空にすると、
条件に合わなかったときフローは何もせず終わります。
成功として記録されるので、動かなかったことに気づけません
少なくとも通知を1つ置いておくと、あとで追えます。

📌 equals と contains を取り違えない

同じデータでも、equals と contains で結果が変わるequals「承認済み」contains「承認」「承認済み」「仮承認済み」通ってしまう「未承認済み」通ってしまう「承認」決まった値との一致は equals。文章の中を探すときだけ contains
ステータス判定に contains を使うと、似た名前の別ステータスまで通る

この2つは、名前が似ているのに動きがまったく違います。

equals(等しい)|完全に同じときだけ通ります。1文字違っても、余分なスペースがあっても通りません。

「承認済み」equals「承認済み」→ true / 「承認済み」equals「承認」→ false

contains(含む)|指定した文字が含まれていれば通ります。

「来月の会議について」contains「会議」→ true

これが事故のもとです。
状態が「承認済み」かどうかを contains で見ていると、
「仮承認済み」や「未承認済み」まで通ってしまいます
状態やコードのように決まった値との一致を見るなら equals
文章の中を探すときだけ contains を使います。

これは実際に社内で起きたパターンです。
ステータスを contains で見ていて、似た名前の別ステータスまで承認扱いになっていました。エラーが出ないので、指摘されるまで気づきませんでした。

📌 比較が通らないときは「型」を疑う

見た目が同じなのに一致しない、という場合はたいてい型が違っています。

文字列の "100" と数値の 100 は別物です。
Excel や SharePoint から取った値は、思っている型と違うことがよくあります。

そろえてから比べます。数字として比べるなら int()
文字として比べるなら string() を通します。

equals(int(変数A), 100) / equals(string(変数A), '100')

日付も同じです。表示が同じでも、書式が違えば一致しません。
formatDateTime() で形をそろえてから比べます。

アクションを増やさない書き方:if()

「値を切り替えたいだけ」のときに条件アクションを置くと、フローが縦に伸びていきます。
値だけなら if() で1行です。

if(条件式, 真のときの値, 偽のときの値)

if(equals(変数, ''), '未設定', 変数)

使い分けは単純です。処理の流れを分けたいなら条件アクション、値を選ぶだけなら if()

🧮 条件式そのものも関数で書ける
equals() のほかに、greater()less()
and()or()not() があります。
複数の条件を組み合わせるときは and(equals(...), greater(...)) のように入れ子にします。

📌 空欄(null)でフローを止めない

null・空文字・値あり で挙動が変わるnull” (空文字)値ありcoalesce(値,’既定’)→ 「既定」に変わる→ ” のまま→ そのままempty(値)truetruefalse空文字も置き換えたいなら if(empty(値), ‘既定値’, 値)
coalesce が拾うのは null だけ。empty は空文字も true になる

「特定の申請だけエラーになる」という現象の原因は、ほとんどが空欄です。

任意項目が未入力だったり、リストの列に値が入っていなかったりすると、
その値は null(何も入っていない状態)になります。
空文字とは別物で、そのまま後続に渡すとエラーになることがあります。

備えは coalesce() です。並べた中から最初の null でない値を返します。
全部 null なら null を返します。

coalesce(triggerBody()?['備考'], '(記載なし)')

候補は何個でも並べられるので、
「ニックネーム → 氏名 → 固定文字」のように段階的に落とすこともできます。

null と空文字は違います。
coalesce() が拾うのは null だけです。
空文字('')は「値がある」と判断されるので、そのまま返ります。
空文字も置き換えたいなら、if(empty(値), '既定値', 値) の形にします。

条件を式で書く(詳細モード)

条件アクションには、欄を埋める方法のほかに式で書くモードがあります。
条件が複雑になってきたら、こちらのほうが見通しが良くなります。

複数の条件を組み合わせるときは and()or() を入れ子にします。

and(equals(変数A, '承認'), greater(変数B, 10000))

「どちらか片方」なら or()、「〜でない」なら not() です。

or(equals(状態, '差戻'), equals(状態, '却下'))

💡 画面上で「かつ」と「または」を混ぜない
グループ化で AND と OR を混在させると、
どこまでが1つの塊なのかが読み取りにくくなります。
混ざったら式に切り替えると決めておくと、あとで読むときに助かります。

比較に使える関数

equals と contains のほかにも、よく使うものがあります。

前方一致・後方一致|伝票番号の頭文字や、拡張子で判定するときに使います。

startsWith(ファイル名, 'INV') / endsWith(ファイル名, '.pdf')

空かどうか|空文字も、空の配列も「空」と判定します。

empty(変数) → 空なら true

長さ|文字数や件数で分岐したいときに使います。

length(配列) → 件数 / length(文字列) → 文字数

null と空文字は別物です。
coalesce() が拾うのはnull だけ
empty()空文字も空の配列も true になります。
「値が無い」を判定したいなら empty()、「null のときだけ差し替えたい」なら coalesce()
この2つを混同すると、空欄のときだけ挙動が変わるフローになります。

承認の結果で分ける

承認アクションの結果を条件に使うとき、引っかかりやすい点があります。

返ってくる値は Approve / Reject の英語です。
画面の表示が日本語でも、フローに渡る値は英語のままです。

equals(outputs('承認')?['body/outcome'], 'Approve')

日本語の「承認」と比べても、永遠に一致しません。
画面に見えている表示と、中で持っている値は別物という考え方は、
選択肢の列やドロップダウンでも同じです。

失敗したときだけ動かす

条件アクションとは別に、前のアクションが失敗したときだけ動かす仕組みがあります。
アクションのメニューにある「実行条件の構成」です。

ここで「失敗した」「タイムアウトした」にチェックを入れると、
前が転んだときだけ、そのアクションが動きます。

フローが止まったことに気づけないのは、運用でいちばん困る状態です。
失敗時に自分へ通知を送るアクションを1つ置くだけで、対応が何日も早くなります。

実際に組んでみる:申請の自動振り分け

ここまでの話を、1本のフローにつなげます。
「申請が来たら、金額と種別で送り先を変える」という形です。

1受け取った値を確かめる

いきなり条件を書かず、まず作成アクションで受け取った値をそのまま出します。
実行履歴で中身を見れば、型と、空欄になる項目が分かります。
ここを飛ばすと、あとで原因不明の分岐に悩みます。

2空欄に既定値を入れておく

任意項目は、この段階で埋めてしまいます。
以降のアクションで null を気にしなくて済みます。

coalesce(triggerBody()?['備考'], '(記載なし)')

3型をそろえる

金額で分岐するなら、数値に直しておきます。
フォームから来た値は文字列のことが多いためです。

int(triggerBody()?['金額'])

4条件で分ける

種別が完全一致するかは equals、金額の大小は greater で見ます。
2つを同時に見るなら and() でまとめます。

and(equals(変数_種別, '出張'), greater(変数_金額, 50000))

5「いいえ」側も埋める

条件に当てはまらなかったものを、どこかに落とします。
何も書かないと、静かに終わって誰も気づきません。
通知を1つ置くだけで十分です。

条件から書き始めると、あとで値を確かめに戻ることが多いです。
受け取った値をそのまま出して見るだけなら1分で終わります。順番を入れ替えただけで、作る時間が短くなりました。

補足:確認ポイント

スイッチと条件はどう使い分けるか
分岐が3つ以上あって、しかも1つの値の中身で分かれるだけなら、
スイッチのほうが読みやすくなります。
条件アクションを入れ子にすると、階層が深くなって追えなくなります。
逆に、複数の値を組み合わせて判断するなら条件アクションです。

選択肢の列は文字列として比べられないことがある
SharePoint の選択肢列や、参照している列は、
表示上は文字に見えても、中では別の形で持っていることがあります。
そのまま比べて一致しないときは、実行履歴で実際に入っている形を確認すると分かります。
?['Value'] のように、中の項目を指定する必要がある場合があります。

大文字と小文字は区別される
equals() は大文字と小文字を別のものとして扱います。
入力のゆれが想定されるなら、toLower() で片方にそろえてから比べます。

まとめ

📌 この記事のポイント

  • 条件アクションは左・中・右で質問を1つ作るだけ。「いいえ」側も埋める
  • 決まった値との一致は equals。文章の中を探すときだけ contains
  • 通らないときは型をそろえるint() / string() / formatDateTime()
  • 値を選ぶだけなら if() で1行
  • 空欄対策は coalesce()。ただし拾うのは null だけ

📚 仕様の出典

coalesce()if()equals()empty() などの動きは、ワークフロー式の関数リファレンス(Microsoft Learn)に記載されている内容です。

PA45 は毎週やっています

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

次回のPA45を見る

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

\ 最新情報をチェック /

💌

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

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

𝅧 @isamu_Automate をフォロー →

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

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

次回PA45に参加する →

コメント

PAGE TOP