
スプレッドシートで「番号を入力したら、該当するデータの選択肢が出てくる」という仕組み、欲しくないですか?
この記事では、番号入力をトリガーにプルダウンを動的生成する方法を解説します。
こんな悩みを解決します
- 顧客番号を入れたら、該当する顧客だけを選択肢に出したい
- 同じ番号で複数のデータがある場合に対応したい
- VLOOKUP+入力規則だと、動的に選択肢を変えられない…
完成イメージ
動作の流れ
- A2に顧客番号「1234」を入力
- B2に該当顧客のプルダウンが自動で出現
- 同じ番号で複数データがあれば、すべて選択肢に表示
シート構成
以下のシートを作ります。
メインの入力するシートに対し、別のマスターデータとなるdataシートタブを作成します。
入力シート
セル | 内容 |
|---|---|
A2 | 顧客番号(手入力) |
B2 | 選択用プルダウン(自動生成) |
dataシート(マスタ)
A列 | B列 | C列 |
|---|---|---|
顧客名 | 顧客番号 | 車種 |
山田太郎 | 1234 | プリウス |
山田太郎 | 1234 | アクア |
佐藤花子 | 5678 | フィット |

ポイント: 同じ顧客番号で複数行あっても大丈夫です
完成コード
function onEdit(e) {
const range = e.range;
const sheet = range.getSheet();
const value = String(range.getValue());
// dataシートを取得
const ss = SpreadsheetApp.getActiveSpreadsheet();
const dataSheet = ss.getSheetByName('data');
if (!dataSheet) return;
// A2セルが編集された場合のみ処理
if (range.getColumn() !== 1 || range.getRow() !== 2) return;
// B2を初期化
sheet.getRange(2, 2).clearDataValidations().clearContent();
// 空欄なら終了
if (value === "") return;
// dataシートから該当データを検索
const lastRow = dataSheet.getLastRow();
if (lastRow < 2) return;
const data = dataSheet.getRange(2, 1, lastRow - 1, 3).getValues();
const filtered = data.filter(row => String(row[1]) === value);
// 該当なしなら終了
if (filtered.length === 0) return;
// プルダウンの選択肢を作成
const options = filtered.map(row => `${row[0]}(${row[1]}) - ${row[2]}`);
const rule = SpreadsheetApp.newDataValidation()
.requireValueInList(options, true)
.setAllowInvalid(false)
.build();
sheet.getRange(2, 2).setDataValidation(rule);
}
コード解説
1. onEditイベントで編集を検知
function onEdit(e) {
const range = e.range; // 編集されたセル
const sheet = range.getSheet(); // シート
const value = String(range.getValue()); // 入力値
onEditはセルが編集されるたびに自動実行される関数です。
2. A2セルの編集だけを処理
if (range.getColumn() !== 1 || range.getRow() !== 2) return;
getColumn()で列番号、getRow()で行番号を取得。A2セル(1列目、2行目)以外は処理しません。
3. マスタから該当データを検索
const data = dataSheet.getRange(2, 1, lastRow - 1, 3).getValues();
const filtered = data.filter(row => String(row[1]) === value);
処理 | 説明 |
|---|---|
| 2行目からA〜C列を取得 |
| 2次元配列で取得 |
| B列(row[1])が入力値と一致する行だけ抽出 |
| 数値と文字列の不一致を防ぐ |
4. 選択肢を作成
const options = filtered.map(row => `${row[0]}(${row[1]}) - ${row[2]}`);
// 結果: ["山田太郎(1234) - プリウス", "山田太郎(1234) - アクア"]
map()で各行を「顧客名(番号) - 車種」形式の文字列に変換します。
この形式にしておくと、後で選択値から情報を取り出しやすくなります(後編で解説)。
5. プルダウンを動的に設定
const rule = SpreadsheetApp.newDataValidation()
.requireValueInList(options, true) // 選択肢を設定
.setAllowInvalid(false) // リスト外の値を禁止
.build();
sheet.getRange(2, 2).setDataValidation(rule);

これがVLOOKUPでは実現できないポイントです。入力のたびに選択肢が変わります。
動作確認
- スプレッドシートに「data」シートを作成し、マスタデータを入力
- スクリプトエディタにコードを貼り付けて保存
- 入力シートのA2に番号を入力
- B2にプルダウンが表示されれば成功!
うまくいかない場合
症状 | 対処法 |
|---|---|
プルダウンが出ない | dataシートの名前が「data」になっているか確認 |
該当データがあるのに出ない | 番号が文字列/数値で不一致の可能性。 |
権限エラーが出る | 初回実行時は「権限を確認」→「許可」が必要 |
まとめ
今回のポイントは3つです。
- onEditでセル編集をリアルタイム検知
- filterでマスタから該当データを抽出
- newDataValidationでプルダウンを動的生成
これで「番号を入れたら選択肢が出る」仕組みができました。
次回の後編では、プルダウンで選択した値を他のセルに自動転記する方法を解説します。
後編はこちら → [プルダウン選択で複数セルに自動転記する方法]
この記事が役に立ったらフォローしてください

