Power Apps 初心者がハマりやすいミス10選|よくある「なぜ動かない」の答えを全部まとめた

Power Appsを使い始めた頃にハマりやすいミスは、ほぼパターンが決まっています。この記事では、動かない、表示されない、保存されない系のよくある落とし穴を10個まとめました。

この記事はエラー・デバッグクラスターのサテライト記事です。エラーの種類別の調べ方はPower Apps 数式エラー解決の全体マップで整理しています。

ミス①:OnStartに変数を書いたのに起動直後に使えない

OnStartに書いた処理はアプリ起動時に実行されますが、すべてのOnStartが終わってから最初の画面が表示されます。ところが、OnStartの処理の中で非同期的に実行される部分があると、変数の初期化が完了する前に画面が表示されてしまうことがあります。

また、Power Apps Studioでプレビューを実行したとき、アプリの再起動ではなく、戻る/進むでページを移動するとOnStartが再実行されないため、変数が空のまま動作することがあります。これは開発中にしか起きない現象ですが、初心者が混乱しやすいポイントです。

OnStartとOnVisibleの使い分けについてはOnStartとOnVisibleの使い分けの記事を参照してください。初期化処理は原則としてOnVisibleに書くことをおすすめします。

ミス②:Gallery.SelectedをそのままPatchに渡してエラー

ギャラリーで選んだ行のデータをPatchで更新しようとするとき、Gallery1.SelectedをそのままPatchの第2引数に渡すと意図しない動作になることがあります。特に、ギャラリーの選択が解除されたタイミングでPatchが動くと、Selectedが空レコードになってしまいます。

// 危険:Gallery.Selectedをそのまま使う
Patch(SP_Tasks, Gallery1.Selected, {Status: {Value: "完了"}})

// 安全:ギャラリー選択時にvarRecordに格納しておく
// ギャラリーのOnSelect:
Set(varSelectedRecord, ThisItem)

// PatchはvarRecordを使う
Patch(SP_Tasks, varSelectedRecord, {Status: {Value: "完了"}})

ギャラリーで行を選んだ瞬間にOnSelectでvarRecordなどの変数に格納し、以降の処理はその変数を使うのが安全なパターンです。

ミス③:変数を初期化せずに使う

Power Appsの変数は、SetやUpdateContextで代入する前はブランク(空)の状態です。初回起動時に変数を参照する処理が走ると、ブランクが返ってきます。

例えばフラグ管理に使うBoolean型の変数を初期化せずに `If(varIsApproved, ...)` と書くと、初回はブランクが返るため `false` として扱われます。意図通りに動いているように見えて、実は初期化されていないだけというケースがあります。

// OnVisibleで変数を初期化する
Set(varIsApproved, false);
Set(varCount, 0);
Set(varMessage, "");

グローバル変数とコンテキスト変数の使い方でも触れていますが、変数は使い始める前に初期値を設定する習慣をつけると、予期しない挙動を防げます。

ミス④:DropdownのItemsに文字列を直接書こうとする

ドロップダウンコントロールのItemsプロパティには、テキストの配列を渡す必要があります。文字列を1つそのまま書いてもエラーになります。

// NG:文字列を1つだけ書く
Dropdown1.Items = "選択肢A"

// OK:配列形式で書く
Dropdown1.Items = ["選択肢A", "選択肢B", "選択肢C"]

// SharePointの選択肢列から動的に取得する場合
Dropdown1.Items = Choices(SP_Tasks.Status)

選択肢の内容をSharePointの選択肢列から引っ張ってくるときはChoices()関数を使います。こうするとSharePoint側で選択肢を追加・変更したとき、アプリ側を修正しなくても自動で反映されます。

ミス⑤:テキスト入力の値を.Textなしで参照する

テキスト入力コントロール(TextInput)の入力値を取得するには、`.Text` プロパティを参照する必要があります。コントロール名だけ書くとコントロールオブジェクト全体を参照することになり、文字列として扱えません。

// NG:コントロール名だけ書く
Label1.Text = TextInput1

// OK:.Textプロパティを参照する
Label1.Text = TextInput1.Text

// Patchに渡すときも同様
Patch(SP_Tasks, Defaults(SP_Tasks), {Title: TextInput_Title.Text})

