PowerApps Choicesの使い方 選択肢列の基本

PowerApps Choicesの使い方を表すアイキャッチ

PowerApps Choicesでつまずくときって、だいたい「候補は出たのに保存できない」「初期値だけ空になる」みたいな場面ですよね。

原因は、Choicesを文字列一覧として見てしまうことが多いです。実際はレコードのテーブルとして扱うと、Combo box、DefaultSelectedItems、Patchまで一気に見通しがよくなります。

目次

PowerApps Choicesは選択肢のテーブルを返す関数

Close-up of a video editing timeline on a computer screen, showcasing modern technology.

まずはChoicesの正体を押さえましょう。ここが曖昧なままだと、.ValueSelectedItemsPatch のすべてがややこしく見えます。返り値の形から整理すると、式の迷子がかなり減りますよ。

Choices関数の基本構文

Choices関数は、SharePointやDataverseの選択肢列、またはルックアップ列の候補を取り出すために使います。Microsoft Learnでは、Choicesについて次のように説明されています。

検索列で使用可能な値のテーブルを返します。

Microsoft Learn Choices 関数

基本形はシンプルです。

Choices(案件管理.ステータス)

ここで大事なのは、列名を文字列で書かないことです。"ステータス" のようにダブルクォーテーションで囲むのではなく、データソース.列名の形で直接参照します。

注意

Gallery1.Selected.ステータス のようにコントロール経由で列を渡す形は、Choicesの列参照としては使えません。

候補を取りたい列そのものを、データソースから直接指定します。

返ってくるのは文字列ではなくレコードのテーブル

Choicesで一番ハマりやすいのは、候補が「完了」「未着手」のような文字列だけに見えるところです。でもPower Fxの中では、候補はレコードの集まりとして返ります。

SharePointの選択肢列なら、よく見る形は次のようなイメージです。

見た目実際に扱う形のイメージよく使う場所
未着手{Value:"未着手"}Combo boxの選択値
進行中{Value:"進行中"}PatchやDataCardのUpdate
完了{Value:"完了"}ラベル表示では .Value

つまり、ラベルに表示するだけなら ComboBox1.Selected.Value のようにValueを見ます。一方で保存するときは、テキストだけではなく選択されたレコードを渡す場面が多いです。

ここを分けて考えると、かなり楽になります。表示するときは Value、保存するときは SelectedSelectedItems。この役割分担がChoices攻略の土台です。

ChoiceとChoicesの違いを先に分ける

名前が似ているので少しややこしいですが、ChoiceChoices は文脈で意味が変わります。

  • Choice はDataverseなどの列型としての選択肢
  • Choices は複数選択できる列型を指すことがある
  • Choices() はPower Fxの関数

この3つを混ぜると、検索している途中で頭がこんがらがります。実装中は「列型の話なのか」「候補を取り出す関数の話なのか」を分けて見るのがおすすめです。

ポイント

PowerApps Choicesを使うときのコツは、候補をテーブルとして受け取り、表示ではValue、保存ではレコードとして扱うことです。

Choices関数が選択肢のテーブルを返す図解

Choicesは「候補の文字を取る関数」ではなく「候補レコードの表を取る関数」と見ると、後の式がかなり読みやすくなります。

Combo boxやDrop downでChoicesを使う基本

Finger tapping on a tablet screen to select food items in a restaurant setting.

候補の取り出し方がわかったら、次はコントロールに表示します。ここではItems、表示列、初期値、選択値の取り出し方を、実装順に見ていきます。特にCombo boxではDefaultSelectedItemsが大事です。

ItemsにChoicesを設定する

SharePointリストの選択肢列をCombo boxに出すなら、まずは Items にChoicesを設定します。

Choices(案件管理.ステータス)

フォームで自動生成されたCombo boxなら、すでにこの形になっていることも多いです。自分で追加したCombo boxでも、基本は同じです。

// cmbStatus.Items
Choices(案件管理.ステータス)

単一選択だけならDrop downでも動かせます。ただ、検索したい、複数選択したい、後から表示項目を調整したいなら、Combo boxの方が扱いやすいです。

やりたいことおすすめコントロール理由
候補が少なく単一選択Drop down画面がシンプル
候補が多く検索したいCombo box検索しながら選べる
複数選択したいCombo boxSelectedItemsを使える

表示列はValueを見せることが多い

SharePointのChoice列では、候補の表示にValueを使う場面が多いです。クラシックなCombo boxでは、右側のフィールド設定で表示列を選べます。

モダンCombo boxなら、表示テキストを ItemDisplayText で決めます。

