Power Apps の長い数式を読みやすく整理する|With関数・改行・コメントで保守できるコードを書く方法

動いているからといって、読みにくい式のままにしておくと、3ヶ月後に自分でもわからなくなります。Power Appsの数式を保守しやすい形で書く方法を説明します。

動けばいいは危険な発想

Power Appsを使い始めて少し慣れてくると、複雑な条件分岐や計算式を書けるようになります。でもその式が長くなればなるほど、後から読み返したときに、これ何をやっているんだろうと迷子になりがちです。

私自身の経験でいえば、半年前に作ったアプリのIf関数の式を見返して、全く意図が読み取れなかったことがあります。動いているからそのままにしていたのですが、少し機能を変えようとしたとき、どこを直せばいいかを探すだけで1時間以上かかりました。

市民開発のアプリは、最初に作った人が長期間メンテナンスすることも多いです。そうでなければ引き継いだ人が困ります。動けばいいという発想は短期的には正しいですが、中長期的にはアプリの保守コストを上げる原因になります。

読みにくい式になりやすいパターン

  • If関数の入れ子が3段以上になっている
  • 1つのプロパティに10行以上の式が書かれている
  • 同じ計算を複数のコントロールのプロパティで繰り返している
  • コメントが一切ない

こういった状態は、作った直後はまあいいかと思えても、時間が経つほど修正コストが増えていきます。

改行・インデントで式を整形する

Power Appsの数式エディタでは、Shift+Enterで改行を入力できます。これだけで式の読みやすさが大きく変わります。

例えば、次のような式があります。

If(varStatus = "承認済み", Navigate(完了画面, ScreenTransition.Fade), If(varStatus = "差し戻し", Navigate(修正画面, ScreenTransition.None), Navigate(確認画面, ScreenTransition.None)))

これをShift+Enterで改行・インデントを入れると、次のようになります。

If(
    varStatus = "承認済み",
    Navigate(完了画面, ScreenTransition.Fade),
    If(
        varStatus = "差し戻し",
        Navigate(修正画面, ScreenTransition.None),
        Navigate(確認画面, ScreenTransition.None)
    )
)

同じ式ですが、構造が一目でわかるようになります。条件が何で、真の場合と偽の場合に何をするかが視覚的に区別できます。

インデントのルール

  1. 関数の引数ごとに1段インデントを深くする
  2. 入れ子の関数はさらに1段深くする
  3. 閉じ括弧は開き括弧と同じ深さに揃える

// コメントで意図を残す

Power Appsの数式エディタでは、// 以降をコメントとして記述できます(その行の末尾まで)。コメントは実行時に無視されるので、動作に影響はありません。

// ステータスに応じて遷移先を分岐する
If(
    varStatus = "承認済み",
    Navigate(完了画面, ScreenTransition.Fade), // 承認後は完了画面へ
    If(
        varStatus = "差し戻し",
        Navigate(修正画面, ScreenTransition.None), // 差し戻しは修正画面へ
        Navigate(確認画面, ScreenTransition.None) // それ以外は確認待ち画面へ
    )
)

コメントに書くべきは、何をしているかではなくなぜそうしているか、です。コードを読めば何をしているかはわかります。でもなぜこの条件なのか、なぜこの順番なのかは、書いた人でないとわかりません。

例えば、差し戻し状態のチェックを承認の前に行うと誤判定が起きるため後から判定するといったコメントは、後から読む人にとって非常に価値があります。

With関数で中間変数を作って式を分解する

長い式を短くする最も効果的な方法が、With関数を使って中間変数を作ることです。With関数の基本的な使い方では構文を解説していますが、ここでは保守性を高める観点での使い方を紹介します。

例えば、次のような式があるとします。

If(
    CountRows(Filter(受注リスト, 担当者 = User().Email And ステータス = "未処理")) > 0,
    Notify("未処理の案件が " & Text(CountRows(Filter(受注リスト, 担当者 = User().Email And ステータス = "未処理"))) & " 件あります", NotificationType.Warning),
    false
)

