我能够在Google表格中创建动态下拉列表,例如:如果用户在A列中选择了某项(汽车品牌:Toyota); B栏自动填充该品牌的模型(模型:Prius,Highlander等)。
我遇到了两个问题:
我需要这些下拉列表来处理连续的行。我已经复制并粘贴并调整了公式,但是当我将其粘贴到连续的行时,动态质量不再起作用。
如果列A中的值为Toyota,并且列B中填充了Prius。例如,当我将A列更改为Mercedes时,B列保留“ Prius”,并出现错误“无效输入-输入必须在指定范围内),但是,如果我单击B列,我会得到相应的下拉菜单我需要在单击A列时清除该字段,然后使用动态下拉列表重新填充。
这是我使用的公式:
=TRANSPOSE(INDIRECT("D" & MATCH('Content Tracker - GENERAL RESOURCES'!D2, C1:C, 0) & ":K" & MATCH('Content Tracker - GENERAL RESOURCES'!D2, C1:C, 0)))
答案 0 :(得分:0)
执行此操作的最佳方法,可能是唯一的方法,需要在脚本编辑器中进行一些编码。
我进行了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);
}