PowerAppsの変数の使い方|変数の更新から初期化も交えて解説
スポンサーリンク

今回はPowerAppsで使う変数について基本的な使い方を解説します。 

PowerAppsに必須の知識PowerFX対応の学習本はこちら
PowerApps学習の本命・実際のアプリももらえる学習本
PowerApps学習方法一覧

そもそも変数とは

変数とはデータを格納する箱になります。

中学校の数学でy=ax+bのような数式を使ったのを覚えていますでしょうか。この時、yとxは変数としてさまざまな数字を入れることができました。
PowerAppsにおける変数もこれと同じで変数に様々なデータを入れられます。

数学では変数に数字しか入れられませんでしたが、PowerAppsでは数字以外にも文字や日付など様々なデータの方を入れることができます。

コツリン
データの種類についてはこっちの記事で解説しているぞ

2種類の変数

PowerApps では変数と言っても2種類あります。

一つはコンテキスト変数、もう一つはグローバル変数です。

コンテキスト変数

コンテキスト変数は、変数を作成した画面でしか使えない変数になります。
変数の中身を他の画面でも使いたい場合は画面変遷の関数であるNavigate関数の第3引数に設定することで画面間の共有が可能になりますが、画面移動が多い場合は変数の受け渡しで漏れが発生することもありますので注意が必要です。

コンテキスト変数のデータはアプリが終了した時に消滅します。そのためデータの受け渡しをせずに画面偏移をおこなっても変数は画面上で保持されており、他の画面に行ってから戻ってきてもコンテキスト変数は残っていますので変数の引き渡しが必要なのかどうか、見極めましょう。

グローバル変数

グローバル変数は一度作成することで、全ての画面で使える変数になります。
様々な画面で同じ変数を使うことが想定される場合はグローバル変数の方が使い勝手が良いですが、特定の画面のみでしか使わないのにグローバル変数を乱立させてしまうと、作成時やメンテナンス時に混乱の原因にもなりますので注意しましょう。

コツリン
全ての変数をグローバル変数で作ってもいいが、コンテキスト変数が存在しているのは特定の画面でしか使わない変数が欲しいというニーズがあるからである。
メンテのことも考えて必要なところで必要な変数を使うようにしよう。

変数の名前

命名法則

変数の名前は日本語でも半角英数字でも大丈夫ですが、半角の数字のみは使うことができません。半角数字を使いたい場合は半角英字や日本語などと組み合わせて使いましょう。

名前が同じ二つの変数は使えるのか

同一画面内でコンテキスト変数を使い、同じ名前の変数を使うことはできません。一つの画面内で同じ名前の変数があった場合にパソコンが混乱してしまうからです。(アプリの作成者やメンテナンス者も混乱すると思います)

ところが、グローバル変数とコンテキスト変数で同じ名前の変数を使うことは許されます。同じ名前の変数でもグローバル変数とコンテキスト変数で属性が違うためだと思われます。
グローバル変数とコンテキスト変数の二つが存在しているとき、コンテキスト変数の方が優先され、グローバル変数は処理できません。(もしかしたら勉強不足でできるかもしれませんが今のところ方法が見つかっていません)
ただし、同一名の変数が二つあっても見た目は同じで、メンテの際などにも厄介なので基本的には使わない考え方になります。何か事情がある場合のみにしましょう。

変数の中身の確認方法

変数の中身を確認したい場合にはビュータブの中の変数を選択します。

グローバルのエリアにはグローバル変数を確認できます。各画面の名前があるエリアを選択すればその画面で作成されているコンテキスト変数を確認できます。
また、変数の確認エリアではデータの型も確認できます。

変数の名前を選択することで、どこで作られた変数なのかやどこで使われているのかもわかりますので、挙動が予定と違っている場合には追跡も可能です。

変数に格納できるデータの型

変数には基本的にどんなデータの形でも入ります。

ただし、一度でも変数のデータの型を指定しまうとの変数のデータの型を変更することはできません。そのため、変数の宣言を二つ用意しそれぞれで違う型のデータを格納しようとするとエラーが発生しますので注意してください。

変数を使えるようにする

では実際に変数を使えるようにしてみましょう。変数を使えるようにすることを宣言と言います。以下では変数の設定のことを宣言とします。

コンテキスト変数

コンテキスト変数の宣言ではUpdateContext関数を使います。構文は

UpdateContext({A:"a"})

となります。この場合変数Aにaのテキストデータを格納していることになります。

また複数の変数を宣言する場合は

UpdateContext({A:"a",B:"b"})

とします。これで変数AとBにそれぞれテキストのaとbが格納されることになります。

コツリン
{}がわからない場合はこっちの記事で解説しているぞ

グローバル変数

グローバル変数はSet関数で宣言することができます。構文は

Set(A,"a")

となります。この場合は変数Aにテキストのaを格納していることになります。

Set関数は一つの関数につき一つの変数しか宣言できないので次のようにSet関数の後に;を入れて二つ目のSet関数を入力するかConcurrent関数で同時に処理させるしかありません。