他にもDropdownの選択値は `.Selected.Value`、Toggleのオン/オフは `.Value`、DatePickerの選択日は `.SelectedDate` と、コントロールの種類によって参照するプロパティが変わります。最初は迷いますが、使っているうちに自然と覚えます。

ミス⑥:SharePointの選択肢列を.Valueなしで参照する

SharePointの選択肢列(Choice型)をラベルに表示したり、文字列として比較したりするとき、列名だけで参照すると `{Value: "選択肢名"}` というレコード形式で返ってきます。これを直接ラベルに渡すと `[object Object]` と表示されます。

// NG:選択肢列を直接ラベルに表示しようとする
Label1.Text = ThisItem.Status
// 結果:[object Object]

// OK:.Valueで文字列部分を取り出す
Label1.Text = ThisItem.Status.Value
// 結果:"進行中"

// Filter条件で比較するときも同様
Filter(SP_Tasks, Status.Value = "進行中")

ミス⑦:フォームを開いたら前回の入力が残っている

EditFormを使って新規登録フォームを実装したとき、前に入力した内容が次回も残っていることがあります。これはフォームのDefaultModeプロパティの設定が原因です。

新規入力フォームとして使う場合は、画面のOnVisibleでNewForm()を実行してフォームをリセットするのが確実です。

// 画面のOnVisibleでフォームをリセットする
NewForm(Form1)

// または編集フォームとして特定のレコードを表示する場合
EditForm(Form1);
Form1.Item = varSelectedRecord

ミス⑧:データが500件以上あるのに全件取得できない

Power AppsのFilter・Search・LookUp関数は、データソース側で処理(委任)できない書き方をすると、アプリ側で処理する形になります。このとき取得できるのは最大500件(設定変更で2000件まで)です。データが増えてきた段階で突然、件数が合わないという症状が出ます。

数式バーに黄色の波線(委任警告)が出ている状態はこのリスクがあります。委任の仕組みと対処法は委任の警告とは?意味と対処法で詳しく解説しています。データが少ないうちに対処しておくことをおすすめします。

ミス⑨:OnChangeに書いた処理が初回は動かない

テキスト入力やDropdownのOnChangeプロパティに処理を書いた場合、そのコントロールの値がユーザーの操作によって変更されたときだけ発火します。画面が開いた初回は発火しません。

例えばDropdownの選択値が変わったときに変数を更新する処理をOnChangeに書いても、画面を開いた直後のデフォルト選択の状態では処理が走りません。初回から変数に値を持たせたい場合は、OnVisibleでDropdownのSelectedプロパティを参照して初期化しておく必要があります。

// 画面のOnVisibleで初期値を設定する
Set(varSelectedCategory, Dropdown_Category.Selected.Value)

// Dropdownのコントロール自体のOnChangeで更新する
Set(varSelectedCategory, Self.Selected.Value)

ミス⑩:UpdateContextが別の画面で使えない

UpdateContext()で設定したコンテキスト変数は、設定した画面の中でしか使えません。別の画面に移動すると参照できなくなります。複数の画面をまたいで使いたい変数はSet()(グローバル変数)を使う必要があります。

関数スコープ使いどき
Set(変数名, 値)アプリ全体画面をまたいで使う変数
UpdateContext({変数名: 値})その画面のみその画面だけで使う一時的な状態管理

UpdateContext()は同じ画面の中で使う分には問題ありません。ダイアログの表示/非表示フラグや、フォームの入力モード切り替えなど、画面ローカルな状態管理に向いています。画面間でデータを受け渡したいときは、Navigate()の第3引数でコンテキストを渡すか、Set()でグローバル変数にする方法を選んでください。

まとめ

10個のミスを振り返ると、共通するテーマが3つあります。変数の型と初期化、コントロールのプロパティ参照の正しい書き方、そしてスコープの理解です。この3つを押さえると、初心者がハマりやすい問題の大半は回避できます。

最初は同じミスを何度か繰り返すのが普通です。でも繰り返すうちに、あ、またこのパターンだと気づける瞬間が必ずきます。市民開発はそういう地道な積み上げで成長するものです。

Xでフォローしよう