こんにちは、あんこ先生です。
任意のキーワードを入力してギャラリーコントロールのアイテムを動的に絞り込みたい。
そんなとき、頼りになるのがSearch関数です。
StartsWith関数の前方一致やEndsWith関数の後方一致ではなく、キーワードを含んでいれば抽出できるのは強みですよね。
便利なSearch関数ですが、検索できる列はテキスト型のみという制限があります。
つまり、数値型はもちろん、選択肢型やユーザー型も対象外なのです。
これでは利便性がいまいちですよね。
そこで今回はテキスト型以外も検索できるようにする方法を紹介します。
Contents
Search関数でテキスト型以外も検索する方法の事前準備
先程も記載しましたがSearch関数はテキスト型の列のみ検索できます。
SharePointリストでテキスト型として扱えるのは1行テキストと複数行テキストの2つです。
せめて数値型くらいは対応して欲しいところですが、何年もこの仕様なので期待薄です。
テキスト型しか検索できないなら、テキスト型にしてしまえばいいじゃない!
そんなわけで、データ型ごとにテキスト型に変換した検索用の列を追加していきましょう。
おおまかな流れ
ギャラリーコントロールのItemsプロパティへテキスト型に変換した列を追加する
Search関数の検索範囲に上記1で追加した列を記載する
使用するデータソース
毎度おなじみSharePointリストです。
リスト名はデータ型汎用サンプルで、読みやすくするため各列名はデータ型にしています。
Search関数の使い方
前提としてSearch関数の使い方がわからないと理解が深まりませんよね。
Search関数の構成は以下のとおりです。
Search( データソース , 検索キー , 検索範囲 )
データソース | テーブル型です。SharePointリストやそれを格納したコレクションなどを指定します。 |
検索キー | テキスト型です。後述する検索範囲にこの値を含んでいないか検索します。 |
検索範囲 | テキスト型の列です。カンマで区切れば複数指定できます。 |
戻り値 | テーブル型です。データソースから検索範囲に検索キーを含んだアイテムを抜き取ります。 |
サンプルコード
データ型汎用サンプルの1行テキスト列にテキスト入力コントロールに入力したキーワードが含まれているアイテムを抽出する場合
Search(
データ型汎用サンプル, //SharePointリスト名
テキスト入力コントロール.Text, //検索キー
'1行テキスト' //検索範囲
)
モダンコントロールのテキスト入力コントロールを利用する場合は、TextプロパティではなくValueプロパティを指定しましょう!
仕組みは理解できたでしょうか?
単一値列をテキスト型に変換する
単一値列とは数値型や日付型のようにひとつのアイテムにひとつの値を持つ列のことです。
はじめに日付型をテキスト型に変換した列をデータソースに追加してみましょう。
データソースに列を追加するにはAddColumns関数を使います。
つまり、Search関数の第1引数をAddColumns関数で囲みます。
さらにテキスト型に変換するため、Text関数で変換元の列を囲んで、検索用の列を追加します。
こんなイメージですね。
具体的なギャラリーコントロールのItemsプロパティに記載するコードは次のとおりです。
Search(
AddColumns(データ型汎用サンプル,
txt日付,Text(日付)
),
テキスト入力コントロール.Text,
txt日付
)
元の列はそのまま残るため、2次利用もバッチリですね。
日付と時間型はもちろん、数値型も同様の手順で扱えます。
レコード型の特定の列をテキスト型に変換する
複数選択を許可していない選択肢型やユーザー型のようにひとつのアイテムにレコードの入れ子を持つ列のパターンです。
レコードなのでいくつかの列を内包しています。
検索対象としたい列を指定して、検索用の列を追加します。
下記サンプルだとグループ,ユーザーまたはグループ列に内包されたDisplayName列を指定しています。
具体的なギャラリーコントロールのItemsプロパティに記載するコードは次のとおりです。
Search(
AddColumns(データ型汎用サンプル,
txtユーザーまたはグループ,ユーザーまたはグループ.DisplayName
),
テキスト入力コントロール.Text,
txtユーザーまたはグループ
)
検索対象に含めたくない列を排除できるのも強みですね。
複数選択を許可していない選択肢列や参照列も同様の手順で扱えます。
テーブル型の特定の列をテキスト型に変換する
複数選択を許可している選択肢型やユーザー型のようにひとつのアイテムにテーブルの入れ子を持つ列のパターンです。
テーブルなのでいくつかのレコードを内包していますし、その数もアイテムごとに異なります。
そのため、検索対象としたい列を指定して、内包する値をすべてつなげてしまいましょう。
Concat関数でつなげた値を検索用の列として追加します。
イメージしにくいと思いますので、つなげた値を青塗りしたラベルコントロールに表示してみました。
ぴったりつながってますね。
具体的なギャラリーコントロールのItemsプロパティに記載するコードは次のとおりです。
Search(
AddColumns(データ型汎用サンプル,
txt複数可選択肢,Concat(複数可選択肢,Value)
),
テキスト入力コントロール.Text,
txt複数可選択肢
)
2次利用はしないので見た目は気にしない。
明日のための予備知識
応用 ユーザーに検索範囲を選択させる
何でもかんでも検索範囲に含めるとどこかしらで引っかかってしまいます。
ある程度はユーザーに決めさせたいですよね。
例えばユーザーまたはグループ列を検索範囲に含めるかをチェックボックスコントロールで選べるようすることもできます。
仕組みは単純で、チェックボックスコントロールの値で検索範囲の値を切り替えているだけです。
If(チェックボックス.Value,
//チェックボックス=trueならユーザーまたはグループ列を除く
Search(
AddColumns(データ型汎用サンプル,
txt複数可選択肢,Concat(複数可選択肢,Value)
),
テキスト入力コントロール.Text,
txt複数可選択肢
),
//チェックボックス=falseならユーザーまたはグループ列を含む
Search(
AddColumns(データ型汎用サンプル,
txt複数可選択肢,Concat(複数可選択肢,Value),
txtユーザーまたはグループ,ユーザーまたはグループ.DisplayName
),
テキスト入力コントロール.Text,
txt複数可選択肢,txtユーザーまたはグループ
)
)
ひと手間加えると使い勝手がよくなりますね。
やらかし フォームコントロールでエラー発生
ひとつ注意するポイントがあります。
それはギャラリーコントロールで選んだアイテムをフォームコントロールのItemプロパティに渡している場合です。
フォームコントロールのItemプロパティはDataSourceプロパティに含まれない列を許容してくれません。
この場合はDropColumns関数を使って、検索用の列を削除しておきましょう。
Search関数でテキスト型以外も検索する方法のまとめ
今回はSearch関数でテキスト型以外の列も検索できる方法を紹介しました。
テキスト型に変換してしまえば検索範囲として利用できることがわかりましたね。
扱いたい列が単一値、レコード、テーブルのいずれかで多少手順が変わりますが、そんなに難しくないですね。
厳密にAndやOr検索するなら列ごとのコントロールを設置していく必要がありますが、おおまかな検索であれば十分だと思います。
なによりスマートですよね。
Search関数でテキスト型以外も検索する方法を紹介しました。
コメントを残す