はじめに
以前、Office365 PowerAppsを触っていました。
PowerAppsは、かな~りとっつきにくいツールで、使い方をメモしておかなきゃ忘れてしまいそうだなと思いながら、放置していました。
アプリを修正しようと久しぶりに触ったら、案の定すっかり忘れていたので、今度こそ、 またいつ忘れても大丈夫なように、ハマったところを中心に、使い方をメモしておこうと思います。
量が多くなったので記事を下記の3つに分けていて、本記事は3つ目の記事になります。
その1:基礎
「Microsoft (Office365) PowerApps 使い方メモ」
その2:データ関連
「Microsoft (Office365) PowerApps 使い方メモ (データソース・コレクション編)」
その3:その他メモ書き
「Microsoft (Office365) PowerApps 使い方メモ (その他)」
関数メモ
関数のリファレンスは下記にあるのですが、分類されていないため、よく使う関数を中心にまとめました。
https://docs.microsoft.com/ja-jp/powerapps/maker/canvas-apps/formula-reference
演算子
| 関数・演算子 | 補足説明 |
|---|---|
| =、<、<=、>、>=、<> | 「!=」はないので注意 |
| &&、||、! | !を使う時は「!(a)」とカッコをつける |
| IsBlank(<値>) | Null値、空文字列チェック |
文字
| 関数 | 補足説明 |
|---|---|
| Char(<ASCIIコード>) | 10->改行、22->「"」、39->「'」 |
| Concatenate(<文字列1>, <文字列2>, …) | 文字列結合。Concat()ではないので注意 |
| IsMatch() | 正規表現でマッチ判定 |
| Match() | 正規表現でマッチ文字列取得 |
| Text(<日付>, <フォーマット>) | 日付をフォーマット出力 |
変数
| 関数 | 補足説明 |
|---|---|
| Set({<変数名>:<値>}) | グローバル変数セット |
| UpdateContext({<変数名>:<値>) | コンテキスト(ローカル変数)セット |
| ClearCollect(<配列名>, {<項目名1>:<項目値1>, …}) | コレクション(グローバル配列)セット |
| Collect(<配列名>, {<項目名1>:<項目値1>, …}) | コレクションにレコード追加 |
| Clear(<配列名>) | コレクション削除 |
コレクションに複数のレコードを同時にセットするには`Table()関数を使ってまとめる
ClearCollect(<配列名>, Table({<項目名1>:<項目値1>, …}, {<項目名1>:<項目値1>, …}, …))
画面遷移
| 関数 | 補足説明 |
|---|---|
| Navigate(<画面名>, <アニメーション種類>) | 画面移動 |
| Back(<アニメーション種類>) | 戻る |
| Exit() | アプリ終了(アプリ終了が即Office365に伝わる) |
フォーム
| 関数 | 補足説明 |
|---|---|
| EditForm(<フォーム名>) | フォームを編集モードで初期化 |
| NewForm(<フォーム名>) | フォームを新規モードで初期化 |
| SubmitForm(<フォーム名>) | フォームのデータでデータセットを更新。編集か新規かは初期化モードで決まる |
データソース
| 関数 | 補足説明 |
|---|---|
| Refresh("データソース") | データソースを読み込み直す |
| Collect("データソース", {"項目名1":"項目値1", …}) | データソースにレコード追加 |
| RemoveIf("データソース", 条件1, 条件2, …) | データソースから、条件に合うレコードを削除 |
| Remove("データソース", "削除するレコード", All) | データソースから、指定したレコードを削除 |
| CountRows("テーブル") | テーブル(データソース or コレクションといったオブジェクト配列)の行数をカウント |
| SortByColumns("データソース", "カラム名") | カラム名でソート |
| Filter("テーブル", "条件1", …) | 条件に合うレコードを取り出す |
| LookUp("テーブル", "条件1", …) | 条件に合う最初の1レコードを取り出す(First(Filter())の別の書き方) |
| First("テーブル") | テーブルデータから最初の1レコードを取り出す |
Tips
変数の初期化をどこでするか?デバッグ時にどう初期化するか?
変数の初期化は、アプリのスタート時「App->OnStart」または、各ページが表示された時「<ページ>->OnVisible」に行います。
しかし、「アプリのプレビュー」でアプリを開くと、「App->OnStart」は呼ばれず、また、最初に画面が表示された時には、「<ページ>->OnVisible」は呼ばれません。 (リロードや画面遷移で画面が再描画された時は呼ばれます)
なので、下記の例のように、「アプリのプレビュー」で変数を初期化するには、上記に加え、デバッグ用の専用ボタンを用意して、直接初期化コードを実行するようにします。
あるコンポーネントの値を変更すると、他のコンポーネントの値も変わるようにする
例)チェックボックスにチェックを入れると、テキストボックスが編集可になるようにする
テキストボックスの「DesplayMode」プロパティを、チェックボックスの値によって設定値が変わるようにする
IF(Checkbox1.Value=true, DispalyMode.Edit, DispalyMode.Disabled)

値を変える側(チェックボックス)から、値が変わる側(テキストボックス)のプロパティを変更するのではなく、 値が変わる側(テキストボックス)のプロパティから、値を変える側(チェックボックス)のプロパティを見に行くのがポイント。
値を変える側(チェックボックス)の値が変わると、値が変わる側(テキストボックス)の再描画が起こり、プロパティが動的に更新される。
ボタンを押すと他のコンポーネントの値が変わるようにする
例)ボタンを押すと、テキストボックスの値がラベルに反映されるようにする
ボタンを押すと、コンテキスト(ローカル変数)をテキストボックスの値で更新する
ボタンのOnSelectプロパティをUpdateContext({output:TextInput2.Text})とする
ラベルのTextプロパティをコンテキスト(ローカル変数)にする

値を変える側(ボタン)から、値が変わる側(ラベル)のプロパティを直接変更できないので、コンテキスト(ローカル変数)を間にかますのがポイント。
初期化は画面の「OnVisible」で行う。ただし、エディターのテスト実行で、その画面から開いた場合は「OnVisible」は実行されないので注意
感想
PowerAppsについて、体系だった情報が欲しく、下記の書籍を読みました。
PowerAppsの書籍の選択肢はほとんどないのですが、ゼロから始まり、必要な機能は網羅されているので、この書籍があれば事足りるかなと思います。
PowerAppsは独特な仕様なのですが、オンラインにはあまり情報がなく、探す手間を考えると、オンラインドキュメントのみで学習するのは効率悪いかなぁと思いました。
Microsoftは、PowerAppsの「ノンコーディング」というところを売りにしたいようですが、それ故に、プロパティに関数を押し込んでいくというコーディングスタイルがとっつきにくく、かつ、柔軟性に乏しく、できることも想像していた以上に少なかったです。
WebのOffice365でUIが欲しくなることはあるので、これからもPowerAppsを使うとは思いますが、正直今後、PowerAppsがメジャーになるかは微妙に感じていて、いつでも振り返えられる備忘録だけ残しておいて、あまり凝ったアプリを作るのはやめておくことにしました。
Office365上で、Google Apps Scriptのように、スクリプトが書けるようになるといいんですけどね。将来的にはそうなるんじゃないかなぁと勝手に妄想しています。