GAS プルダウン参考サイトまとめ




https://note.com/mir4545/n/n83350dd3f91a



リートン回答

あなたが指定したリストに基づいて、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のスクリプトエディタを開き、以下のコードを貼り付けます。

```javascript
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列（小分類）に対応するプルダウンリストが自動的に作成されます。大分類に「関東」が選択された場合、小分類は「東京」「茨城」「群馬」「埼玉」「千葉」「神奈川」から選択できます。同様に、大分類に「東北」が選択された場合、小分類は「青森」「岩手」「宮城」「秋田」「山形」「福島」から選択できます。


リートン解説
もちろんです、以下に各行の解説を記載いたします。

```javascript
function onEdit(e) {
```
この行は `onEdit` という関数を定義しています。この関数は、スプレッドシートが編集されたときにGoogle Apps Scriptによって自動的に呼び出されます。`e` はイベントオブジェクトで、編集の詳細情報を持っています。

```javascript
  const cell = e.range;
```
`e.range` を使って編集されたセルの範囲を取得し、それを `cell` という定数に格納しています。

```javascript
  const value = cell.getValue();
```
`cell.getValue()` を使って編集されたセルの値を取得し、それを `value` という定数に格納しています。

```javascript
  const sheet = e.source.getActiveSheet();
```
`e.source.getActiveSheet()` を使って編集が行われたシートを取得し、それを `sheet` という定数に格納しています。

```javascript
  if (sheet.getName() !== '選択') return;
```
シートの名前が '選択' でない場合、関数を終了します。これにより、'選択' シート以外の編集は無視されます。

```javascript
  const row = cell.getRow();
  const col = cell.getColumn();
```
`cell.getRow()` と `cell.getColumn()` を使って編集されたセルの行番号と列番号を取得し、それぞれ `row` と `col` という定数に格納しています。

```javascript
  if (col === 1 && row >= 2) createList_(value, row);
```
もし編集されたセルが1列目（A列）で、かつ2行目以降の場合、`createList_` 関数を呼び出します。この関数には、編集されたセルの値と行番号が引数として渡されます。

```javascript
}
```
`onEdit` 関数の終了を示します。

```javascript
function createList_(major_value, row) {
```
`createList_` という関数を定義しています。この関数は、大分類の値と行番号を引数として受け取ります。

この関数は、大分類に基づいて小分類のプルダウンリストを作成します。具体的には、'選択' シートのB列にプルダウンリストを作成します。

以下の行では、スプレッドシートとシートを取得し、小分類のプルダウンリストを作成するセルをクリアしています。また、大分類のリストから選択された大分類の位置を検索し、それに対応する小分類のリストを作成しています。

最後に、小分類のリストを使って新しい入力規則を作成し、それをプルダウンリストを作成するセルに設定しています。

```javascript
}
```
`createList_` 関数の終了を示します。


もちろんです、以下に各行の解説を記載します。

```javascript
let major_class = sheet_list.getRange(1, 1, sheet_list.getMaxRows(), 1).getValues();
```
ここでは、`sheet_list`（'分類表'シート）の1列目（大分類の列）の全ての行のデータを取得しています。これは二次元配列として返されるので、各行が小さな配列として格納されます。

```javascript
major_class = major_class.flat();
```
`Array.flat()`メソッドを使用して二次元配列を一次元配列に変換しています。これにより、大分類の全ての値が単一の配列に格納されます。

```javascript
const major_row = major_class.indexOf(major_value) + 1;
```
ここでは、`Array.indexOf()`メソッドを使用して、選択された大分類の値が配列の何番目に存在するかを検索しています。そのインデックスに1を加えて、シートの行番号（1から始まる）を取得しています。

```javascript
if (major_row === 0) return;
```
もし選択された大分類の値が配列に存在しない場合、`indexOf()`は-1を返すため、`major_row`は0になります。その場合、関数を終了します。

```javascript
let small_class = sheet_list.getRange(major_row, 2, 1, sheet_list.getMaxColumns()-1).getValues();
```
選択された大分類の行から小分類のデータを取得します。2列目からシートの最大列数までのデータを取得します。

```javascript
small_class = small_class[0].filter(element => element !== '');
```
`Array.filter()`メソッドを使用して、空のデータを小分類の配列から除去します。

```javascript
const rule = SpreadsheetApp.newDataValidation().requireValueInList(small_class).build();
```
`SpreadsheetApp.newDataValidation().requireValueInList(small_class).build()`を使用して、小分類の配列を元に新しいデータ検証ルールを作成します。これにより、セルで許可される値を小分類のリストに制限します。

```javascript
target_cell.setDataValidation(rule);
```
最後に、`Range.setDataValidation(rule)`メソッドを使用して、作成したデータ検証ルールを目標のセルに適用します。これにより、セルの値が小分類のリストの中から選ばれるようになります。