// cmbStatus.ItemDisplayText
ThisItem.Value

ここで ThisItem が出てくるのは、Combo boxの各候補が1件ずつのレコードだからです。ThisItem.Value は、そのレコードの表示用ラベルを見ているだけなんですね。

補足

DataverseのChoiceやLookupでは、列や環境によって表示に使うフィールド名が変わることがあります。

迷ったら、まずはData tableなどでChoicesの返り値を一度見える化すると早いです。

初期値はDefaultSelectedItemsに合わせる

Combo boxで「候補は出るのに、既存値が初期表示されない」という悩みはよくあります。この場合は、初期値の形がItemsと合っているかを見ます。

モダンCombo boxの DefaultSelectedItems は、Itemsデータソースに含まれるレコードのテーブルである必要があります。フォーム内で使うなら、基本は次の考え方です。

// 単一選択のDataCard内
Parent.Default

複数選択なら、Parent.Defaultがすでにテーブルとして渡ってくることが多いです。空欄にしたい場合は、空のテーブルを返す設計にします。

// 空にしたいときの考え方
[]

そして、選択後に値を読むときは、単一選択と複数選択でプロパティを分けます。

  • 単一選択なら cmbStatus.Selected
  • 単一選択の表示文字なら cmbStatus.Selected.Value
  • 複数選択なら cmbStatus.SelectedItems
  • 複数選択の表示文字なら Concat(cmbTags.SelectedItems, Value, ", ")

SelectedItemsはテーブルです。テキストとしてそのまま表示しようとすると、思った表示にならないことがあります。ラベルに出すなら Concat でつなぐと見やすいです。

Combo boxでChoicesを使う流れの図解

Combo boxは、ItemsとDefaultSelectedItemsの形を合わせるのがコツです。候補と初期値が別物になっていないかを見るだけで、かなり解決できます。

FilterやSortでChoicesを使いやすく整える

Abstract visualization of data analytics with graphs and charts showing dynamic growth.

実際のアプリでは、選択肢をそのまま出すだけでは足りないことがあります。並べ替えたい、使わない候補を隠したい、入力文字で候補を絞りたい。Choicesはテーブルなので、こうした加工を組み合わせられます。

Sortで選択肢を並べ替える

Choicesの返り値はテーブルなので、Sort で並べ替えできます。SharePointの選択肢列で Value を基準に昇順にしたいなら、次のように書けます。

Sort(
    Choices(案件管理.ステータス),
    Value,
    SortOrder.Ascending
)

候補が「低」「中」「高」のような自然な順番を持つ場合は、SharePointやDataverse側の選択肢順を整える方がわかりやすいです。アプリ側の式で無理に並べるより、データ側を整える方が保守しやすい場面もあります。

Filterで出したくない選択肢を外す

一部の選択肢をアプリ側では出したくない場合は、Filter を使います。

Filter(
    Choices(案件管理.ステータス),
    Value <> "廃止"
)

この式なら、SharePoint側に「廃止」という選択肢が残っていても、アプリの候補には出しません。ただし、完全な権限制御としては弱いです。

ユーザーに絶対に使わせたくない値なら、データソース側の設計や権限も見直してください。アプリの表示だけを隠しても、別の経路から値が入る可能性はあります。

ポイント

表示を少し整えるならFilterやSortでOKです。

業務ルールとして使えない値を防ぎたいなら、データソース設計や入力チェックもセットで考えるのが安心です。

委任できない場面は設計を見直す

Microsoft Learnでは、Choicesは現時点で委任できないと説明されています。ここは実務で見落としやすいポイントです。

選択肢列の候補が10個、20個くらいなら、気にしすぎなくてよい場面もあります。でも、ルックアップ先が大量のレコードを持つ場合は、委任できない影響が出ることがあります。

判断の目安は次の通りです。

状況Choicesで進めやすい設計見直しを検討
固定の選択肢列はい候補が多すぎる場合
小さなマスタ参照場合による件数が増え続ける場合
大量の取引先や商品マスタ注意データソース直接利用が無難

候補が業務マスタのように増え続けるなら、Choicesに頼りすぎない方がいいです。

SharePointリストやDataverseテーブルを直接データソースとして追加し、Combo boxのItemsにそのテーブルを指定する方が、検索や委任の面で安定します。

Choicesの候補をFilterやSortで整える図解

Choicesは便利ですが、万能な検索用データソースではありません。候補が増え続ける列なら、早めにマスタ化を考えると後で楽です。

選択した値を保存するときの考え方

A woman engineer focuses on software analysis using a laptop indoors.

