管理人がみんなに伝えたい!!と思った知識や学びを気ままに書いています(^^)

【脱初心者!】select()関数で依存型ドロップダウンリストを作成する方法

【脱初心者!】select()関数で依存型ドロップダウンリストを作成する方法

本記事はノーコードアプリ開発について全く知らなかった管理人が独学で勉強し、ここ大事!と感じた部分を記事にまとめています。

本ブログでは新UI画面で内容をまとめています。

新旧画面への切り替えは、下図を参考に該当アイコンをクリックしてください(^^)

新UI画面の説明

まずはじめに

本記事はこんな人におすすめ!!
  • select()関数の応用を学びたい人
  • 直前に入力したデータの値によって続く入力値を動的に変えたい人
本記事を読んで出来るようになること
  • Valid ifとselect()関数を組み合わせることで完成度の高いアプリが作成できる
  • [_thisrow]を使う関数の条件式の考え方が理解できる

今回はブログ記事の中でも人気のselect()関数についてです。

appsheetで困ったらとりあえずselect()関数を叩けばいい

それくらい用性の高い関数なので、select()関数の理解を更に深める記事を作成しました。

タイトルにある依存型ドロップダウンリストとは、

直前に入力したデータの値によって続く入力値を動的に変える ことを意味しています。

なるべく分かりやすくまとめたつもりなので、ぜひ参考にしてください。

それでは勉強していきましょう!

本記事を読む前にこちらの記事内容を理解しておきましょう

参考記事

検証データの紹介

まず最初に、記事をまとめる際に使用したデータの紹介をします。

テーブルの構成
注文シート

このシートはValid ifにselect()関数を入力したときの挙動を確認するシートです。

注文シート
  • ID:Key値
  • 商品名、サイズ、価格:メニューからリストをもらうカラム値
メニュー

このシートは注文シートにリストを送るためのシートです。

メニュー
  • ID:Key値
  • 商品名、サイズ、価格:注文シートへリストを送るカラム値

これらのデータをappsheetに読み込んで、関数入力の検証を行います。

ポイントとしては、

データを送るシートと受け取るシートのカラム名を同じにする

このようにしておくと、本記事の内容を真似すればどんなアプリにでも使えます。

データタイプRefでは成立しない?

select()関数の検証をする前にこちらの疑問を解説します。

読者の皆さんの中で「データタイプRefでは駄目なのか?」と疑問を持たれた方もいらっしゃるかもしれません。

結論から言うと、Ref関係は1対1の関係なら使用できますが、1対多の関係なら使用できません

ref関係の概念

上図の◯パターンでは同じ商品名に紐ついている情報が1つしかないため、データのリレーションを持たせることが可能です。

反対に✕パターンでは同じ商品に異なるサイズとして複数の情報が紐ついています。

試しにRef関係を結ぶと、appsheetの画面ではカレーライスの選択肢が3つ出現することになります。

ref画面の例

紐ついているサイズのデータは上から少なめ、普通、大盛りですが、

これでは選んでみないことには紐ついているデータが分からないです。

この設定では入力者が混乱するので、1対多の関係になる場合はRefは使わないのがベターです(^^)

データタイプrefについて学べる記事を用意しました

参考記事

ドロップダウンリストの作り方

ドロップダウンリストのイメージ

上図のような入力値によって続く入力値のリストを動的に変更する仕組みを作ってみたいと思います。

汎用性が高く、私もこの設定方法で困ったことがないのでぜひ参考にしてください(^^)

まず設定の流れを先に説明し、ポイントをあとから解説します。

商品名カラムにリストを送る
unique関数の入力

Valid ifに以下の関数を入力します。

unique(メニュー[商品名])

unique()関数

括弧の中にリストを送ることで、リスト内の重複する値を除外してリストにし直す関数

サイズカラムのValid ifにselect()関数を入力する
サイズを抽出するselect関数

Valid ifに以下の関数を入力します。

select(メニュー[サイズ],[商品名]=[_thisrow].[商品名])

価格カラムのInitial Valueにselect()関数を入力する
initial valueの関数

Initial Valueに以下の関数を入力します。

any(select(メニュー[価格],and([商品名]=[_thisrow].[商品名],[サイズ]=[_thisrow].[サイズ])))

設定としてはこれで完了です(^^)

続いてなぜそうなるのか?を解説します。

select()関数と[_thisrow].[カラム]の考え方

まずselect()関数の引数の渡し方を確認します。

select()関数の引数の渡し方

第一引数に検索対象となるリストを指定し、第二引数にそのリスト内のフィルター条件式を指定します。

今回の記事で入力した関数

