GASでスプレッドシートに
プルダウン(入力規則)を一括設定する方法

セルを1つずつ手作業で設定するのは大変です。newDataValidation()を使えば、数百行のプルダウン(入力規則)をコードで一括設定でき、連動プルダウンも作れます。

|対象: GAS / スプレッドシート / 入力規則

Table of Contents

なぜコードでプルダウンを設定するのか

プルダウン(入力規則)は、セルに入力できる値をリストから選ばせる機能です。 手作業でも「データ > データの入力規則」から設定できますが、 シートを作り直すたびに設定し直したり、数百行に手で適用したりするのは非効率です。 GAS(Google Apps Script、Googleサービスを自動化するプログラミング環境)で書いておけば、 次のような場面で威力を発揮します。

テンプレートの再現

新しいシートを作るたびに、決まった列へ同じプルダウンをワンクリックで再設定できる

大量行への一括適用

1000行分のプルダウンも、範囲を指定して一度に設定できる

選択肢の一元管理

マスタシートの範囲を参照させ、選択肢の追加・削除を1か所で完結できる

連動プルダウン

手作業では難しい「選んだ値で次の選択肢が変わる」動きをコードで実現できる

基本:配列でプルダウンを一括設定する

基本形は3ステップです。newDataValidation()でルールを作り、requireValueInList()に選択肢の配列を渡し、対象範囲のsetDataValidation()に渡すだけです。

function setStatusDropdown() {
  const sheet = SpreadsheetApp.getActive().getSheetByName("入力");

  // 選択肢を配列で用意する
  const options = ["未対応", "対応中", "完了", "保留"];

  const rule = SpreadsheetApp.newDataValidation()
    .requireValueInList(options, true) // 第2引数true = プルダウン表示
    .setAllowInvalid(false)            // リスト外の値は拒否
    .setHelpText("リストから選択してください")
    .build();

  // C2からC1000まで一括でプルダウンを設定
  sheet.getRange("C2:C1000").setDataValidation(rule);
}

requireValueInList()の第2引数をtrueにするとセルにプルダウンの矢印が表示されます。setAllowInvalid(false)を付けると、リストにない値の入力を拒否できます(省略すると警告だけで入力は通ってしまいます)。

別シートのマスタ範囲を参照する

選択肢が頻繁に増減する場合は、配列を直接書くより「マスタシートの範囲」を参照させると管理が楽です。requireValueInRange()に範囲を渡すと、その範囲の値がそのままプルダウンの選択肢になります。

function setDropdownFromMaster() {
  const ss = SpreadsheetApp.getActive();
  const sheet = ss.getSheetByName("入力");

  // マスタシートのA2:A100を選択肢として参照する
  const listRange = ss.getSheetByName("マスタ").getRange("A2:A100");

  const rule = SpreadsheetApp.newDataValidation()
    .requireValueInRange(listRange, true)
    .setAllowInvalid(false)
    .build();

  sheet.getRange("B2:B1000").setDataValidation(rule);
}

この方式なら、マスタシートに1行追加するだけでプルダウンの選択肢も増えます。 担当者一覧や商品カテゴリなど、運用中に変わりやすい選択肢に向いています。

都道府県→市区町村の連動プルダウン

「都道府県を選ぶと、その県の市区町村だけが次のプルダウンに出る」という連動は、onEditトリガー(セルが編集された瞬間に自動で動く仕組み)で実現します。 まず対応表を用意し、1列目に都道府県のプルダウンを設定します。

// 連動プルダウンの対応表(都道府県 → 市区町村)
const AREA_MAP = {
  "東京都": ["千代田区", "新宿区", "渋谷区", "世田谷区"],
  "大阪府": ["大阪市", "堺市", "豊中市", "吹田市"],
  "愛知県": ["名古屋市", "豊田市", "岡崎市", "一宮市"],
};

// 1列目(A列)に都道府県のプルダウンを設定する
function setPrefDropdown() {
  const sheet = SpreadsheetApp.getActive().getSheetByName("入力");
  const rule = SpreadsheetApp.newDataValidation()
    .requireValueInList(Object.keys(AREA_MAP), true)
    .setAllowInvalid(false)
    .build();
  sheet.getRange("A2:A1000").setDataValidation(rule);
}

次に、A列が編集されたら同じ行のB列を作り直すonEdit関数を書きます。連動元が変わったときは、連動先の入力値と古いルールを一度クリアしてから設定し直すのがポイントです。

