コード作成後の動き
コード
GASコード
function onEdit(e) {
// リストと一致しなかったら終了
const value = e.value;
const list = ['あ行', 'か行', 'さ行', 'た行', 'な行', 'は行', 'ま行', 'や行以降'];
if (!list.includes(value)) return;
const range = e.range;
const sht = range.getSheet();
// シート名が違ったら終了
if(sht.getName() !== 'data') return;
const row = range.getRow();
const col = range.getColumn() + 1; //入力箇所からズラす列数
// 入力規則の範囲取得
const shtName = 'プルダウン';
const pulldownSht = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(shtName);
// 項目名取得
const items = pulldownSht.getRange('1:1').getValues().flat().filter(val => val);
// rangeの取得
const pulldownCol = items.indexOf(value) + 1;
const pulldownLastRow = pulldownSht.getMaxRows() - 1;
const pulldownRange = pulldownSht.getRange(2, pulldownCol, pulldownLastRow, 1);
// rule作成
const rule = SpreadsheetApp.newDataValidation();
rule.requireValueInRange(pulldownRange);
sht.getRange(row, col).setDataValidation(rule);
}
こちらのシートではプルダウンのRangeを取得してプルダウンを範囲で指定しているので、
プルダウンシートに追加項目があった際にそれも対象となる汎用的な書き方にしています。
もし固定でよいということであれば、こちらの方がおすすめです。
シートAPIを叩かない分、動きが早くなります。
コード2
function onEdit(e) {
// リストと一致しなかったら終了
const value = e.value;
const list = ['あ行', 'か行', 'さ行', 'た行', 'な行', 'は行', 'ま行', 'や行以降'];
if (!list.includes(value)) return;
const range = e.range;
const sht = range.getSheet();
// シート名が違ったら終了
if(sht.getName() !== 'data') return;
const row = range.getRow();
const col = range.getColumn() + 1; //入力箇所からズラす列数
const obj = {
'あ行': ['あ', 'い', 'う', 'え', 'お', ],
'か行': ['か', 'き', 'く', 'け', 'こ', ],
'さ行': ['さ', 'し', 'す', 'せ', 'そ', ],
'た行': ['た', 'ち', 'つ', 'て', 'と', ],
'な行': ['な', 'に', 'ぬ', 'ね', 'の', ],
'は行': ['は', 'ひ', 'ふ', 'へ', 'ほ', ],
'ま行': ['ま', 'み', 'む', 'め', 'も', ],
'や行以降': ['や', 'ゆ', 'よ', 'わ', 'を', 'ん', ],
}
// rule作成
const rule = SpreadsheetApp.newDataValidation();
rule.requireValueInList(obj[value]);
sht.getRange(row, col).setDataValidation(rule);
}
違いはrurleのrequireValueInRange
か requireValueInList
です。
補足
スプレッドシートの入力規則のみで実装も可能ですが、
行数が多くなると重くなって運用的にNGでした。
GASで違ったらすぐ処理を止めるやり方の方が実用的でした。
範囲特定する場合は列の〇列より前でのみ動かすとかの設定も加えても
よいのかなと思いつつ、プルダウンの内容を誤記入することも少ないかなとも思っています。