表示はできたのに保存で失敗する場合、ほとんどは値の形が合っていません。選択肢列はテキストだけではなく、選択レコードとして扱う場面があります。単一選択と複数選択で、渡すプロパティを分けて考えましょう。

フォームならUpdateプロパティを確認する

Edit formを使っているなら、まずDataCardの Update プロパティを確認します。

Power Appsが自動生成したフォームでは、選択肢列のDataCardにCombo boxが置かれ、Updateも正しい形になっていることが多いです。

単一選択なら、考え方は次のようになります。

// DataCard.Update
DataCardValue_Status.Selected

複数選択なら、SelectedItems を渡します。

// DataCard.Update
DataCardValue_Tags.SelectedItems

フォームで保存するなら、まずは SubmitForm(EditForm1) を使うのが安全です。Microsoft Learnでも、単純な変更ではEdit formの方が簡単な場合があると説明されています。

Patchでは選択レコードを渡す

Patchで保存する場合も、基本は選択されたレコードを渡します。SharePointの単一選択列なら、次のような形で考えます。

Patch(
    案件管理,
    ThisItem,
    {
        ステータス: cmbStatus.Selected
    }
)

複数選択列なら、選択されたレコードのテーブルを渡します。

Patch(
    案件管理,
    ThisItem,
    {
        関連カテゴリ: cmbCategory.SelectedItems
    }
)

文字列から保存したい場合は、SharePointのChoice列が期待する形に合わせて、{Value:"完了"} のようなレコードを作ることがあります。

Patch(
    案件管理,
    ThisItem,
    {
        ステータス: {Value: "完了"}
    }
)

ただし、これはSharePointの選択肢列を想定した書き方です。DataverseのChoiceでは内部値や選択肢レコードの扱いが変わるため、できるだけ Choices から選んだレコードをそのまま渡す方が安全です。

注意

cmbStatus.Selected.Value のようなテキストだけをPatchに渡すと、列型と合わずに保存できないことがあります。

ラベル表示ではValue、保存ではSelectedという分け方を意識しましょう。

初期値が出ないときはItemsと同じ形か見る

最後に、よくあるトラブルをまとめます。初期値が出ないときは、まずCombo boxの ItemsDefaultSelectedItems の形が合っているかを見てください。

症状見る場所よくある原因
候補は出るが初期値が空DefaultSelectedItems文字列を渡している
保存できないDataCard.Update または PatchValueだけを渡している
複数選択が保存されないSelectMultiple と SelectedItems単一選択の式のまま
候補が古いデータソース列変更後に更新していない

僕なら、まず画面にラベルを置いて、次のように確認します。

// 単一選択の確認
cmbStatus.Selected.Value
// 複数選択の確認
Concat(cmbCategory.SelectedItems, Value, ", ")

見えている値と保存に渡している値を分けて確認すると、原因をかなり絞れます。焦って式を全部書き換えるより、Items初期値保存値の3点を順番に見るのが近道です。

Choicesの選択値を保存するときの分岐図解

保存で迷ったら、単一選択はSelected、複数選択はSelectedItemsです。Valueは表示用と考えると、式の役割がすっきりします。

PowerApps Choicesに関するよくある質問

ChoicesとDistinctはどちらを使いますか?

選択肢列やルックアップ列の候補を取り出すならChoicesです。通常のテキスト列から重複なしの一覧を作るなら、Distinct を使う方が自然です。

Drop downでもChoicesは使えますか?

使えます。ただしDrop downは単一選択向きです。候補が多い、検索したい、複数選択したい場合はCombo boxを選ぶ方が扱いやすいです。

Choicesの候補をアプリから追加できますか?

Choicesは候補を取得する関数です。候補そのものを増やすなら、SharePointの列設定やDataverseのchoice設定を変更します。アプリだけで選択肢マスタを管理したいなら、別テーブル化も検討しましょう。

Choicesが表示されないときは何を見ますか?

列参照が データソース.列名 の形か、データソースを更新したか、表示列がValueかを確認します。それでも出ない場合は、列型、権限、環境差分を順番に見てください。

まとめ

PowerApps Choicesは、選択肢候補をレコードのテーブルとして返す関数です。

表示ではValue、初期値ではDefaultSelectedItems、保存ではSelectedやSelectedItemsを見ると、迷いがかなり減ります。

まずは自分のCombo boxで、Items、DefaultSelectedItems、Updateの3つを並べて確認してみてください。ここがそろうと、選択肢列まわりのエラー対応がぐっと楽になりますよ。

よかったらシェアしてね!
目次