select(メニュー[サイズ],[商品名]=[_thisrow].[商品名])の考え方ですが

第一引数に送りたいリストを考える
関数の考え方

つまり、注文シートのサイズに送りたいリストはメニューにあるサイズのカラム値です。

第一引数をメニュー[サイズ]と入力することで、C列を検索対象としています。

メニュー[サイズ]のリスト
直前で選んだ商品名に紐ついているサイズの情報が欲しい

次に考えるべきこととして、注文シートで選んだ商品名とメニューにある商品名が同じであるとき、

それに紐ついているサイズの情報をドロップダウンリストで表示させる方法です。

例えば、注文シートでカレーライスを選択した場合

カレーライスの選択肢

緑で塗られたセルの情報が欲しいことになります。

対象となるリスト(C列)から抽出条件に該当するリストを作成するのは、select()関数にお任せ(^^)

select()関数の第二引数に送るフィルター条件式を考える

select(メニュー[サイズ],[商品名]=[_thisrow].[商品名])

この第二引数の条件式の考え方ですが、

select()関数とthisrow

1.第一引数にメニュー[サイズ]のリストを送ると、select()関数はメニューにフォーカスします

2.第二引数には『メニュー』(select()関数が参照しているシート)『注文シート』(select()関数を入力しているシート)select()関数が区別出来るように引数を渡す必要があります

3.参照先:[商品名]入力先:[_thisrow].[商品名]でその区別が可能です

[_thisrow].[カラム]は関数を入力しているテーブルにあるカラムのことを指し、

select()関数が迷子にならないようにするための目印と思ってください(^^)

any(select())関数と価格カラムについて

価格カラムについても考え方は同じです。

第二引数のフィルター条件式が少し複雑になっただけだと思ってください(^^)

やりたいことのイメージとしては、下図のようなデータの紐付きです。

価格カラムの設定イメージ
データのイメージ

今回は上図のようなテーブルを用いて説明します。

データのイメージを見てもらうとわかりますが、価格の値は必ず一意の値を取ります。

商品名とサイズを決めたら価格は1つに決まります

こういう場合は、any(select())関数を用いれば問題は全て解決します。

今回の記事で入力した関数

any(select(メニュー[価格],and([商品名]=[_thisrow].[商品名],[サイズ]=[_thisrow].[サイズ])))の考え方は、以下の流れです。

第一引数に送りたいリストを考える
価格リストの検討

つまり注文シートの価格に送りたいリストはメニューにある価格のカラム値です。

第一引数にメニュー[価格]と入力することで、D列を検索対象としていることになります。

メニュー[価格]のリスト
直前で選んだ商品名とサイズに紐ついている価格の情報が欲しい

次に考えるべきこととして、注文シートで選んだ商品名とサイズ、メニューにある商品名とサイズが同じであるときに

それに紐ついている価格の情報を初期値として取得する方法です。

例えば、注文シートでカレーライスを選択した場合、普通サイズは600円で大盛りサイズは800円。

データのイメージ

対象となるリスト(D列)から抽出条件に該当するリストをselect()関数で作成し、一意の値としてany()関数で取得します。

select()関数の第二引数に送るフィルター条件式を考える

any(select(メニュー[価格],and([商品名]=[_thisrow].[商品名],[サイズ]=[_thisrow].[サイズ])))

この第二引数の条件式の考え方は以下です。

any(select))関数の考え方

関数の検証

効果の検証

最後に入力した関数がどういった画面の挙動を示すのか確認したいと思います(^^)

カレーライスを選んだ場合
カレーライス普通を選んだ場合

カレーライス→普通と選んだ場合、価格¥600を取得しています。

カレーライス大盛りを選んだ場合

カレーライス→大盛りと選んだ場合、価格¥800を取得しています。

ハンバーグを選んだ場合
ハンバーグ200gを選んだ場合

ハンバーグ→200gと選んだ場合、価格¥800を取得しています。

ハンバーグ300gを選んだ場合

ハンバーグ→300gと選んだ場合、価格¥1000を取得しています。

ドリンクを選んだ場合
ドリンク小を選んだ場合

ドリンク→小と選んだ場合、価格¥150を取得しています。

ドリンク中を選んだ場合

ドリンク→中と選んだ場合、価格¥250を取得しています。

ドリンク大を選んだ場合

ドリンク→大と選んだ場合、価格¥400を取得しています。


まとめ

以上、依存型ドロップダウンリストの作り方についての記事でした。

作成するには、select()関数を使いこなせるようになることが絶対条件です。

select()関数はappsheetでアプリ開発をするなら避けて通れない関数です。

本記事でselect()関数について、より一層理解が出来るようになっていただければ幸いです(^^)

