做到这一点的最好方法,也可能是唯一的方法,需要在脚本编辑器中进行一些编码。
我进行了 3 级验证,解决了这个问题:
我在这段代码之前定义了变量。
function onEdit(event) {
var activeCell = event.range;
var val = activeCell.getValue();
var row = activeCell.getRow();
var col = activeCell.getColumn();
var wsName = activeCell.getSheet().getName()
if (wsName === mainWsName && col === headerProv && row > 1) {
validationProv(val, row);
} else if(wsName === mainWsName && col === headerCanton && row > 1) {
validationCanton(val, row);
}
} //end onEdit
function validationProv(val, row) {
if(val === "") {
ws.getRange(row, headerCanton).clearContent();
ws.getRange(row, headerCanton).clearDataValidations();
ws.getRange(row, headerDistrito).clearContent();
ws.getRange(row, headerDistrito).clearDataValidations();
} else {
ws.getRange(row, headerCanton).clearContent();
ws.getRange(row, headerCanton).clearDataValidations();
ws.getRange(row, headerDistrito).clearContent();
ws.getRange(row, headerDistrito).clearDataValidations();
var filtroProv = options.filter(function(o){ return o[2] === val });
var filtroCant = filtroProv.map(function(o){ return o[3] });
var cell = ws.getRange(row, headerCanton);
applyValidationToCell(filtroCant,cell);
}
} //end validationProv
function validationCanton(val, row) {
if(val === "") {
ws.getRange(row, headerDistrito).clearContent();
ws.getRange(row, headerDistrito).clearDataValidations();
} else {
ws.getRange(row, headerDistrito).clearContent();
var headerProvVal = ws.getRange(row,headerProv).getValue();
var filtroProv = options.filter(function(o){ return o[2] === headerProvVal && o[3] === val });
var filtroCant = filtroProv.map(function(o){ return o[4] });
var cell = ws.getRange(row, headerDistrito);
applyValidationToCell(filtroCant,cell);
}
} //end validationCanton
function applyValidationToCell(list,cell) {
var rule = SpreadsheetApp.newDataValidation().requireValueInList(list).setAllowInvalid(false).build();
cell.setDataValidation(rule);
}