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

Power Appsの変数は、グローバル変数とコンテキスト変数の2種類があります。この使い分けさえ最初に理解しておけば、後になって迷子になることがぐっと減ります。

変数とは何か

変数を使うとどう変わるか

変数とは、数値・テキスト・真偽値などの情報を一時的に記憶しておく入れ物です。料理にたとえるなら、調理中に使う小皿のようなものです。作業途中に出た値をそこに置いておき、必要なときに取り出す。Power Appsではこの仕組みを使って、画面間でデータを渡したり、UIの状態を管理したりします。

変数を使わなくてもアプリは作れます。ただ、複数の画面を持つアプリや、条件によって表示内容を切り替えたいアプリでは、変数なしに実現するのはかなり難しくなります。社内で勉強会をやっていると、変数の概念でつまずく方は多いのですが、仕組みを整理すると意外とシンプルです。

Power Appsには変数の種類が2つあります。アプリ全体で使えるグローバル変数と、特定の画面の中だけで使えるコンテキスト変数です。この2つは仕組みが異なるので、それぞれ順番に見ていきます。

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

グローバル変数とコンテキスト変数の違い

グローバル変数(Set)

グローバル変数は、アプリ全体のどこからでも読み書きできる変数です。Set という関数を使って値を保存します。

Set(gv_UserName, User().Email)

この1行で、ログイン中のユーザーのメールアドレスを gv_UserName という名前で保存できます。一度 Set で保存すると、アプリ内のどの画面からでも gv_UserName と書けば値を呼び出せます。

グローバル変数の名前の先頭に gv_ をつけるのが個人的なルールです。変数の一覧を見返したときに、グローバルかどうかが名前だけで判別できるので、後から見直す際にとても楽です。チームで開発するときは、こういった命名規則をはじめに決めておくことをおすすめします。

コンテキスト変数(UpdateContext)

コンテキスト変数は、その画面(スクリーン)の中だけで有効な変数です。UpdateContext という関数を使います。

UpdateContext({lv_showForm: true})

lv_showForm が true のときにフォームを表示する、といった使い方ができます。UpdateContext はレコード形式(波括弧で囲む)で書くのが特徴で、複数の変数をまとめて更新することも可能です。

UpdateContext({lv_showForm: true, lv_editMode: false})

コンテキスト変数の重要なポイントは、定義した画面の中でしか読み取れないことです。別の画面に移動すると、その変数は参照できません。私は頭に lv_(local variable の略)をつけてグローバル変数と区別しています。

2つの違いを整理する

まとめると次のとおりです。

グローバル変数コンテキスト変数
使う関数Set()UpdateContext()
有効範囲アプリ全体定義した画面のみ
主な使いどころ画面をまたいで使う値画面内のUI制御
命名例(慣習)gv_UserNamelv_ShowForm
初期化タイミングOnStart が多いOnVisible が多い

どちらを使うべきか——実務での判断基準

グローバル変数を選ぶとき

画面をまたいで値を渡したいときはグローバル変数一択です。代表的な使いどころは次の3つです。

  1. ログイン情報(User().Email などをアプリ起動時に保存しておく)
  2. 選択したアイテムのIDや名称(一覧画面から詳細画面に渡す)
  3. 編集モードと参照モードの切り替えフラグ

特に多いのが、ギャラリーで行をタップして詳細画面に遷移するパターンです。タップしたタイミングで選択行の情報をグローバル変数に保存しておけば、詳細画面側でその情報を自由に使えます。

// ギャラリーの OnSelect に書く例
Set(gv_SelectedItem, ThisItem);
Navigate(DetailScreen, ScreenTransition.None)

これで DetailScreen に移動した後も、gv_SelectedItem からタップした行のデータを参照できます。シンプルですが、現場のアプリでは非常によく使うパターンです。

コンテキスト変数を選ぶとき

その画面の中で完結するUI制御にはコンテキスト変数が適しています。代表的なケースは次のとおりです。

  • フォームの表示・非表示の切り替え(追加ボタンを押したらフォームが開く)
  • ポップアップや確認ダイアログの開閉
  • ボタンを押してデータ送信中にローディング表示を出す

これらはアプリ全体に共有する必要がない、画面限定の状態管理です。グローバル変数で代用することもできますが、コンテキスト変数のほうがスコープが狭い分、意図しない値の上書きが起きにくくなります。グローバル変数を必要のない場面で乱用すると、後から見直したときに何のために使っているのかわかりにくくなるので注意が必要です。

初心者がよくやる失敗パターン

コンテキスト変数を別の画面から読もうとする

コンテキスト変数でつまずく原因のほぼすべては、定義した画面の外で参照しようとすることです。画面Aで設定したコンテキスト変数は、画面Bからは見えません。勉強会でも毎回と言っていいほど出てくる質問がこれです。

画面間で値を渡したい場合は、グローバル変数を使うか、Navigate 関数の第3引数を使う方法があります。

// Navigate の第3引数でコンテキストを渡す方法
Navigate(DetailScreen, ScreenTransition.None, {lv_itemId: ThisItem.ID})

Navigate の第3引数にレコードを渡すと、遷移先の画面のコンテキスト変数として値を引き渡せます。ただし私はこの方法よりもグローバル変数で渡す方が直感的でわかりやすいと感じており、通常はグローバル変数を使っています。どちらでも動くので、自分がわかりやすいほうを選べば問題ありません。

変数を初期化しないままアプリを作る

OnStart や OnVisible で変数を初期化しておかないと、アプリの状態によって予期しない値が残ることがあります。特に、編集フォームを開いた状態で別の操作をして戻ってきたときに、前回の値がそのまま残っていてバグになるケースがよくあります。

対策はシンプルで、画面に入るたびに使う変数はOnVisibleでリセットするか、初期値を明示的に設定しておくことです。

// DetailScreen の OnVisible に書く例
UpdateContext({lv_showForm: false, lv_editMode: false})

体感では、この初期化の漏れが初心者のバグの原因としてかなりの割合を占めています。動かないと思って悩んでいたら、変数に古い値が残っていたというケースは珍しくありません。アプリが複雑になってくると特に起きやすいので、早い段階から習慣づけておくことをおすすめします。

コレクションとの違いも知っておこう

変数とは別に、コレクションという仕組みもあります。変数が単一の値(1つの数値や文字列)を保持するのに対して、コレクションは複数行のテーブルデータを保持できます。簡単にいえば、Excelのような表形式のデータを一時的に保存するための入れ物です。

一時的なリストを画面に表示したい場合や、データを加工してから保存したい場合にコレクションを使います。変数とコレクションを両方理解しておくと、Power Appsで作れるアプリの幅が大きく広がります。コレクションについては別の記事で詳しく解説する予定です。

また、変数を使いこなせるようになったら、Power Appsで使える実用テクニックの記事もあわせて読んでみてください。実際の現場で役立つ記法がまとまっています。

まとめ

グローバル変数は Set、コンテキスト変数は UpdateContext——まずこの2つの関数と有効範囲の違いを覚えてしまえば大丈夫です。画面をまたぐならグローバル、その画面の中で完結するならコンテキスト。この判断基準が頭に入れば、変数で迷う場面はかなり減ります。

最初から完璧に使い分けようとしなくても大丈夫です。実際にアプリを作りながら、動かして確認していくうちに自然と身につきます。変数の使い方が手に馴染んでくると、アプリで表現できることが一気に増えます。ぜひ小さなアプリから試してみてください。

Xでフォローしよう