PowerApps でアプリを作成する場合、変数を利用する必要性が出てくることがあります。ただ、この変数という存在は目に見えづらく、これまでプログラミング(コーディング)を経験したことのないユーザーにはひとつのハードルにもなっているような気がしています。

とは言えやっぱり変数を利用できた方が、作成できるアプリの幅も大きく異なってくるというわけで、PowerApps のキャンバス アプリでの変数の動作について僕が勉強したときの手順や理解の内容を書いてみたいと思います。

さきに書いておくと、勉強してみて思ったことは「出来る限り変数は使わない方が良い」ということです。その理由は、記事の最後のほうに書いてあります。

この記事は、僕が PowerApps を学びながら書くシリーズです。

変数は利用しなくても良い

さっそくこの記事の趣旨を否定するわけですが…、ユーザーインタフェースを持つアプリの作成に特化している PowerApps のキャンバス アプリの場合、変数を利用しなくともアプリを作成することができます。また、この場合には計算に利用される値や計算結果が目に見えるため、より簡単で直感的にアプリを作成することができます。

たとえば、次のようなテキスト入力コントロールが用意されたアプリを作成したとします。このアプリで実現したい動作は、テキスト入力コントロールの「TextInput1」の値と「TextInput2」の値を足し算したものを「TextInput3」に表示するというものです。

この動作を実現するには、「TextInput3」の Default プロパティを次のように設定します。

TextInput1.Text + TextInput2.Text

この状態でアプリを実行すると、「TextInput1」と「TextInput2」に値が入力されたタイミングで「TextInput3」の値がリアルタイムに変化します。

この動作は Excel のセル参照を利用して計算する動作に似ています。PowerApps が Excel のようにアプリを作成できると言われる理由はこのあたりにあるんだと思います。

PowerApps では式は自動再計算される

PowerApps のアプリの動作の特徴として、プロパティなどに設定された式は自動再計算されます。たとえば先ほどの例では、「TextInput1」や「TextInput2」に入力されている値が変化したタイミングで、「TextInput1.Text + TextInput2.Text」が自動再計算されて「TextInput3」の値がリアルタイムに変化します。

同じ動作を他のプログラミング言語で実現しようとした場合、「TextInput3」にイベントハンドラーなどを実装しなければならないかもしれません。

こうした動作は、プログラミング経験者にとっては、これまでマニュアル車に乗っていた人が、はじめてオートマ車に乗ったときのような戸惑いを感じるかもしれませんね。

ただし、この式が自動計算されるという仕組みに慣れると、とても楽にアプリを作成できるのが特徴です。

変数の使い方

PowerApps における変数の使い方はとてもシンプルです。まずは、変数に値を入れるためには Set 関数を利用します。

Set(Var, 12345)

そして、変数に入っている値を利用するためには、値を取り出したい変数名をコントロールのプロパティなどで指定すれば良いだけです。

変数の使いどころ

次は変数を使った方が良さそうな場面を考えてみます。今回は 3 つのパターンを考えてみました。

計算のタイミングを手動で制御したいとき

PowerApps の特徴として式が自動再計算されることを書きましたが、これが逆に不便なこともあります。自動再計算させたくない場合、たとえば、計算のタイミングをユーザーのアクション(ボタンを押すなど)に任せたい場合です。

こうした動作は、変数を利用することで実現することができます。次のようなアプリを考えてみましょう。このアプリは、「TextInput1」と「TextInput2」に入力された値を足し算したものを「計算」ボタンが押されたタイミングで「TextInput3」に表示させたいというものです。

この動作を実現するためには、「計算」ボタンが押されたタイミングで計算を行う必要があるため、ボタンの OnSelect プロパティに式を書いていくことになります。まずは、計算結果を変数に保存するためには次のような Set 関数を設定します。

Set(Total, TextInput1.Text + TextInput2.Text)

この Set 関数により計算結果が Total という名前の変数に保存されるので、この Total という変数を「TextInput3」の Default プロパティに設定します。

こうすることで、「計算」ボタンが押されたタイミングで Set 関数が実行され、Set 関数により計算結果が Total という変数に保存され、その Total という変数の値が「TextInput3」に表示されます。つまりは、「計算」ボタンが押されたタイミングで、計算結果が「TextInput3」に表示されるというわけです。

ちょっとだけプログラミングっぽい考え方になるわけですが、要は「風が吹けば桶屋が儲かる」と同じですね。

目に見えない値を保存しておきたいとき

スクリーン上に表示されている値は、はじめの足し算の例のようにコントロールから値を直接取得することができますが、スクリーン上に表示されていない値は変数に保存しておく必要があります。

たとえば、次のようなアプリを作ってみたいと思います。

追加した「前回との差分」には、直前の足し算の結果と、現在の足し算の結果の差分を表示したいと思います。この処理を実現するためには、直前の足し算の結果をどこか目に見えない場所に保存しておかなければなりません。この保存先として変数が利用できます。

さて、計算結果である「TextInput3」の値を変数に保存するためには、次のような Set 関数が必要です。

