Google Apps Scriptでドロップダウンリスト(プルダウンメニュー)を作成する方法について解説いたします。 因みにドロップダウンリストとプルダウンメニューという名称に何か違いがあるのかと調べてみましたが、特には無さそうでした (個人的にはプルダウンの方をよく使います)。
ドロップダウンの作成手順
ドロップダウンリストは入力規則の一部です。それで入力規則のうち、関連する命令をまず見ておきます。
- range(s).clearDataValidations()
- 入力規則を消去します(入力規則は上書きされないため必要)。
- rule = SpreadsheetApp.newDataValidation()
- 入力規則のビルダを作成します。
- rule.requireValueInList( [配列] , true )
- メニューで表示するリストを配列の形で指定します。
- 第二引数はドロップダウンにするか否かを指定します。省略するとtrueになります。
- range.setDataValidation(rule)
- 該当セルにドロップダウンを作成します。
ということで、流れとしては以下のような感じです。
- 該当範囲のドロップダウンを削除
- 入力規則ビルダの作成
- メニュー項目を指定
- ドロップダウンの作成
ドロップダウンリストのサンプル
A1~C1セルに月・日・曜日を選択するドロップダウンメニューを作ってみます。
function dropdownmake(){
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
//とりあえず該当箇所の入力規則を解除
sheet.getRange(1,1,1,3).clearDataValidations();
//入力規則ビルダの作成
var rule = SpreadsheetApp.newDataValidation();
//月の配列作成
var month = new Array();
month.push("-"); //pushは配列に項目を追加する命令
//日にちの配列作成
var day = new Array();
day.push("-");
for ( var i = 1 ; i <= 31 ; i++ ){
if( i <= 12 ){ month.push(i + "月"); }
day.push(i + "日");
}
//曜日の配列作成
var yobi = ["-","日","月","火","水","木","金","土"];
//A1セルに月のリストを表示
rule.requireValueInList(month);
sheet.getRange("A1").setDataValidation(rule);
//B1セルに日にちのリストを表示
rule.requireValueInList(day);
sheet.getRange("B1").setDataValidation(rule);
//C1セルに曜日のリストを表示
rule.requireValueInList(yobi);
sheet.getRange("C1").setDataValidation(rule);
}
<実行結果>
A1からC1のセルに無事ドロップダウンリストが作成できました。
ドロップダウンを連動させてみる
月の部分(A1セル)を選択すると、日にちの部分(B1セル)に該当月の日数に合ったリストを表示するようにしてみます。
function onEdit(e){
var cell = e.range; //編集されたセルの取得
var val = cell.getValue(); //値の取得
var row = cell.getRow(); //行の取得
var col = cell.getColumn(); //列の取得
//各月の日数を配列daysに収める(1つ目の項目はダミー)
var days = [0,31,29,31,30,31,30,31,31,30,31,30,31];
//A1セル(行・列共に1)で、値が「-」以外の時
if( row == 1 && col == 1 && val != "-"){
var mon = parseInt(val); //値から数値を抜き取る
//日にちのリスト作成
var day = new Array();
day.push("-");
//繰り返し回数は、配列daysの該当月の値を利用
for ( var i = 1 ; i <= days[mon] ; i++ )
{
day.push( i + "日" );
}
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var b1 = sheet.getRange("B1"); //B1セルを変数b1に格納
b1.clearDataValidations(); //一度入力規則を解除
var rule = SpreadsheetApp.newDataValidation();
rule.requireValueInList(day); //新たな配列を指定して
b1.setDataValidation(rule); //ドロップダウンを再作成する
}
}
<実行結果>
2月を選択すると、B1のリストが29日までになっているのが確認できます。