みなさま、こんにちは。今日はPowerAppsで作成したアプリにおいて、ギャラリー内のドロップダウンで発生する不思議な「前回値の引き継ぎ」現象について、私あんちゃんが徹底的に解説いたします。ここではSharePointリストから抽出された50行分のデータに対して、ユーザーがドロップダウンでOKやNOを選択した際、意図せずに空欄行に前回選択した値が反映されるという現象が発生しました。本記事では、その原因を解析し、Defaultプロパティの修正とPatch関数による明示的な値設定という具体的な解決策を導き出すまでのプロセスを、実例とともに詳しくご紹介いたします。PowerApps初心者の方でも分かりやすいように、コードの解説や動作の原理を丁寧に説明いたしますので、ぜひ最後までお読みいただければ幸いです。
PowerApps のギャラリーとドロップダウンの問題

PowerAppsは、マイクロソフトが提供するノーコード・ローコード開発環境で、SharePointなどのデータソースと連携しながらアプリケーションを構築できる非常に便利なツールです。しかし、その柔軟性ゆえに、思わぬ挙動や不具合が発生することもあります。今回の事例では、ギャラリー内のドロップダウン(Classic/DropDown)コントロールにおいて、ユーザーが選択した値が意図せず次の行へと引き継がれてしまう現象が報告されました。この現象は、一部の行のみ正しく更新される一方で、入力されなかった行には前回入力された値が自動的に適用されるというもので、特にSharePointリストとのデータ連携において混乱を招いております。本節では、まずこの問題の全体像と、その発生状況についてご説明いたします。
PowerAppsの画面には、SharePointリスト「ListCheck」から抽出された50行分のデータがギャラリーに表示され、各行に対して「CheckB」というドロップダウンで「OK」または「NO」を選択する仕様となっております。ユーザーが例えば最初の3行目までで適切に値を選択した場合、送信ボタンを押すとその3行目までのデータはSharePointリストに正しく反映されます。しかし、4行目以降はユーザーが何も入力しなかったにもかかわらず、直前の3行目で入力された値(たとえば「OK」または「NO」)が自動的に設定されるという現象が確認されました。ここで問題となるのは、入力していない行にも前回の値が反映されることで、実際のデータと表示が一致しなくなる点です。
問題の背景と現象の詳細

ここでは、問題の背景にあるアプリの動作や、現象の具体的な詳細についてご説明いたします。PowerAppsの画面には、SharePointリストから抽出した50行分のデータがギャラリーとして表示され、各行には「CheckB」というドロップダウンが設置されております。ユーザーは各行でOKまたはNOを選択できる仕様ですが、入力が行われなかった場合、送信ボタン押下後に最後に入力した値が後続の全行に反映されるという現象が発生しました。たとえば、最初の1~3行目にOKやNOを入力し、3行目にOKが設定されている状態で4行目以降は入力しなかった場合、送信後の4行目以降はすべてOKとなってしまいます。もし3行目がNOであった場合は、4行目以降が全てNOに統一される状況が確認されました。以下の表は、実際に観察された現象の一例を示しております。
行番号 | ユーザー入力値(CheckB) | 送信後の表示値 | 備考 |
---|---|---|---|
1 | OK | OK | 正常に入力された行 |
2 | OK | OK | 正常に入力された行 |
3 | OK | OK | ユーザーが入力した値が反映 |
4 | (未入力) | OK | 前回の値「OK」が引き継がれている |
5 | (未入力) | OK | 同上 |
6 | (未入力) | OK | 同上 |
この現象は、ユーザー側の意図とは反しており、意図しないデータ更新につながるため、業務システムとしては非常に大きな問題となります。次節では、このような現象が発生する背景として、PowerAppsのDefaultプロパティおよびPatch関数の動作特性に着目し、その原因を詳細に解析してまいります。
PowerAppsのDefaultプロパティの不思議な動作

PowerAppsにおけるコントロールのDefaultプロパティは、初期表示時や再描画時にどの値を表示するかを決定する重要なプロパティです。しかし、このDefaultプロパティには、ユーザーが想定しない挙動が見られる場合があり、特に空白の場合に前回の値を保持するという動作が、今回の問題の一因となっております。本節では、Defaultプロパティの基本的な仕組みと、その挙動の裏にあるロジックについて詳しく解説いたします。
PowerAppsのギャラリー内の各行に配置されたドロップダウン「CheckB」では、Defaultプロパティに「ThisItem.field_A.Value」が設定されております。通常、データが存在する場合はその値が表示されますが、SharePointリスト上で該当フィールドが空白(Nullまたは空文字列)の場合、PowerAppsは意図せず前回の値を引き継いで表示してしまう現象が確認されました。この仕様により、ユーザーが入力を省略した場合でも、直前の行の選択値が自動的に適用される結果となってしまいました。
具体的なコード例は以下の通りです。
Default: =ThisItem.field_A.Value
このコードはシンプルに見えますが、データが空の場合の処理が明示されていないため、PowerAppsの内部処理により前回の値が再利用されるのです。解決策としては、空の場合に明示的に空文字列を返すようにする必要があります。次のセクションでは、その修正方法について詳しくご説明いたします。
Patch関数によるデータ更新の特性