Set(A,"a");Set(B,"b")
Concurrent(Set(A,"a"),Set(B,"b"))

宣言するタイミング

好きな時に変数を宣言すれば良いのですが一般的には次の場合に変数の宣言を行います。

アプリを起動した時

アプリを起動したときに変数を宣言することでアプリを使用する場合に絶対に使う変数を宣言することができます。
左側の画面メニューのAppにおけるOnstart属性に入力することでアプリ実行時に必ず変数が宣言されます。

画面を表示させた時

アプリ実行時と同じく画面を表示させた場合に必ず変数を宣言させることでその画面内で必ず使う変数を設定することが可能です。
左側の画面メニューで表示された時に変数を作りたい画面を選択しOnvisible属性に設定することで画面表示時に必ず変数が宣言されます。

ボタンを押した時

必ず使うわけではないけど、特定の作業が発生した場合に変数を宣言したい場合はボタンに作成することもあります。
押したら変数を作成させたいボタンを挿入し、ボタンのOnselect属性に設定することでボタンを押した際に変数が宣言されます。

コツリン
変数は多いほどパソコンの処理が重くなってしまう。必要な時に必要な分しか変数を作らないという考えも大事だぞ。

変数の更新

変数というくらいですから変数の中身を変動させることが可能です。

コンテキスト変数

コンテキスト変数の中身を更新したい場合は宣言と同じように宣言し直せば新しい値が格納されます。

具体例

例えばボタンを二つ作り片方のOnselectに
UpdateContext({A:"a1"})
もう片方のOnselectに
UpdateContext({A:"a2"})
と入れれば、ボタンが押されるたびにそのボタンの内容に沿った内容が変数Aに格納されます。

また、すでに格納されている値を参考にして新たな値を入れたい場合は、:の右側に変数を持ってくることが可能です。

具体例

例えばボタンを二つ用意し片方のOnselectに
UpdateContext({A:1})
もう片方のOnselectに
UpdateContext({A:A+1})
と入力します。最初のボタンでAの値に1を格納した後、二つ目に作ったボタンを押すことでAに1を加算することができます。二つ目に作ったボタンを押したら押した回数だけAに1が加算されます。
このとき最初に作ったボタンを押すとAに1が格納されるためリセットされます。

グローバル変数

グローバル変数においてもコンテキスト変数と同じように考えれば大丈夫です。

グローバル変数の中身を更新したい場合は宣言し直せば新しい値が格納されます。

具体例

例えばボタンを二つ作り片方のOnselectに
Set(A,"a1")
もう片方のOnselectに
Set(A,"a2")
と入れれば、最後にボタンが押された方の内容が変数Aに格納されます。

また、すでに格納されている値を参考にして新たな値を入れたい場合は、第2引数に変数を持ってくることが可能です。

具体例

例えばボタンを二つ用意し片方のOnselectに
Set(A,1)
もう片方のOnselectに
Set(A,A+1)
と入力します。最初のボタンでAの値に1を格納した後、二つ目に作ったボタンを押すことでAに1を加算することができます。二つ目に作ったボタンを押したら押した回数だけAに1が加算されます。
このときに最初に作ったボタンを押すことで再度Aに1が格納されるのでリセットされます。

変数の初期化

値を空にする場合

変数を初期化する場合はblank関数を使用します。
blank関数は戻り値としてnullを返す関数となりますので、変数の更新する値のところにblank関数を入れてあげることで変数の中身を初期化することができます。

変数の確認画面で右側が「値なし」になっていれば変数の中身が空になります。

※注意
数字型のデータで中身が空というのは0とは違います。数学でいうところのφ(ファイ)と0が違うのと同じ理屈になります。これはtext関数で数字型の変数を文字列型にする場合に0であれば0というテキストデータを扱えますが、空の場合は扱うものが何もないということを考えればわかりやすいです。
一方でテキストデータの文字列が何もない状態はφは同じ扱いになります。

具体例

例えばボタンを二つ作り片方のOnselectに
UpdateContext({A:"a"})
もう片方のOnselectに
UpdateContext({A:blank()})
と入れれば、変数であるAの中身は空になります。

値を任意の中身にする場合

変数の値を初期化する場合に特定の値にしたい場合は、変数の宣言や更新の時と同じように関数を設定することで好きな時に初期化することが可能です。

具体例

例えばボタンを二つ作り片方のOnselectに
UpdateContext({A:1})
もう片方のOnselectに
UpdateContext({A:A+1})
と入れれば、上のボタンを押すと変数Aに1が格納され初期化することができます。

スポンサーリンク
社会人ということを言い訳にしていませんか

社会人だから学ぶ時間がない

そんなことを言い訳に勉強をすることを諦めていませんか。
そんな状態ではいけないということはあなた自身が一番知っているはずです。

社会人だからこそ学ぶ必要がある。そんな社会人に送る学習ツールがこちらです
↓↓↓

おすすめの記事