また、今回select()関数を入力したValid ifについても理解しておくことをおすすめします。

Valid ifについて学べる記事を用意しました

参考記事

記事内容について何かありましたらページ下にあるコメント欄からコメントをお願いします。

わかりにくかった部分や間違った情報などご指摘いただけると嬉しいです!

勉強お疲れさまでした(^^)

14 COMMENTS

はな

初めてコメントさせて頂きます。
今回のselect()関数で依存型ドロップダウンリストを作成する方法大変参考になりました。
1点教えて頂きたい事があります。
select(メニュー[サイズ],[商品名]=[_thisrow].[商品名])で紐づいたサイズは出せるのですが
サイズの種類が増えた場合リストの順番がバラバラになってしまいます。
例えばハンバーグを選択後、100g、200g、300g、400g、500gと表示されてほしいところ100g、300g、200g、500g、400gとなってしまいます。これをリスト通り順番に表示させることは可能でしょうか? よろしくお願いします。

返信する
k

コメントの確認が遅れてしまい申し訳ございません!
このブログではany(select())関数を用いて一意の値を取得する方法でまとめましたが、select()関数をSuggested valuesに置くことでリストとして選択肢を返したいとのことですね。

関数から返ってくるリストの値を並び替えたい場合は、sort()関数を使用します。
select(メニュー[サイズ],[商品名]=[_thisrow].[商品名])をsort()でくくってあげてください。

つまり、sort(select(メニュー[サイズ],[商品名]=[_thisrow].[商品名]))
これでリストを昇順に並び替えることが可能です(^^)

返信する
やす

初コメント致します。
最近勉強し始めてとても参考になります。
質問なのですが
any(select(メニュー[価格],and([商品名]=[_thisrow].[商品名],[サイズ]=[_thisrow].[サイズ])))
を使用して新規にカラムを追加することは出来たのですが、すでにあるカラムを編集した場合は機能しないです。
これは仕様なのでしょうか?
間違って登録したデータを修正した場合any関数を使った項目は変化しないため修正に苦労しています。なにか方法はあるのでしょうか?

返信する
k

コメントありがとうございます(^^)
any(select())関数を、価格カラムのInitial valueに入力していると思います。
Initial valueは「初期値」を意味するので、新規にデータを登録(Add)の時には機能しますが、一度登録したデータを更新(Edit)する時には機能しません。
これを解決する方法としては、以下の方法があります。

1.Initial valueではなく、App formulaに関数を入力する
※ただし、関数を入力した価格カラムの編集ができなくなります。

2.Update Behavior → Reset on edit?にチェックを入れる
※ただし、Editを開くたびに価格カラムの値は初期化されます。

データの入力者が、価格カラムを編集する必要がない場合は、1がおすすめです。

2はカラム値の初期化に条件を持たせることが可能です。
例えば、[_thisrow_before].[商品名]<>[_thisrow_after].[商品名]と入力すれば、
商品名を更新すると価格カラムが更新されますが、サイズを更新しても価格カラムは更新されません。

返信する
GENKI

APPSHEET初心者です。よろしくお願い致します。

似た質問になってしますのですが、
Suggested valuesにsort(select(メニュー[サイズ],[商品名]=[_thisrow].[商品名]))
を置いた場合、商品名の五十音順になりますが、
例えば、メニューシートに商品コードというカラムがあった場合、
商品コード順に並び替えるにはどうしたら良いでしょうか?

よろしくお願い致します。

返信する
B.B

初コメントさせて頂きます。
上記のはなさんのように私もリストの順番がバラバラになってしまいます。
sort()でくくってみましたが少し変わるだけでスプレッドシート通りの順序になりません。
何か方法はありませんか?

返信する
k

並べたいリストは日本語でしょうか?
B.Bさんのカラム構造が分からないため、最適設定については分かりませんが解決策を2つ書いておきます(^^)

1つ目の案は、sort()関数で並べるリストの前に1,2,3やa,b,cといった数字やアルファベットを入れる です。リストの値を更新していいのであれば、この設定が簡単です。

2つ目の案は、リストのマスターを作ってソートをかけるです。
以下の手順を参考にしてください。(例は会社名をソートするイメージ)

1.スプレッドシートに会社名を並べた新規シートを用意する(シート名はリスト、カラム(Key値)は会社名とします)
2.順番を並べたいカラムに、orderby(リスト[会社名],[会社名],false)と入力
この関数で、リストシートにある会社名を昇順でリスト化することができます。

orderby()関数は、第一引数にkey値のリスト、第二引数に並び替えをするときの参照カラム、第三引数にtrue(降順)、false(昇順)という使い方をします。