次に、Patch関数を用いたデータ更新の特性について解説いたします。PowerAppsのPatch関数は、データソースへの更新を行うために非常に有用な関数ですが、その動作には注意すべき点がいくつかございます。特に、空白の値が更新されないケースが存在し、今回の問題の原因のひとつとして考えられます。本節では、Patch関数の基本的な動作と、SharePointリストへのデータ反映時における留意点について、詳しく説明いたします。
送信ボタンのOnSelectプロパティでは、ForAll関数とPatch関数を組み合わせて、ギャラリー内の各項目に対してデータの更新を実行しております。以下はその一例です。
ForAll(
gall_1.AllItems As currentItem,
Patch(
ListCheck,
LookUp(ListCheck, ID = currentItem.ID),
{
field_A: { Value: currentItem.CheckB.Selected.Value },
field_B: currentItem.CheckB_1.Text
}
)
);
Notify("データが保存完了", NotificationType.Success)
このコードでは、各行に対してPatch関数が実行され、ユーザーが選択した値がSharePointリストに更新されるはずですが、空欄の場合は更新対象にならず、結果として前回の値が表示され続けるという現象が発生していました。つまり、Patch関数において「空白」の値が明示的に指定されない場合、更新が行われず、古いデータが残ってしまう可能性があるのです。次節では、これらの問題点を踏まえたうえで、どのように解決策を実装したのか、そのプロセスについて詳しく解説いたします。
原因の解析と対策の検証

これまでの現象の背景や各プロパティ・関数の特性を理解した上で、実際にどのような原因が今回の問題を引き起こしているのか、また、どのような対策を講じたのかを段階的にご説明いたします。本節では、初期に試みた複数の対処方法と、それぞれの結果を検証した上で、最終的に有効だった解決策について、具体的なコードとともに解説してまいります。
はじめに、ForAll関数とPatch関数を用いたデータ更新処理に対して、画面のリフレッシュやギャラリーのResetを試みましたが、4行目以降に前回の値が引き継がれる現象は改善されませんでした。実験の結果、特定の行でのみ入力された値が、その後の空欄行に影響を与えていることが明確になりました。たとえば、最初の1~3行目にユーザーが入力した値が、その直後の行にも自動的に反映されるという現象は、Defaultプロパティの設定に起因していると考えられました。
また、Patch関数についても、空白値が意図的に更新されなかったため、SharePointリスト上で空欄として保存されず、内部状態が不整合になっていた可能性がございます。これらの検証を通じて、解決策としては次の2点が必要であると結論づけました。
- Defaultプロパティの修正
空欄の場合は前回の値が引き継がれないように、If関数を用いて明示的に空文字列を返すようにする。 - Patch関数の修正
Patch関数実行時に、空白の場合でも必ず””(空文字列)を更新対象として指定し、データの不整合を防ぐ。
これらの対策を実施することで、ギャラリー内のドロップダウンにおいて、ユーザーが意図しない前回の値の引き継ぎが解消されることを確認いたしました。次節では、具体的なコード修正例とその効果について、より詳細に解説いたします。
実践的な解決方法の詳細解説

