AppSheetを使っていると、Enumlistのように1つのセルに保存された複数のデータをリスト型で表示したいときがあります。
ここではその方法について解説しています。
結論|split関数とselect関数を使う
最初に結論から言うと、Enumlistで保存されたデータを選択可能なリスト型のプルダウンとして表示するには、Valid ifでsplit関数とselect関数を使います。
select関数は指定したカラムに該当する値を取得してくる関数です。(参照先は1つのデータのためlookup関数でも代用できます)
split関数は指定した文字列で分割する関数です。
selectまたはlookupで引っ張ってきたEnumlist形式で保存されたデータをsplitで分割してリスト化します。
例えば以下のような数式を記述します。
split((SELECT(支出先一覧[支出大カテゴリー],[取引先名]=[_thisrow].[支出先])),",")
こうすることで、ビューで対象項目をボタンまたはプルダウン形式で表示することができます。
以下で何をしているかを解説していきます。
SPLIT関数でリスト化する
AppSheetにおけるsplit関数は指定した文字列で対象の文字列を分割しリスト化する関数です。
基本構文は以下のようになっています。
SPLIT(テキスト, 区切り文字)
例えば、「子ども費 , 衣類, ファッション, その他」という1つの文字列があった場合、これを「,(カンマ)」で、区切ると「子供費」「衣類」「ファッション」「その他」という4つのデータに分割できます。
SPLIT("子ども費 , 衣類, ファッション, その他", ",")
もちろん、カンマ以外で区切ることも可能です。
SPLIT("234-567-890", "-")
この結果は「234」「567」「890」になります。
(参考) AppSheet Help: SPLIT
SELECT関数
select関数は指定したテーブルのカラムの中で、指定した条件に合致する行のデータをリスト形式で取得する数式です。
一般的には次のような構文になっています。
SELECT(テーブル名[カラム名], 行の条件, 重複の有無)
第3引数の「重複の有無」はtrueかfalseで指定します。デフォルトはtrueです。
例えば、以下のような数式があるとします。
SELECT(支出先一覧[支出大カテゴリー],[取引先名]=[_thisrow].[支出先])
これは「支出先一覧」テーブルの「支出大カテゴリー」のデータを取得することを意味しています。
抜き出す行の条件は同じテーブルの「取引先名」カラムの値が、ビューで現在入力している「支出先」の項目の値に一致するものとしています。
ここでは、[取引先名]=[_thisrow].[支出先]の条件に一致するのは1つのみなのでSELECTのままにしています。
SELECTで複数の値がヒットする可能性がある場合
もしSELECT関数で複数のデータがヒットする場合はANY関数を使って、最初にヒットした値のみを取得します。
ANY(SELECT(支出先一覧[支出大カテゴリー],[取引先名]=[_thisrow].[支出先]))
こうすることでSPLITで分割することが可能になります。
Valid Ifで表示項目を制限する
Valid Ifはビューのフォームで入力可能な項目や値を制限する機能です。
ここでは、split((SELECT(支出先一覧[支出大カテゴリー],[取引先名]=[_thisrow].[支出先])),",")
を指定することで、該当するリストの値のみを選択可能としています。※カラムの型がリストになっている必要があります(ListやRefなど)
Valid Ifはとてもいろいろなことができるのでより詳しいことは下記をご参考ください。
- 【AppSheet】Valid Ifとは何か?他のテーブルや列(カラム)のデータを選択肢や値としてプルダウンで表示する方法
- 【AppSheet】Valid IfやInvalid value errorとは何か?入力制限(バリデーション)の設定方法を実例で解説
- 【AppSheet】Valid Ifで入力欄を自由入力にする方法を実例で分かりやすく解説。プルダウンや選択式にしない
Enumlistで保存されたデータ
そもそも、型がEnumlistのカラムにおいて保存された複数のデータはリスト形式ではなくカンマ区切りの1つのデータとして保存されます。
例えば、「支出大カテゴリー」というカラムの型がEnumListの場合、以下のように複数の候補の中から複数の値を選択することができます。
保存したデータは以下のようにカンマでつながった形で保存されます。
このEnumListで保存されたデータをSelect関数などでそのまま呼び出すと、List形式ではなく「子ども費 , 衣類・ファッション , その他・雑費」といった1つのデータとして扱われてしまいます。
このため、単にSELECTのみでデータを抽出すると望んだ値になりません。
SELECT(支出先一覧[支出大カテゴリー],[取引先名]=[_thisrow].[支出先]))
SPLIT関数でリスト化することで望んだ状態で選択可能になります。
split((SELECT(支出先一覧[支出大カテゴリー],[取引先名]=[_thisrow].[支出先])),",")