如何从多个列表中创建一个下拉列表,并从另一个下拉列表中创建条件?
使用上面的图像,假设我在第一个下拉列表中(这是一个简单的示例),选择“家具” ...我希望第二个下拉列表仅显示家具。与第三个下拉列表相同,只希望在此处显示第二个选择的颜色。
尝试在这两个公式之一的“数据验证”中放置“自定义公式”条件,但是不起作用...
=FILTER(Object,Type = E2)
或
=QUERY(A:C,"SELECT B WHERE A='"&E2&"' ", 0)
在这里还读过其他一些话题,说公式是不可能的,我也找不到适合它的应用脚本。如何放置条件规则,并仅使我想要的值出现在下拉菜单中,而不是全部显示?我认为这与“ withCriteria(criteria,args)”有关,但是我不知道如何应用它。
关于列表...它可能由2k行组成(每行3列)。第一列将仅具有(也许)6或7个不同的值。第二个大约70或80,第三个完全不同。该顺序将是随机的,因为可以添加新值,并且我可以添加新的Furniture或Animal ...
这是我现在拥有的代码
function onEdit(e) {
var range = e.range;
var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet1');
if ( range.getRow() > 1) {
if ( range.getColumn() == 5) {
var cell_Range = ss.getRange( range.getRow(), range.getColumn() + 1);
var cell = cell_Range.getCell( 1, 1);
var rangeV = SpreadsheetApp.getActive().getRange('B2:B13');
var rule = SpreadsheetApp.newDataValidation().requireValueInRange(rangeV).build();
cell.setDataValidation(rule);
}
else if ( range.getColumn() == 6 ) {
var cell_Range = ss.getRange( range.getRow(), range.getColumn() + 1);
var cell = cell_Range.getCell( 1, 1);
var rangeV = SpreadsheetApp.getActive().getRange('C2:C13');
var rule = SpreadsheetApp.newDataValidation().requireValueInRange(rangeV).build();
cell.setDataValidation(rule);
}
}
}
示例表https://docs.google.com/spreadsheets/d/1aLpYd8fC0jpwvQOPVTj_yvY7DVKeFFnPvpJSF27if6w/edit?usp=sharing
预先感谢
答案 0 :(得分:1)
A1:C
function onEdit(e) {
const SETTINGS = {
//Edited Column : Column to Check(First col in optionsDataRange is considered 1)
5: 1,
6: 2,
};
var editedRange = e.range,
editedSheet = editedRange.getSheet(),
val = e.value,
col = editedRange.columnStart,
row = editedRange.rowStart;
/*Exit clause(s)*/
if (
Object.keys(SETTINGS).indexOf(col.toString()) === -1 || //If edited col is not in settings
editedSheet.getName() !== 'Sheet1' ||
row > 5
)
return;
var optionsDataRange = editedSheet
.getRange(1, 1, editedSheet.getLastRow(), 3)
.getValues();
/*Only get options where val is present in optionsDataRange*/
var options = optionsDataRange
.map(function(e) {
return e[SETTINGS[col] - 1] == val ? e[SETTINGS[col]] : null;
})
.filter(function(e, i, a) {
return e !== null && a.indexOf(e) === i;
});
var dv = SpreadsheetApp.newDataValidation()
.requireValueInList(options)
.build();
editedRange.offset(0, 1).setDataValidation(dv);
}