このセクションでは、実際に問題を解決するために行った具体的なコード修正について詳しく解説いたします。PowerAppsにおけるDefaultプロパティとPatch関数の修正は、今回の問題の根幹にかかわる部分です。ここでは、コードの各部分がどのように動作するのか、また、なぜこの修正が有効なのかを具体的に説明し、実践的な対策としてどのように実装すればよいかを分かりやすくお伝えいたします。
Defaultプロパティの修正による影響
PowerAppsのドロップダウンコントロールにおけるDefaultプロパティは、表示される初期値を決定する非常に重要な要素です。従来は「ThisItem.field_A.Value」のみを設定していたため、空白の場合に前回の値が自動的に引き継がれてしまう問題が発生しておりました。本節では、If関数を利用して明示的に空欄の場合に空文字列を返す方法について、具体的なコード例とその効果を詳しく解説いたします。
まず、従来の設定は次のようになっておりました。
Default: =ThisItem.field_A.Value
この場合、SharePointリスト上でfield_Aに何も入力されていない場合、PowerAppsは前回の選択値をそのまま表示してしまう挙動がありました。そこで、以下のようにIf関数を用いた修正を行いました。
Default: =If(
IsBlank(ThisItem.field_A.Value) || ThisItem.field_A.Value = "",
"",
ThisItem.field_A.Value
)
この修正により、field_Aの値が空白の場合には必ず空文字列が返されるため、前回の値が引き継がれることがなくなりました。結果として、ユーザーが入力していない行に対しては、DropDownコントロールが初期状態のままとなり、意図しない値の表示を防止することができました。実際の運用においても、これにより各行の表示が正確に反映されるようになり、ユーザー体験の向上につながりました。
Patch関数の見直しとその効果
次に、Patch関数によるデータ更新の見直しについて解説いたします。Patch関数は、PowerAppsにおいてデータソースに対して変更を反映するための主要な関数ですが、空白のデータを更新しないという仕様が存在します。これにより、ユーザーが何も入力しなかった場合、データソース上の値が更新されず、前回の値がそのまま残るという問題が発生しました。本節では、Patch関数内で空白の場合にも必ず空文字列を更新対象として設定する方法について、具体的なコード例を交えながら解説いたします。
従来のPatch関数のコードは、次のようになっておりました。
Patch(
ListCheck,
LookUp(ListCheck, ID = currentItem.ID),
{
field_A: { Value: currentItem.CheckB.Selected.Value },
field_B: currentItem.CheckB_1.Text
}
)
このコードでは、currentItem.CheckB.Selected.Valueが空の場合、Patch関数がその値を更新対象とせず、結果としてSharePointリスト上でfield_Aが更新されないケースが発生していました。そこで、以下のようにIf関数を用いて、空白の場合にも明示的に””(空文字列)を指定するように修正いたしました。
Patch(
ListCheck,
LookUp(ListCheck, ID = currentItem.ID),
{
field_A: { Value: If(IsBlank(currentItem.CheckB.Selected.Value), "", currentItem.CheckB.Selected.Value) },
field_B: currentItem.CheckB_1.Text
}
)
この修正により、たとえユーザーが入力を行わなかった場合でも、Patch関数はfield_Aに対して空文字列を明示的に更新するため、古い値が残ることなく正確なデータがSharePointリストに反映されるようになりました。実際の運用テストにおいても、この方法により不整合なデータが発生しなくなり、全体のデータ整合性が確保されました。
解決策のまとめと今後の対応

ここまで、PowerAppsにおけるギャラリー内のドロップダウンに関する問題の背景、原因、そして具体的な対策について詳しく解説してまいりました。本節では、これらの検証結果を踏まえたうえで、解決策のポイントをまとめるとともに、今後の対応策や同様の問題に対する予防策についてご提案いたします。ユーザーの皆さまにとって、実践的かつ再現性の高い解決策となることを目指して、丁寧に解説を進めてまいります。
今回の問題解決のために実施した主な対策は、以下の2点に集約されます。
- Defaultプロパティの修正
- 問題点: 従来のDefaultプロパティ設定では、空白の場合に前回の値が引き継がれる。
- 対策: If関数を用い、空白の場合は””(空文字列)を返すように設定する。 - Patch関数の修正
- 問題点: Patch関数が空白の値を更新対象とせず、古い値が残る。
- 対策: If関数を用い、空白の場合でも必ず””を更新対象として明示的に指定する。
これらの対策により、ユーザーが入力しなかった行に対しても、前回の値が不正に引き継がれることなく、正確なデータがSharePointリストへ反映されるようになりました。今後は、PowerAppsの各プロパティや関数の仕様を十分に理解した上で、同様のデータ不整合を未然に防ぐためのコード設計が求められると考えております。さらに、実運用環境においては、テストデータを用いたシミュレーションや、更新後のデータソースのリフレッシュ処理も併用することで、より堅牢なシステム運用が実現できるでしょう。
おわりに

本記事では、PowerAppsにおけるギャラリー内のドロップダウンで発生する「前回値の引き継ぎ」問題について、その現象の詳細、原因の解析、そして具体的な解決策について、段階的にご説明してまいりました。皆さまが実際に同様の問題に直面された際の参考となるよう、実践的な解説を心がけました。今後もさらなる改善策や新たな機能の紹介を通じて、PowerAppsを用いたアプリ開発の知見を深め、より快適なシステム運用に貢献できればと考えております。
今回ご紹介した解決策は、DefaultプロパティとPatch関数の仕様に着目したものであり、特にSharePointリストとの連携においては、データの不整合が業務に大きな影響を及ぼすことがあるため、注意が必要です。私あんちゃんも、今回の問題を解決する過程で多くの学びを得ることができました。読者の皆さまにおかれましても、ぜひ今回の事例を参考にしていただき、実際のアプリ開発におけるトラブルシューティングの一助としていただければ幸いです。
最後までお読みいただき、誠にありがとうございました。今後も皆さまのお役に立つ情報を、分かりやすく丁寧にお伝えしてまいりますので、どうぞよろしくお願いいたします。
コメント