この設定でも解決できなかった場合は、再度コメントをしていただくか、画面上もしくは下にあるお問い合わせからご連絡ください。

返信する
B.B

返信が遅くなり申し訳ありません。
1つ目のやりかたで出来ました。
ありがとうございました。
また困ったことがあれば相談させてください。

返信する
k

GENKIさん、コメントありがとうございます。
念のため確認をしますが、やりたいことは依存型ドロップダウンリストの話(例えば、メニューシートにある商品コードと同じもの)でよろしいでしょうか?

上記の括弧の話であれば、sort(select(メニュー[サイズ],[商品コード]=[_thisrow].[商品コード]))でいけると思います。

単純にSuggested valuesにリストを送り、選択肢を与えたいだけなら
1.メニュー[商品コード]
2.sort(メニュー[商品コード])
3.orderby(メニュー[商品コード],[商品コード],false)
このあたりが候補になるかと思います(^^)

返信する
GENKI

Kさん。お忙しい中、回答ありがとうございます。
返信する場所が間違っていました。
はなさんの質問に返信したつもりでした。

Suggested valuesにsort(select(メニュー[サイズ],[商品名]=[_thisrow].[商品名]))
この場合だとサイズのプルダウンはサイズの五十音順になるかと思いますが、
サイズに紐付けられている商品コードの順でサイズのプルダウンを表示したいのです。
応用して住所入力に使えたらと考えています。

市区町村テーブル
団体コード  都道府県  市区町村
011002     北海道  札幌市 
012025     北海道  函館市
市区町村の五十音順ではなく団体コード順で市区町村のプルダウンを表示させたい。

このコードは総務省で配布しているので少し加工が必要ですが
全国の市区町村が記載されているので、なにかと使えるのではないかと思っています。

refでリレーションしておいたほうが、後々集計などで楽だという記事も見かけますが
まずは練習を兼ねて住所録程度ができればと思っています。

まだ数日しかAPPSHEETを使っていないので
そもそもの理解が違うかもしれませんが、ご了承ください。
まずはおすすめの本を買って勉強しようと思っています。
よろしくお願い致します。

返信する
k

GENKIさん、コメントありがとうございます。
appsheetを触り始めて数日でこの理解力、素晴らしいと思います(^^)
おっしゃるようにrefでリレーションをもたせたほうがいいかもしれませんね。

一例として、以下のような設定でいかがでしょうか?
○市区町村テーブル(シート名):Key値は団体コード
団体コード 都道府県名(漢字) 市区町村名(漢字)
12025 北海道 函館市
11002 北海道 札幌市
12050 北海道 室蘭市
12068 北海道 釧路市
12033 北海道 小樽市
12041 北海道 旭川市

○入力(シート名)
ID(Key値)と市区町村名の2カラムを用意

1.市区町村テーブルのKey値を団体コード、Label値を市区町村名(漢字)にする
2.入力シートのデータカラム:市区町村名をref(市区町村テーブルと)
3.そのカラムのSuggested Valueに以下の関数を入力する
orderby(select(市区町村テーブル[団体コード],true),[団体コード],false)

3の関数を入れる前は、函館市→札幌市→室蘭市→・・・となっていますが、
関数を入力すると、札幌市→函館市→小樽市→・・・となると思います(^^)
※団体コードの数字の昇順に入力リストがソートされます

返信する
GENKI

Kさん
おはようございます。

完璧です!!!
やりたいことができました。
大変助かりました。

これ絶対便利だと思うんですよね。
またなにか分からなくなったら相談させてください。

本当にありがとうございました。

返信する
k

GENKIさん、問題解決できたようで何よりです(^^)
appsheetではリストという概念が結構重要なので、リストをソートするというニーズはありそうですね。
近いうちに今回のコメントの内容を記事にまとめて、TIPSとして保存しておきます!!

返信する
GENKI

Kさん
お疲れ様です。

教えて頂いた関数式で
都道府県名(カラム)で都道府県を選択
市区町村名(カラム)で都道府県で絞られた市区町村が
団体コード順に並び替えられて表示→選択できる。
と思っていたのですが、できていませんでしたwww
すべての市区町村が団体コード順に並び替えられるだけでした。

なので頂いた関数式を参考に
ORDERBY(
select(市区町村テーブル[団体コード],[都道府県名]=[_thisrow].[都道府県名]),
[団体コード],false)
これで解決しました。

よくよく考えたら
orderby(select(市区町村テーブル[団体コード],true),[団体コード],false)
これだと
都道府県名を引数で引っ張ってないので絞り込みなんてされる訳がないですね。

これで住所入力が捗りそうです。
ご報告まで。

返信する

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA