我需要获得三个相互依赖的下拉列表。这是带有示例的可编辑sheet。黄色列中的单元格包含一个基于常规数据验证(选项表)的下拉列表。绿色列中的单元格会提供一个基于脚本的相应下拉列表。在蓝色列中,我需要从“选项”工作表中获取一个对应的列表,其名称与中间绿色列中的数据相对应。
我将不胜感激。
var mainWsName = "master";
var optionsWsName = "options";
var firstLevelColumn = 12;
var secondLevelColumn = 13;
var thirdLevelColumn = 14;
var ws = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(mainWsName);
var wsOptions = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(optionsWsName);
function onEdit(e){
var activeCell = e.range;
var val = activeCell.getValue();
var r = activeCell.getRow();
var c = activeCell.getColumn();
var wsName = activeCell.getSheet().getName();
if(wsName === mainWsName && c === firstLevelColumn && r > 4){
applyFirstLevelValidation(val,r);
} else if(wsName === mainWsName && c === secondLevelColumn && r > 4){
applySecondLevelValidation(val,r);
}
} //end onEdit
function applyFirstLevelValidation(val,r){
if(val === ""){
ws.getRange(r, secondLevelColumn).clearContent();
ws.getRange(r, secondLevelColumn).clearDataValidations();
ws.getRange(r, thirdLevelColumn).clearContent();
ws.getRange(r, thirdLevelColumn).clearDataValidations();
} else {
ws.getRange(r, secondLevelColumn).clearContent();
ws.getRange(r, secondLevelColumn).clearDataValidations();
ws.getRange(r, thirdLevelColumn).clearContent();
ws.getRange(r, thirdLevelColumn).clearDataValidations();
var filteredOptions = options.filter(function(o){ return o[0] === val });
var listToApply = filteredOptions.map(function(o){ return o[1] });
var cell = ws.getRange(r, secondLevelColumn);
applyValidationToCell(listToApply,cell);
}
}
function applySecondLevelValidation(val,r){
if(val === ""){
ws.getRange(r, thirdLevelColumn).clearContent();
ws.getRange(r, thirdLevelColumn).clearDataValidations();
} else {
ws.getRange(r, thirdLevelColumn).clearContent();
var firstLevelColValue = ws.getRange(r, firstLevelColumn).getValue();
var filteredOptions =options.filter(function(o){ return o[0] === firstLevelColValue && o[1] === val });
var listToApply = filteredOptions.map(function(o){ return o[2] });
var cell = ws.getRange(r.thirdLevelColumn);
applyValidationToCell(listToApply,cell);
}
}
function applyValidationToCell(list,cell){
var rule = SpreadsheetApp
.newDataValidation()
.requireValueInlist(list)
.setAllowInvalid(false)
.build();
cell.setDataValidation(rule)
}
如果我的理解正确,那么这个答案如何?请认为这只是几个可能的答案之一。
options
和applyFirstLevelValidation
的功能未声明[applySecondLevelValidation
。r.thirdLevelColumn
的[ws.getRange(r.thirdLevelColumn)
]发生错误。因为r
是数字。.requireValueInlist(list)
是.requireValueInList(list)
。这是一个拼写错误。修改脚本后,请进行如下修改。
var filteredOptions = options.filter(function(o){ return o[0] === val });
var filteredOptions = wsOptions.getDataRange().getValues().filter(function(o){ return o[0] === val });
和
var filteredOptions =options.filter(function(o){ return o[0] === firstLevelColValue && o[1] === val });
var filteredOptions = wsOptions.getDataRange().getValues().filter(function(o){ return o[0] === firstLevelColValue && o[1] === val });
和
var listToApply = filteredOptions.map(function(o){ return o[2] });
var cell = ws.getRange(r.thirdLevelColumn);
applyValidationToCell(listToApply,cell);
var listToApply = filteredOptions.map(function(o){ return o[2] });
var cell = ws.getRange(r, thirdLevelColumn); // <--- Modified
applyValidationToCell(listToApply,cell);
和
var rule = SpreadsheetApp
.newDataValidation()
.requireValueInlist(list)
.setAllowInvalid(false)
.build();
var rule = SpreadsheetApp
.newDataValidation()
.requireValueInList(list) // <--- Modified
.setAllowInvalid(false)
.build();
var mainWsName = "master";
var optionsWsName = "options";
var firstLevelColumn = 12;
var secondLevelColumn = 13;
var thirdLevelColumn = 14;
var ws = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(mainWsName);
var wsOptions = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(optionsWsName);
function onEdit(e){
var activeCell = e.range;
var val = activeCell.getValue();
var r = activeCell.getRow();
var c = activeCell.getColumn();
var wsName = activeCell.getSheet().getName();
if(wsName === mainWsName && c === firstLevelColumn && r > 4){
applyFirstLevelValidation(val,r);
} else if(wsName === mainWsName && c === secondLevelColumn && r > 4){
applySecondLevelValidation(val,r);
}
} //end onEdit
function applyFirstLevelValidation(val,r){
if(val === ""){
ws.getRange(r, secondLevelColumn).clearContent();
ws.getRange(r, secondLevelColumn).clearDataValidations();
ws.getRange(r, thirdLevelColumn).clearContent();
ws.getRange(r, thirdLevelColumn).clearDataValidations();
} else {
ws.getRange(r, secondLevelColumn).clearContent();
ws.getRange(r, secondLevelColumn).clearDataValidations();
ws.getRange(r, thirdLevelColumn).clearContent();
ws.getRange(r, thirdLevelColumn).clearDataValidations();
var filteredOptions = wsOptions.getDataRange().getValues().filter(function(o){ return o[0] === val }); // <--- Modified
var listToApply = filteredOptions.map(function(o){ return o[1] });
var cell = ws.getRange(r, secondLevelColumn);
applyValidationToCell(listToApply,cell);
}
}
function applySecondLevelValidation(val,r){
if(val === ""){
ws.getRange(r, thirdLevelColumn).clearContent();
ws.getRange(r, thirdLevelColumn).clearDataValidations();
} else {
ws.getRange(r, thirdLevelColumn).clearContent();
var firstLevelColValue = ws.getRange(r, firstLevelColumn).getValue();
var filteredOptions = wsOptions.getDataRange().getValues().filter(function(o){ return o[0] === firstLevelColValue && o[1] === val }); // <--- Modified
var listToApply = filteredOptions.map(function(o){ return o[2] });
var cell = ws.getRange(r, thirdLevelColumn); // <--- Modified
applyValidationToCell(listToApply,cell);
}
}
function applyValidationToCell(list,cell){
var rule = SpreadsheetApp
.newDataValidation()
.requireValueInList(list) // <--- Modified
.setAllowInvalid(false)
.build();
cell.setDataValidation(rule)
}
如果我误解了你的问题,而这不是你想要的方向,我深表歉意。