
都道府県で北海道を選んでいるのに、市区町村で新宿区が選べてしまう、こんな入力ミスがデータに混入すると、集計やレポートの段階で大きな問題になります。Power Apps では連動プルダウン(カスケードドロップダウン)を実装することで、存在しない組み合わせをそもそも選べないようにできます。この記事では、Filter 関数を使った連動プルダウンの作り方を、マスターデータの準備から動作確認まで順を追って解説します。
連動プルダウンが必要な理由
Power Apps でドロップダウンを単体で使う場合、各コントロールは互いに独立しています。都道府県の選択結果に関係なく、市区町村の一覧には全都道府県の市区町村がすべて並んでしまいます。ユーザーは意図せず不正な組み合わせを選べてしまい、後工程でデータを使う人が困ることになります。
物流系の社内アプリでこのパターンを経験しました。配送先の都道府県と市区町村を別々のドロップダウンで選ばせていたのですが、誤った組み合わせのデータが数件混入し、配送先への連絡で問題が発生したのです。連動プルダウンに変えてからは、そういったミスは完全になくなりました。
連動プルダウンは業務アプリでよく登場するパターンです。都道府県と市区町村に限らず、大カテゴリと小カテゴリ、部署と担当者、製品ラインとモデル番号など、親子関係のある選択肢ならどこでも同じ設計が使えます。
マスターデータの準備
連動プルダウンを実装するには、大分類と小分類を紐づけたマスターデータが必要です。SharePoint リストを使うのが最も一般的で、委任にも対応しているため大量データにも対応できます。
SharePoint リストの構成はシンプルです。大分類列(例:Prefecture / 都道府県)と小分類列(例:City / 市区町村)の2列を持つリストを作成します。行ごとに「北海道, 札幌市」「北海道, 函館市」「東京都, 新宿区」のように、大分類と小分類の組み合わせを1行ずつ登録します。
データ件数が100件以下の場合は、SharePoint リストの代わりにコレクションをアプリ起動時に作成する方法もあります。コレクションの基本的な使い方を理解していれば、OnStart でマスターデータを定義するアプローチも取れます。ただし将来的なデータ追加のしやすさを考えると、SharePoint リストで管理するほうが運用しやすいです。
Filter 関数で連動させる実装
マスターデータが用意できたら、子のドロップダウンの Items プロパティに Filter 関数を設定します。親のドロップダウンで選ばれた値を条件として、対応する小分類だけを絞り込むのが基本の考え方です。
設定手順
- 都道府県を選ぶ親ドロップダウン(dd_Prefecture)をキャンバスに配置し、Items に SharePoint リストや Distinct 関数で重複除去した都道府県一覧を設定します
- 市区町村を選ぶ子ドロップダウン(dd_City)を配置し、Items プロパティに下記の Filter 式を設定します
- アプリをプレビューして、親を選択したときに子の選択肢が絞り込まれることを確認します
// dd_City の Items プロパティ
Filter(MasterList, Prefecture = dd_Prefecture.Selected.Value)

Filter 関数の基本的な書き方はギャラリーの絞り込みでよく使いますが、ドロップダウンの Items プロパティにも同じように使えます。Filter の書き方に慣れていない方はそちらの記事も合わせて読むと理解が深まります。
親を変更したときに子をリセットする
連動プルダウンで見落としがちなのが、親の選択を変えたときの子のリセットです。例えば北海道を選んで札幌市を選択した後、都道府県を東京都に変更しても、子のドロップダウンには札幌市が選択状態のまま残ることがあります。これは実際には東京都に存在しない市区町村が選択された状態なので、データとして不正になります。
対策は親ドロップダウンの OnChange プロパティで子をリセットすることです。
// dd_Prefecture の OnChange プロパティ
Reset(dd_City)
この1行を追加するだけで、親を変更したときに子の選択が自動的にクリアされます。
AllowEmptySelection と IsBlank を組み合わせた必須チェック
通常のドロップダウンは初期状態で必ず何かが選択されています。アプリを起動した瞬間から先頭の選択肢が選ばれた状態になるため、IsBlank でチェックしても必ず false が返ってきます。これでは未選択状態を検出できません。
未選択状態を許可したい場合は、ドロップダウンの AllowEmptySelection プロパティを true に設定します。これにより何も選択されていない状態が作れるようになり、IsBlank(dd_Prefecture.Selected.Value) が正しく true を返すようになります。
// 必須チェックの例(AllowEmptySelection: true の場合)
IsBlank(dd_Prefecture.Selected.Value)
必須入力チェックの全体設計については、エラーメッセージの実装パターンでも詳しく解説しています。送信ボタンの制御や varFormSubmitted パターンと組み合わせることで、連動プルダウンの必須チェックも同じ設計の中に自然に組み込めます。
3階層以上の連動プルダウン
都道府県→市区町村→町名のように3階層になる場合も、同じパターンを繰り返すだけです。第2階層の子ドロップダウンをさらに親として、第3階層の子ドロップダウンの Items に Filter を設定します。
ただし、階層が増えるほどリセット処理も階段状に必要になります。第1階層を変更したときは第2・第3階層をリセット、第2階層を変更したときは第3階層をリセット、という具合です。OnChange の中に Reset を複数書けば対応できます。
// dd_Prefecture の OnChange(3階層の場合)
Reset(dd_City);
Reset(dd_Town)
// dd_City の OnChange
Reset(dd_Town)
階層が深い選択肢を扱う場合、マスターデータの列設計が重要になります。それぞれの階層に対応した列を用意し、Filter の条件が確実に一致するように列名と値の形式を統一しておきましょう。
まとめ:選ばせない設計が、後工程を守る
連動プルダウンの実装は Filter 関数1行で実現できます。難しい処理はありませんが、親変更時のリセット処理や AllowEmptySelection の設定を忘れると、不正なデータが入り込む穴が残ります。設計の細部まで意識することが、現場で使い続けられるアプリを作る基本です。
バリデーション設計の全体像は入力ミス防止ガイドにまとめています。個々のテクニックを組み合わせて、ユーザーが迷わず正確に入力できるフォームを作り上げましょう。市民開発とはこういう地道な設計の積み重ねだと、私は思っています。
入力エラーに関する一覧はこちらの記事をご覧ください。