こんにちは、あんこ先生です。
SharePointリストの選択肢列、使っていますか?
その名の通り、あらかじめ入力できる値を選択肢として用意することができます。
さらに複数の値をひとつのフィールドに格納できる優れものです。
つまりコンボボックスとの相性は抜群ですね。
ところが、フォームやPatch関数で書き込もうにも選択肢列だけ空欄になってしまいます。
それは、選択肢列は入れ子構造であり、列名を合わせないと門前払いしてしまうからです。
そこで、今回はフォームでもPatch関数でも選択肢列に書き込む方法をコピペできるコード付きで解説します。
少し難しいかもしれませんが、コピペで乗り切りましょう!
この記事で出てくるコンボボックスコントロールって何?という方は先にコチラの記事をお読みください。
Contents
選択肢列とは
あらかじめ指定したオプションの一覧から、ユーザーに選択させるよう制御します。
列に格納される値を制限できるため、列内のすべての値を一貫したものにできます。
と謳っておきながら、アプリからだと好き勝手できます。
SharePointリストからはその通りなんですけどね。
ドロップダウンやコンボボックスの選択肢用リストを別途用意しなくてもよい点があります。
ただし、選択肢の追加は手間がかかりますし、数量が多い場合は非効率です。
内包した選択肢として利用したい場合は、10個くらいを目安にしましょう。
また、通常は入れ子のレコード型ですが、複数選択可とした場合はテーブル型になります。
選択肢列のつくり方
作り方はとてもかんたんです。
SharePointリストの列の作成から種類選択肢を選ぶだけです。
とはいえ、これだけでは機能しませんから選択肢も設定しておきます。
その他オプションにある複数選択を許可をオンにすれば複数選択できます。
選択肢列の参照方法
複数選択を許可の採否でデータ型が異なるため指定方法も変わります。
オンならテーブル型、オフならレコード型です。
どちらも入れ子の列名がValueになっているところが特徴です。
例示はラベルですが、ギャラリーに表示すると扱いが容易になります。
選択肢列への書き込み方法│複数選択を許可しない
フォームコントロール│レコード型
フォームコントロールで行うパターンです。
扱いは気にせず、自動で作成されたものがそのまま使えます。
フォームコントロール│選択肢にない値
選択肢列ですが、選択肢にないものも書き込めます。
色々なやり方がありますが、今回はコンボボックスのSearchTextを利用します。
検索値はひとつしか書き込めないため、データカードのUpdateに条件分岐を添えてレコード型で指定します。
つまり、未選択の場合は検索値、選択済みの場合は選択値が書き込まれます。
この方法で追加した選択肢は、そのレコードが残っている間はSharePointリストの選択肢に追加されます。
//Update
If(IsBlank(DataCardValue3.Selected),
{Value:DataCardValue3.SearchText},
DataCardValue3.Selected
)
Selected列に選択肢にないという値を書き込みました。
Patch関数で書き込む
フォームを使わず、コンボボックスの値をPatch関数で直接書き込むパターンです。
先ほどの選択肢にないやり方とほぼ同じです。
ただし、Selected列はレコード型の入れ子なので記述方法が若干異なりますので注意してください。
{}の中に{}を使って、レコードの中にレコードを指定します。
Patch(lstSelected,Defaults(lstSelected),
If(IsBlank(cmbSelected.Selected),
{Selected:{Value:cmbSelected.SearchText}},
{Selected:cmbSelected.Selected}
)
)
これで次のように登録されるはずです。
必須入力の列がある場合は、それも忘れずに含めてくださいね。
列への書き込み方法│複数選択を許可する
フォームコントロール│テーブル型
フォームコントロールで行うパターンです。
レコード型と変わりません。
扱いは気にせず、自動で作成されたものがそのまま使えます。
フォームコントロール│選択肢にない値
こちらもコンボボックスのSearchTextを利用します。
複数選択を許可していますが検索値はひとつしか書き込めないため、データカードのUpdateに条件分岐を添えてレコード型で指定します。
この方法で追加した選択肢も、そのレコードが残っている間はSharePointリストの選択肢に追加されます。
テーブル型ですが、未選択の判定をIsBlank関数で行います。
SearchTextはテキスト型です。
まずレコードにしてTable関数で囲み、テーブル型にします。
先ほどと異なり、コンボボックスの戻り値がSelectedItemsになっているので注意してください。
If(IsBlank(DataCardValue2.SelectedItems),
Table({Value:DataCardValue2.SearchText}),
DataCardValue2.SelectedItems
)
Category列に選択肢にない2という値を書き込みました。
Patch関数で書き込む
フォームを使わず、コンボボックスの値をPatch関数で直接書き込むパターンです。
先ほどの選択肢にないやり方とほぼ同じです。
ただし、Category列はテーブル型の入れ子なので記述方法が異なりますので注意してください。
複数選択を許可したコンボボックスの戻り値はテーブル型です。
そのため、未選択判定をIsEmpty関数に変えています。
あとTitle列の入力は必須にしていたので記述しています。
必須でない場合は外してください。
Patch(lstSelected,Defaults(lstSelected),
If(IsEmpty(cmbCategory.SelectedItems),
{Title:"Patch",Category:Table({Value:cmbCategory.SearchText})},
{Title:"Patch",Category:cmbCategory.SelectedItems}
)
)
これで次のように登録されるはずです。
今回は、SharePointリストの選択肢列に書き込む方法を紹介しました。
ひとつのフィールドに複数の値を格納できるのが特徴です。
Search関数で選択肢列を検索した場合、どれかひとつが含まれていればそのアイテムが表示されます。
リスト画面のフィルターでは、どれかひとつ含まれていたらすべてのアイテムが抽出されます。
挙動が異なるので注意しましょう。
ところで、SharePointリストには選択肢列に似た参照列というものがあるのはご存じですか?
こちらは他リストの列を参照し、その値を選択肢とします。
また、選択した参照先のレコードを返します。
これまた書き込むにはコツがいるので次回はそのあたりを解説していこうと思います。
続きはこちらの記事をどうぞ。(作成中!)
コメントを残す