谷歌表格动态下拉列表依赖列表



我能够在谷歌表格中创建一个动态下拉列表,例如:如果用户在 A 列中选择某些内容(汽车品牌:丰田(;列 B 自动填充该品牌的车型(车型:普锐斯、汉兰达等(。

我遇到了两个问题:

  1. 我需要这些下拉菜单来向下处理连续的行。 我已经复制、粘贴并调整了公式,但是当我将其粘贴到连续行时,动态质量不再有效。

  2. 如果 A 列中的值为丰田,B 列填充普锐斯。例如,当我将 A 列更改为梅赛德斯时,B 列保留"普锐斯"并出现错误"输入无效 - 输入必须在指定范围内(,但是如果我单击 B 列,我会得到梅赛德斯车型的相应下拉菜单。 我需要在单击 A 列时清除该字段并使用动态下拉列表重新填充。

这是我使用的公式:=TRANSPOSE(INDIRECT("D" & MATCH('Content Tracker - GENERAL RESOURCES'!D2, C1:C, 0) & ":K" & MATCH('Content Tracker - GENERAL RESOURCES'!D2, C1:C, 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);
}

最新更新