
Formulasプロパティの書き方を型別にまとめました。基本ルールさえ押さえれば、変数(Set関数)から名前付き計算式への移行は簡単です。
共通ルール:覚えるべき4つのポイント
すべての名前付き計算式に共通するルールは4つです。まず、等号の右辺に値を返す式を書きます。左辺は計算式の名前、右辺はその値です。次に、末尾にセミコロンを必ず付けます。これを忘れるとエラーになります。
3番目として、Set関数や Collect関数、ClearCollect関数は使いません。名前付き計算式内では、読み取り専用の計算をしか実行できないということです。4番目に、変数一覧パネルには表示されません。コード内でしか参照できないため、nfプレフィックスで識別することが重要です。
レコード型:ユーザー情報やAPIレスポンス
User関数の結果は1つのレコードです。そのレコードを名前付き計算式に格納する場合の書き方です。
nfUser = User();
こうすることで、アプリ全体で nfUser.FullName や nfUser.Email といったプロパティにアクセスできます。Set関数を使う場合は、Set(varUser, User()) と書きますが、イコール記号の向きが逆になることに注意してください。
Setの場合は関数名が最初に来ますが、名前付き計算式は変数名が最初に来ます。アプリ開発で一番よく使う書き方なので、早めに慣れることをお勧めします。