Set(lastTotal, TextInput3.Text)

この関数を実行するために、先ほどと同様にボタンの OnSelect プロパティに Set 関数を設定しておきます。

これで「保存」ボタンが押されたタイミングで、「TextInput3」に表示されている値を lastTotal という変数に保存することができます。次に、この変数を利用して「前回との差分」を計算するわけですが、「前回との差分」の Default プロパティには次のように設定します。

lastTotal - TextInput3.Text

これで、たとえば「10 + 20」を計算して「保存」ボタンを押したあとに、「10 + 10」を入力すると、前回の計算結果「30」と今の計算結果「20」を使った計算「30 – 20」の結果である「10」が自動的に「前回との差分」に表示されます。また、「TextInput3」の値を直接参照して計算しているため、「TextInput3」に表示される値が変わるとリアルタイムで「前回との差分」へも反映されます。

こうしたかたちで、変数には何らかの値を目に見えない場所に保存しておくという使い方ができます。ユーザーに表示しておく必要のない情報を変数に入れておくことで、ユーザーインタフェースをシンプルに保つことができるかもしれません。

同じ値を複数の場所で利用したいとき

今度は次のようなアプリを考えてみます。

このアプリでは、「計算」ボタンが押されたタイミングで、「TextInput1」と「TextInput2」に入力された値を足し算したものを「TextInput3」と「TextInput4」と「TextInput5」に表示するというものです。

まずは、「計算」ボタンが押されたタイミングで「TextInput1」と「TextInput2」に入力された値を足すために、「計算」ボタンの OnSelect プロパティに次のような Set 関数を設定します。

Set(Total, TextInput1.Text + TextInput2.Text)

そして、この計算結果が保存されている Total 変数を「TextInput3」と「TextInput4」と「TextInput5」の Default プロパティに設定します。

これによって、「計算」ボタンが押されたタイミングで、「TextInput1」と「TextInput2」に入力された値を足した値を「TextInput3」と「TextInput4」と「TextInput5」に表示できるわけですが、ここで変数を利用したことのメリットはなんでしょうか?

たとえば、それぞれのテキスト入力コントロールに「TextInput1.Text + TextInput2.Text」と設定することでも同じような結果を得ることができます。ただし、もしも後から計算式を足し算から掛け算に変更しなければならなくなったらどうでしょうか?これを掛け算にするためにはそれぞれのコントロールで「TextInput1.Text * TextInput2.Text」と書き換えなければなりません。これは変更の手間が煩雑になってしまいます。

今回のように変数を利用していた場合、「計算」ボタンの OnSelect プロパティに設定された Set 関数の中身を次のように書き換えるだけで足し算から掛け算に動作を実現し、他のテキストボックスにも同じ値を表示できます。

Set(Total, TextInput1.Text * TextInput2.Text)

一か所で変数の値を書き換えれば、あとは「TextInput4」と「TextInput5」へも Total 変数を介して同じ値が伝搬するというわけです。これによりアプリの改修時の手間を大幅に減らすことができます。

ただし、このサンプルの場合、「TextInput4」と「TextInput5」に対して「TextInput3.Text」を設定しても良く、必ずしも変数を利用しなければならないわけではありません。これまで紹介した「計算のタイミングを手動で制御したいとき」や「目に見えない値を保存しておきたいとき」のパターンとも照らし合わせて変数を利用すべきかを考える必要があります。

PowerApps では変数を積極的に利用すべきか

あくまでも個人的な考えですが、PowerApps でアプリを作成する場合、「出来る限り変数は使わない方が良い」と思います。変数を利用することで値が目に見えなくなってしまうため、アプリのメンテナンスを引き継ぐ場合などにハードルが上がってしまうと思うからです。分かりやすさを重視する場合、データにマウスで触れるということがとても大切になってくると思います。

ただし、今回挙げた例のように、アプリの動作をコントロールしたい場合などには変数を利用しなければならないことがあります。その場合は、利用した変数について「どこで値が更新される変数であるのか」「どんな値が入る変数であるのか」の 2 点は、なにかしらの方法で記録に残しておくべきかと思います。このあたりを明確にしておかないと、作成した本人しかアプリの全体像が分からない神 Excel ならぬ 神 PowerApps を生んでしまうと思うからです。

このあたりは、組織内で PowerApps を作成していく場合のガイドラインのひとつとしても良いかもしれません。

さいごに

PowerApps でアプリを作成する場合、変数を利用することができますが、変数を必ずしも利用しなければならないわけではありません。ただし、変数を利用することでより複雑な処理を実現したり、ユーザーインタフェースをシンプルにしたり、動作のタイミングを手動で制御したりすることができるようになります。

ただし、変数の乱用は、アプリの全体像が掴みにくくなる原因にも繋がるんじゃないかと思います。変数を利用した場合は、その変数がどういったものであるかを記録に残しておくことをお勧めします。

今回の記事の内容は、あくまでも僕が変数を勉強したときの理解ですが、変数の動作を理解される場合のご参考となればと思い紹介しました。