function onEdit(e) {
  const range = e.range;
  const sheet = range.getSheet();

  // 「入力」シートのA列(2行目以降)が編集されたときだけ動かす
  if (sheet.getName() !== "入力") return;
  if (range.getColumn() !== 1 || range.getRow() < 2) return;

  const pref = e.value; // 選ばれた都道府県
  const cityCell = sheet.getRange(range.getRow(), 2); // 同じ行のB列

  // 連動元が変わったので、連動先の値とルールを一度クリアする
  cityCell.clearContent();
  cityCell.clearDataValidations();

  const cities = pref ? AREA_MAP[pref] : null;
  if (!cities) return; // 未選択・対象外なら空のまま

  const rule = SpreadsheetApp.newDataValidation()
    .requireValueInList(cities, true)
    .setAllowInvalid(false)
    .build();
  cityCell.setDataValidation(rule);
}

このonEditは簡易トリガーとして関数名だけで自動実行されます。都道府県を変えると、B列に残っていた市区町村は自動でクリアされ、 新しい選択肢に差し替わります。

設定済みの入力規則を一括クリアする

ルールを作り直したいときは、先に古い入力規則を消しておくと安全です。clearDataValidations()で範囲内の入力規則をまとめて解除できます(セルの値は消えません)。

function clearDropdowns() {
  const sheet = SpreadsheetApp.getActive().getSheetByName("入力");

  // 指定範囲の入力規則をまとめて解除する
  sheet.getRange("A2:C1000").clearDataValidations();
}

新規行にも自動でプルダウンを効かせる

フォーム回答やインポートで行がどんどん増えるシートでは、 毎回手で設定し直すのは現実的ではありません。おすすめは2つです。

方法1: あらかじめ広い範囲に設定しておく

最初からC2:C1000のように余裕を持った範囲へ設定しておけば、その範囲内に追加された行は自動でプルダウンが効きます。 行数の上限が読めるシートに向いています。

方法2: 時間主導トリガーで定期的に再適用する

ScriptApp.newTrigger()setStatusDropdownのような設定関数を毎日実行しておけば、増えた行にもプルダウンが行き渡ります。 行数が読めないシートは、この定期実行のほうが確実です。

実務での注意点

1. setAllowInvalidは既存データも見直す

setAllowInvalid(false)は「これから入力する値」に効きます。すでに入っているリスト外の値はセルに赤い三角マークが付くだけで消えないため、既存データの整備は別途必要です。

2. onEditは簡易トリガーの制約を理解する

簡易トリガーのonEditは、他ファイルへのアクセスなど一部の操作ができません。連動プルダウン程度の同一シート操作なら問題ありませんが、複雑な処理はインストール型トリガーへの切り替えを検討します。

3. 範囲の広げすぎは表示を重くする

プルダウンをC2:C100000のように過剰な行数へ設定すると、シートの表示や操作が重くなることがあります。実際に使う想定行数に少し余裕を足した範囲にとどめましょう。

まとめ

GASでのプルダウン設定は、newDataValidation()requireValueInList()の基本形さえ押さえれば、一括適用・マスタ参照・連動プルダウンまで一気に自動化できます。 入力ミスを減らし、データを整った状態に保つ土台として、業務シートの入り口にぜひ組み込んでみてください。

よくある質問

SpreadsheetApp.newDataValidation()でルールを作り、requireValueInList()に選択肢の配列を渡してbuild()し、対象範囲のsetDataValidation()に渡します。手作業でセルごとに設定するより、数百行まとめて一括で設定できるのが利点です。

requireValueInList()の代わりにrequireValueInRange()を使い、マスタシートの範囲(例: マスタ!A2:A100)を渡します。マスタ側の選択肢を書き換えるだけでプルダウンの中身も更新され、選択肢のメンテナンスが楽になります。

できます。setAllowInvalid(false)を付けると、リストにない値を入力したときに拒否されます。省略すると警告は出ますが入力自体は許可されるため、厳密に制限したい場合はfalseを明示します。

onEditトリガーで実現できます。1列目(都道府県)が編集されたときに、対応する市区町村の配列で2列目のプルダウンを作り直します。連動元が変わったら連動先の入力値とルールを一度クリアしてから設定し直すのがポイントです。

対象範囲のclearDataValidations()を呼ぶと、その範囲の入力規則がすべて解除されます。ルールを作り直す前に一度クリアしておくと、古いルールが残って二重に効いてしまうのを防げます。

GAS開発・業務Webシステムを
相談する。

プルダウン設定以外にも、入力フォームの整備・帳票出力・Gmail自動化など、日々の業務を自動化するGAS開発をご相談いただけます。

GAS Webシステム開発を見る