テーブル型①:データソースをキャッシュする
SharePointリストやDataverseテーブルを、OnStartのClearCollectではなく名前付き計算式で管理する書き方です。
nfDepartments = Departments;
Departments がデータソース名だとすると、この1行で nfDepartments にそのテーブル全体がキャッシュされます。ギャラリーの Items プロパティに、そのまま nfDepartments を指定できます。OnStartでClearCollectを実行するより、起動速度が向上します。
ただし、データソース自体に対する検索やフィルタリングは、その都度Dataverseに問い合わせされます。データ更新の有無を確認したいなら、Refresh関数を別途呼び出す必要があります。
テーブル型②:手動テーブルを定義する
固定値のテーブルを定義する場合は、Table関数を使います。
nfChoices = Table({Value:"はい"},{Value:"いいえ"},{Value:"どちらでもない"});
Set関数ではなく、Table関数を使うことが重要です。Collect関数や ClearCollect関数は、名前付き計算式の中では使えません。Comboboxやドロップダウンの Items プロパティに nfChoices をそのまま指定すると、選択肢リストが表示されます。
複数の画面で同じ選択肢を使う場合、この手法でテーブルを一元管理することで、メンテナンスが楽になります。選択肢が増えた場合も、1箇所の修正で全画面に反映されます。
色・定数:デザイン要素を統一管理
テーマカラーや数値定数を定義する書き方です。
nfColor = ColorValue("mediumaquamarine");
nfMaxRetries = 3;
nfCheckInterval = 500;
ColorValue関数で色を定義して、複数のコントロールの Fill プロパティに nfColor を指定すれば、デザイン変更時は定義箇所を修正するだけで済みます。数値定数も同様に、計算式内で繰り返し使う値をあらかじめ定義しておくと、コードの可読性が高まります。
この手法は、デザイン・システムの構築に有効です。ブランド色、フォントサイズ、マージン幅といったデザイン値を一箇所に集約することで、アプリ全体のビジュアル統一が実現します。
フィルター結果のテーブル:条件付きデータセット
特定条件でフィルタリングしたテーブルを名前付き計算式で定義する書き方です。
nfExecutives = Filter(Employees, Department = "Executives");
Filter関数を使って、Employees テーブルから Department が「Executives」の行だけを抽出します。結果は nfExecutives に格納され、ギャラリーの Items プロパティに直接指定できます。OnStartで ClearCollect(varExecutives, ...) を実行するより、遅延評価のメリットが活きてきます。
複数の条件でフィルタリングしたいなら、Filter関数をネストさせることもできます。例えば、nfExecutives の結果をさらにフィルタリングしたい場合、別の計算式で nfExecutivesByHireDate = Filter(nfExecutives, HireDate > Today()) のように、名前付き計算式を参照する計算式を定義できます。
名前付き計算式の連鎖参照:計算式が計算式を参照する
名前付き計算式は、ほかの計算式を参照できます。Power Appsが依存関係を自動で解決するため、複雑な計算も論理的に整理できます。
nfExecutives = Filter(Employees, Department = "Executives");
nfExecutiveCount = CountRows(nfExecutives);
1番目の計算式 nfExecutives を2番目の計算式で参照しています。Power Appsは自動的に nfExecutives が先に計算されることを認識し、その結果を使って nfExecutiveCount を計算します。ただし、ループ参照(AがBを参照し、BがAを参照する状況)はエラーになります。
計算式を設計する際は、参照の流れを図に書いてみることをお勧めします。複数の計算式が絡む場合、視覚化することで依存関係が明確になり、バグを防ぎやすくなります。
日付・Sequenceを使った計算列
日付範囲や数列を使って、複数行のテーブルを生成する書き方です。
nfNext10Days = AddColumns(Sequence(10), "MyDate", DateAdd(Today(), Value, Days));
Sequence(10) は1から10までの数値テーブルを生成します。AddColumns関数で「MyDate」という列を追加し、Today() に Value(1, 2, 3... 10)日を加えています。結果として、今日から10日間の日付テーブルが作成されます。
このテーブルをギャラリーの Items に指定すると、自動的に10行のギャラリーが表示されます。固定的な日付範囲が必要な場合、この手法は非常に効率的です。動的に日付範囲を計算する場合も、Sequence の引数を変更するだけで対応できます。
トラブルシューティング:エラーが出たときの対処
Formulasプロパティはエラーメッセージが見づらいことが多いです。構文エラーが出た場合、まず画面上のコントロール(例えば、テキスト入力)の OnStart プロパティなどで計算式を試してみることをお勧めします。
コントロール上でエラーメッセージが明確に表示されれば、問題箇所を特定しやすくなります。その後、修正した計算式を Formulas プロパティに貼り付けると、スムーズに進みます。Formulasプロパティへの直接入力は、検証が終わった後が効率的です。
また、Formulasプロパティ内の計算式が相互に参照される場合、定義順序は関係ありません。Power Appsが自動的に依存関係を解決するため、どの順序で書いてもかまいません。
早見表:SetとClearCollectから名前付き計算式への置き換え
よく使う変数定義の置き換え方を表にまとめました。
| 用途 | Set(変数)の書き方 | 名前付き計算式の書き方 | 主な違い |
|---|---|---|---|
| ユーザー情報 | Set(varUser, User()) | nfUser = User(); | イコール向きが逆。セミコロン必須 |
| 固定選択肢リスト | Set(varStatus, Table({Value:"新規"}...)) | nfStatus = Table({Value:"新規"}...); | Collectは使わない。Table直接指定 |
| データソースキャッシュ | ClearCollect(varDepts, Departments) | nfDepartments = Departments; | ClearCollectは使わない。遅延評価 |
| フィルター結果 | ClearCollect(varExec, Filter(...)) | nfExecutives = Filter(...); | ClearCollectは使わない |
| テーマカラー | Set(varColor, ColorValue(...)) | nfColor = ColorValue(...); | イコール向きが逆 |
| 数値定数 | Set(varMax, 100) | nfMaxValue = 100; | セミコロン必須 |
まとめ
名前付き計算式の書き方は、型によって異なりますが、基本ルール(右辺に式、末尾にセミコロン)は共通です。ユーザー情報、テーブル型、色定数、フィルター結果といった「変わらない値」の管理に最適です。
Set や ClearCollect から移行する際は、上の早見表を参考にしてください。計算式を連鎖参照させたり、Sequence を使って動的にテーブルを生成したりと、応用の幅も広がります。
関連記事:名前付き計算式とは → 名前付き計算式(App.Formulas)とは
関連記事:Power Appsパフォーマンス改善まとめ → Power Appsパフォーマンス改善まとめ