Filter関数の同じ式が2回登場しています。With関数を使うと次のように書き換えられます。

With(
    {
        // 自分担当の未処理件数を先に計算する
        myPendingCount: CountRows(
            Filter(受注リスト, 担当者 = User().Email And ステータス = "未処理")
        )
    },
    If(
        myPendingCount > 0,
        Notify("未処理の案件が " & Text(myPendingCount) & " 件あります", NotificationType.Warning),
        false
    )
)

変数名 myPendingCount が自分担当の未処理件数であることを明示しています。式が1回しか書かれていないため、条件を変えたいときも1箇所だけ直せばよいです。

With関数で中間変数を定義する手順

  1. 複数回使っている式や、複雑すぎて読みにくい部分を特定する
  2. With関数のレコードリテラル(波括弧部分)に変数名と式を記述する
  3. 本体の式では変数名を参照する

長いIf関数をSwitch関数に書き換える

同じ変数の値に対して複数の条件分岐をする場合、Ifの入れ子よりSwitchのほうがシンプルに書けます。IfとSwitchの使い分けについては別記事で詳しく説明していますが、保守性の観点からもSwitchに書き換えるメリットは大きいです。

先ほどのIf入れ子の例をSwitchで書き直すと次のようになります。

Switch(
    varStatus,
    "承認済み", Navigate(完了画面, ScreenTransition.Fade),
    "差し戻し", Navigate(修正画面, ScreenTransition.None),
    Navigate(確認画面, ScreenTransition.None) // デフォルト
)

Switch関数は、この変数が○○のときは△△、□□のときは▲▲という構造を表現するのに最適です。条件の種類が増えても、縦に追加するだけで対応できます。

一方、条件が変数の値の一致ではなく、複数の条件を組み合わせた判定(AかつB、またはC)の場合はIfのほうが適しています。どちらを選ぶかは同じ変数の値で分岐するか否かを基準に判断するとよいです。

名前付き計算式(App.Formulas)で繰り返し式を一元管理する

複数のコントロールや画面で同じ計算を繰り返している場合、名前付き計算式(App.Formulas)を使うと式の管理が大幅に楽になります。

名前付き計算式とは、アプリ全体で使える計算式の名前を定義する機能です。App.Formulasプロパティに次のように書きます。

myPendingCount = CountRows(Filter(受注リスト, 担当者 = User().Email And ステータス = "未処理"));

こうすることで、アプリの任意のコントロールから myPendingCount という名前で参照できます。受注リストのフィルター条件を変えたいときも、App.Formulasの1箇所を修正するだけで、全コントロールに反映されます。

With関数が、ある式の中での局所的な中間変数を作るのに対し、名前付き計算式はアプリ全体で使えるグローバルな計算式を定義します。繰り返しの多い計算は名前付き計算式に切り出すことをおすすめします。

名前付き計算式の設定手順

  1. Power Apps StudioのツリービューでAppを選択する
  2. プロパティドロップダウンからFormulasを選択する
  3. 計算式を「名前 = 式;」の形式で記述する(複数定義する場合はセミコロンで区切る)

名前付き計算式は変数とは異なり、参照されるたびに再計算されます。セットした値を保持するグローバル変数(Set関数)と使い分けることが大切です。詳しい違いはグローバル変数とコンテキスト変数の解説記事も参考にしてください。

まとめ

Power Appsの数式を保守しやすくするための方法として、改行・インデント・コメント・With関数・Switch関数・名前付き計算式の6つを紹介しました。すべてを一度に取り入れる必要はありません。まずは改行とコメントから始めて、式が複雑になってきたらWith関数を使う、という段階的な取り組みが現実的です。

アプリは作って終わりではなく、使いながら改善していくものです。数式エラー解決の全体マップと合わせて活用することで、問題を素早く見つけて直す力もついていきます。読みやすい式を書く習慣は、じわじわと開発の効率を上げてくれます。楽しみながら続けていきましょう。

Xでフォローしよう