Googleスプレッドシートのドロップダウンで複数値選択
2024年7月26日、Googleスプレッドシートのドロップダウンに於いて、複数の値を選択できるという機能が実装されました。色々と賛否両論あるところはあると思いますが、これはこれで使い所があったりします。
ようやく自分のテナントにも反映されたので、実際に使ってみようと思います。公式ドキュメントはこちら。
目次
使い方
プルダウンを作成する
設定方法はめちゃくちゃ簡単です。サンプルのスプレッドシートはこちらです。
- ドロップダウンにしたい範囲を指定する
- 右クリック⇒セルでの他の操作項目を表示⇒データの入力規則を開く
- ルールを追加をクリック
- 今回は選択項目を都道府県として別シート(prefectureシート)に用意してあるので、条件をプルダウン(範囲内)を選択
- prefectureシートのリストの範囲を指定する。
- 最後に一番下の方に「複数選択できるようにする」というチェックがあるので、このチェックをオンにする
- 完了をクリック
プルダウンの使い方
実際に使うときにはプルダウンからまず1個目を選択。つづけてリストが表示されてるので2つ目を選択・・・といった具合にいくらでも選べますし、再度選んだものをクリックすれば選択から外れます。
選んだものはリストの右側に「✔」のマークが付いてるのでわかりやすいです。
※カンマ区切りで入力済みのを複数プルダウンにセットしてあげると、きちんと複数プルダウンになりますが、,,,といったように空の値の場合はプルダウンになりつつエラーになります。空値でなければ変換も容易いです。
図:ここのチェックを入れる
図:複数選択が可能になりました
図:空値のカンマ区切り値はプルダウンセット時にエラー
使い所
これまでのあらすじ
総務省のExcel規範と言われてる「統計表における機械判読可能なデータ作成に関する表記方法について」では、1セル1データを原則とするという旨が記載されています。これまでGASなりVBAなり、プログラムから扱う場合に1つのセルに複数の値が入ってる状態というのはタブーでした。
現在もそれは同じと言えなくもない、それが故にウェブ上では議論が紛糾しそうですが、少し間違いであり古い考え方です。
データとしては確かに1セルに複数の値が入ってるとプログラムから取りにくいシーンはあります。しかしそれがきちんと整形されたデータで規則性があるものならばこれは使い所があるわけです。本来ならばサブテーブルとして切り出してIDを基準に該当するものを全部拾ってくるみたいなコードを書く必要がありますし、入力の際もそのようなインターフェースを作らなければなりません。
GASで操作してみる
データを取得する
しかし、この機能が実装されたことで
- 規則性がある程度保障されてる
- GASで取得するとこのセルの値は配列の中にカンマ区切りの単独の値として返ってくる
- プログラム上複数のテーブルに分ける必要性が減る
例えばウェブでよく見かける「タグ」であったり、AppSheetでも複数のオプションのオンオフの型だと、検索時に引っかからないので、オプション名を1つのセルの中に入れておければAppSheet上で検索する時に引っかかってくれるので大変助かります。
1つの内容に対して複数のオプション項目を付与するというのはウェブの世界じゃ昔からあるものなので、使い所は結構あります。おかげでサブテーブルを切ったり、入力用のインターフェースを別に設けてコードを書く手間がなくなります。ユーザも選ぶだけなので使いやすい。ゆえに実にGoogleらしい機能と言えます。
※ただし、よくみるとわかりますが配列といっても1つの配列内にあるデータは「カンマ区切りの単独の値」が1個入ってる状態なので、利用する場合は値を取り出したら、splitで配列に変換してあげる必要があります。
1 2 3 4 5 6 7 |
function myFunction() { let ss = SpreadsheetApp.getActiveSpreadsheet(); let sheet = ss.getSheetByName("シート1").getRange("C2:C").getValues(); //1次元配列内にカンマ区切りで入ってるのではなく、カンマ区切りの文字が単独で入ってる console.log(sheet) } |
図:カンマ区切りの値が入ってる
データを書き込みする
逆にデータを書き込みする場合も通常の配列のまま書き込むとエラーになります。かならず「カンマ区切りにした単独の値」として加工したものを一括で書き込みをするようにします。ここが沼りポイントになっています。
カンマ区切りした単独の値はシングルクォートで括る必要性があります。ダブルクォートだとカンマ区切りした単独の値という値が入ってしまうため、エラーとなります。「'東京都, 京都府, 愛知県'」といったような形で整形してあげましょう。「'東京都','京都府','愛知県'」ではないので注意。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
function kakikomi(){ let ss = SpreadsheetApp.getActiveSpreadsheet(); let sheet = ss.getSheetByName("シート1") //書き込み配列 //1次元配列内にカンマ区切りで入ってるのではなく、カンマ区切りの文字が単独で入ってる let array = [ [ '東京都,秋田県' ], [ '青森県,沖縄県,滋賀県' ], [ '北海道' ], [ '秋田県,京都府,大阪府'], [ '鹿児島県'], [ '宮城県'] ] //一括書き込み let lastColumn = array[0].length; //カラムの数を取得する let lastRow = array.length; //行の数を取得する //C列に一括で書き込み sheet.getRange(2,3,lastRow,lastColumn).setValues(array) } |