リートン回答
あなたが指定したリストに基づいて、Google Apps Script(GAS)で連動するプルダウンリストを作成するためのコードを作成します。
まず、「分類表」という名前のシートを作成し、以下のようにデータを入力します。
A1: 関東, B1: 東京, C1: 茨城, D1: 群馬, E1: 埼玉, F1: 千葉, G1: 神奈川
A2: 東北, B2: 青森, C2: 岩手, D2: 宮城, E2: 秋田, F2: 山形, G2: 福島
そして、「選択」という名前のシートを作成し、A列に大分類(プルダウン1)、B列に小分類(プルダウン2)のリストを作成します。
次に、Google Apps Scriptのスクリプトエディタを開き、以下のコードを貼り付けます。
function onEdit(e) {
const cell = e.range;
const value = cell.getValue();
const sheet = e.source.getActiveSheet();
if (sheet.getName() !== '選択') return;
const row = cell.getRow();
const col = cell.getColumn();
if (col === 1 && row >= 2) createList_(value, row);
}
function createList_(major_value, row) {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet_list = ss.getSheetByName('分類表');
const sheet_target = ss.getSheetByName('選択');
const target_cell = sheet_target.getRange(row, 2, 1, 1);
target_cell.clearContent();
let major_class = sheet_list.getRange(1, 1, sheet_list.getMaxRows(), 1).getValues();
major_class = major_class.flat();
const major_row = major_class.indexOf(major_value) + 1;
if (major_row === 0) return;
let small_class = sheet_list.getRange(major_row, 2, 1, sheet_list.getMaxColumns()-1).getValues();
small_class = small_class[0].filter(element => element !== '');
const rule = SpreadsheetApp.newDataValidation().requireValueInList(small_class).build();
target_cell.setDataValidation(rule);
}
これで、「選択」シートのA列(大分類)が編集されると、B列(小分類)に対応するプルダウンリストが自動的に作成されます。大分類に「関東」が選択された場合、小分類は「東京」「茨城」「群馬」「埼玉」「千葉」「神奈川」から選択できます。同様に、大分類に「東北」が選択された場合、小分類は「青森」「岩手」「宮城」「秋田」「山形」「福島」から選択できます。
リートン解説
もちろんです、以下に各行の解説を記載いたします。
function onEdit(e) {
この行は onEdit
という関数を定義しています。この関数は、スプレッドシートが編集されたときにGoogle Apps Scriptによって自動的に呼び出されます。e
はイベントオブジェクトで、編集の詳細情報を持っています。
const cell = e.range;
e.range
を使って編集されたセルの範囲を取得し、それを cell
という定数に格納しています。
const value = cell.getValue();
cell.getValue()
を使って編集されたセルの値を取得し、それを value
という定数に格納しています。
const sheet = e.source.getActiveSheet();
e.source.getActiveSheet()
を使って編集が行われたシートを取得し、それを sheet
という定数に格納しています。
if (sheet.getName() !== '選択') return;
シートの名前が '選択' でない場合、関数を終了します。これにより、'選択' シート以外の編集は無視されます。
const row = cell.getRow();
const col = cell.getColumn();
cell.getRow()
と cell.getColumn()
を使って編集されたセルの行番号と列番号を取得し、それぞれ row
と col
という定数に格納しています。
if (col === 1 && row >= 2) createList_(value, row);
もし編集されたセルが1列目(A列)で、かつ2行目以降の場合、createList_
関数を呼び出します。この関数には、編集されたセルの値と行番号が引数として渡されます。
}
onEdit
関数の終了を示します。
function createList_(major_value, row) {
createList_
という関数を定義しています。この関数は、大分類の値と行番号を引数として受け取ります。
この関数は、大分類に基づいて小分類のプルダウンリストを作成します。具体的には、'選択' シートのB列にプルダウンリストを作成します。
以下の行では、スプレッドシートとシートを取得し、小分類のプルダウンリストを作成するセルをクリアしています。また、大分類のリストから選択された大分類の位置を検索し、それに対応する小分類のリストを作成しています。
最後に、小分類のリストを使って新しい入力規則を作成し、それをプルダウンリストを作成するセルに設定しています。
}
createList_
関数の終了を示します。
もちろんです、以下に各行の解説を記載します。
let major_class = sheet_list.getRange(1, 1, sheet_list.getMaxRows(), 1).getValues();
ここでは、sheet_list
('分類表'シート)の1列目(大分類の列)の全ての行のデータを取得しています。これは二次元配列として返されるので、各行が小さな配列として格納されます。
major_class = major_class.flat();
Array.flat()
メソッドを使用して二次元配列を一次元配列に変換しています。これにより、大分類の全ての値が単一の配列に格納されます。
const major_row = major_class.indexOf(major_value) + 1;
ここでは、Array.indexOf()
メソッドを使用して、選択された大分類の値が配列の何番目に存在するかを検索しています。そのインデックスに1を加えて、シートの行番号(1から始まる)を取得しています。
if (major_row === 0) return;
もし選択された大分類の値が配列に存在しない場合、indexOf()
は-1を返すため、major_row
は0になります。その場合、関数を終了します。
let small_class = sheet_list.getRange(major_row, 2, 1, sheet_list.getMaxColumns()-1).getValues();
選択された大分類の行から小分類のデータを取得します。2列目からシートの最大列数までのデータを取得します。
small_class = small_class[0].filter(element => element !== '');
Array.filter()
メソッドを使用して、空のデータを小分類の配列から除去します。
const rule = SpreadsheetApp.newDataValidation().requireValueInList(small_class).build();
SpreadsheetApp.newDataValidation().requireValueInList(small_class).build()
を使用して、小分類の配列を元に新しいデータ検証ルールを作成します。これにより、セルで許可される値を小分類のリストに制限します。
target_cell.setDataValidation(rule);
最後に、Range.setDataValidation(rule)
メソッドを使用して、作成したデータ検証ルールを目標のセルに適用します。これにより、セルの値が小分類のリストの中から選ばれるようになります。