Power Apps のFormulas(名前付き数式)。OnStartを卒業しよう

Power AppsのFormulas(名前付き数式)は、OnStartに書き続けてきた初期化処理をすっきり整理できる機能です。海外コミュニティでは数年前から話題になっていますが、国内ではまだ使っている人が少ない印象です。

Formulasとは何か

Formulasは、数式に名前をつけて再利用できる仕組みです。簡単にいえば、Excelの名前付き範囲のようなものです。一度定義した数式はアプリ全体のどこからでも参照でき、値が変わっても一箇所を修正するだけで全体に反映されます。

たとえば、ログインユーザーの情報を何度も参照したいとき、従来はOnStartでSet(gUser, User())と書いてグローバル変数に格納していました。Formulasでは変数を使わず、直接 MyUser = User()と定義するだけで、アプリ全体で MyUser として参照できます。

MyUser = User()

OnStartとの違い

項目OnStartFormulas
実行タイミングアプリ起動時に1回だけ実行参照されたときに評価(遅延評価)
変数への保存必要(Set・Collect等で格納)不要(名前そのものが数式)
起動速度への影響あり(処理が多いと遅くなる)少ない(必要になったとき評価)
デバッグのしやすさ実行順序の管理が必要独立した定義なので追いやすい

最大の違いは遅延評価です。OnStartは起動時に全部実行されますが、Formulasは参照された瞬間に計算されます。使わない数式は実行されないため、起動時のパフォーマンスに優しい設計になっています。

定義方法

FormulasはAppコントロールのプロパティに存在しています。

定義の書き方はシンプルです。

MyUser = User()
AppTitle = "社内申請ポータル"
TodayJP = Text(Today(), "yyyy年mm月dd日")

このように定義しておけば、画面のどこでも MyUser.Email や AppTitle とそのまま書くだけで参照できます。変数のように Set() や UpdateContext() は必要ありません。

向いているケースと向いていないケース

Formulasが向いているケース

  • User()や Today()など、アプリ全体で何度も参照する値
  • 静的な定数(アプリタイトル、色コード、URLなど)
  • OnStartが長くなってきたアプリのリファクタリング
  • パフォーマンス改善が必要なアプリ

Formulasが向いていないケース

  • ユーザーの入力や操作によって値が変わるケース(変数が必要)
  • Collect()など副作用を伴う処理
  • 特定のタイミングだけ実行したい処理

Formulasは純粋な計算式の命名にしか使えず、副作用(データの変更・変数への書き込み)を含む処理は書けません。なんでもFormulasに移行しようとすると詰まるので、適材適所で使い分けることが大切です。

実際に使ってみた感想

個人的には、User()の参照をFormulasに移したところ、アプリの起動が体感的に速くなりました。OnStartにUser()とCollect()を並べて書いていたのを、Collectはそのままに User()だけFormulasに切り出したのですが、それだけでも違いが出ます。

まとめ

FormulasはOnStartを置き換えるものではなく、補完するものです。変数を使わずに済む定義はFormulasへ、副作用を含む処理はOnStartにと分けるだけで、アプリ全体のコードが整理されます。まだ使ったことがない方は、まず User() の定義をひとつ移してみることをおすすめします。慣れてくると手放せなくなります。

Xでフォローしよう