Power AppsのWith関数で数式をすっきり書く。ネストを解消するテクニック

Power AppsのWith関数は、数式の「一時メモ帳」だと思えばいい

Power AppsのWith関数は、複雑な数式を見やすく整理するためのツールです。ネストが深くなった数式や、同じ計算を何度も繰り返している数式があれば、With関数で書き直すと一気にスッキリします。

変数(Set/UpdateContext)と似ていますが、With関数はその数式の中だけで使えるスコープを作ります。副作用がなく、読み込み専用の一時的な値として使えるのが特徴です。

With関数の基本構文

With関数の構文は次のとおりです。

With(
    {
        変数名1: 値1,
        変数名2: 値2
    },
    // 変数名1や変数名2を使った式
)

最初の引数にレコード形式で名前と値のペアを定義し、2番目の引数でそれを使った式を書きます。定義した変数名はその式の中だけで有効です。

シンプルな例:計算の再利用

例えば、税込み価格と割引後の価格を両方表示したいとします。With関数を使わない場合はこうなります。

Text(SliderPrice.Value * 1.1, "#,##0") & "円(割引後:" & Text(SliderPrice.Value * 1.1 * 0.9, "#,##0") & "円)"

SliderPrice.Value * 1.1 が2回出てきて冗長です。With関数を使うとこうなります。

With(
    {taxPrice: SliderPrice.Value * 1.1},
    Text(taxPrice, "#,##0") & "円(割引後:" & Text(taxPrice * 0.9, "#,##0") & "円)"
)

taxPriceという名前をつけることで、意図が明確になり繰り返しも消えます。

ネストを解消する使い方

With関数の真価が発揮されるのは、If関数やSwitch関数とネストした複雑な数式を整理するときです。

ネストが深い数式の問題

例えば、ギャラリーの各アイテムについて「ステータスに応じた色」と「期限切れかどうかの判定」を同時に使う数式はこうなりがちです。

If(
    DateDiff(Today(), DateValue(ThisItem.期限), Days) < 0 && ThisItem.ステータス <> "完了",
    Color.Red,
    If(
        DateDiff(Today(), DateValue(ThisItem.期限), Days) < 3 && ThisItem.ステータス <> "完了",
        Color.Orange,
        Color.Black
    )
)

DateDiff(Today(), DateValue(ThisItem.期限), Days) が2回登場しています。With関数で整理するとこうなります。

With(
    {
        daysLeft: DateDiff(Today(), DateValue(ThisItem.期限), Days),
        isDone: ThisItem.ステータス = "完了"
    },
    If(
        daysLeft < 0 && !isDone, Color.Red,
        daysLeft < 3 && !isDone, Color.Orange,
        Color.Black
    )
)

daysLeftとisDoneという名前がついたことで、「残り日数が0未満かつ未完了なら赤」という意図が一目でわかるようになりました。

WithとSetの使い分け

Withと変数(Set/UpdateContext)は似ていますが、役割が異なります。

比較WithSet / UpdateContext
スコープその数式の中だけグローバル / 画面内
副作用なし(読み取り専用)あり(値を書き換える)
主な用途数式の整理・可読性向上状態管理・画面間の値の受け渡し
パフォーマンス良い(評価時のみ)変数更新で再評価が走る

まとめると、計算の途中結果を名前づけして再利用したいだけなら With、別のボタンや別の画面からも参照・変更したいならSet/UpdateContextを使います。

変数の使い方については別記事で詳しく解説しています。

Power Appsのグローバル変数とコンテキスト変数——違いと使い分けを図解

Withを使うと良い場面のまとめ

With関数を使うと数式が読みやすくなるのは、次のような場面です。

  • 同じ計算(DateDiff、FilterなどのLookUp)が2回以上出てくる
  • If/Switchの条件が長くなりすぎて何を判定しているかわかりにくい
  • ネストが3段以上になっている
  • 数式を後から自分以外が読む可能性がある

With関数自体がパフォーマンスを上げるわけではありませんが、数式が読みやすくなることで後からのメンテナンスが楽になります。私は「3ヶ月後の自分が読んでわかるか」を基準に、Withを入れるかどうか判断しています。

条件分岐の書き方はこちらも参考にしてください。

Power AppsのIfとSwitch——条件分岐の書き方と場面別の使い分け

まとめ

With関数は数式の中に一時的な名前つきの値を定義して、その数式内で使い回せるツールです。変数と違って副作用がなく、数式の可読性を上げるためだけに使います。同じ計算が繰り返し出てきたり、ネストが深くなってきたりしたらWith関数への切り替えを検討してみてください。

数式がスッキリすると、バグも減りますし、チームで開発するときも理解しやすくなります。地道ですが、こういう積み重ねが良いアプリ開発につながると思っています。

Xでフォローしよう