我在名为"Dashboard"的工作表的F5单元格中有一个主题下拉列表。受试者列表(例如All、ICTE4113、HUM4115、PHY 4105(来自另一个名为"Master"的选项卡,其中受试者在第6列,日期在第1列。
现在在Dashboard的G5单元格中,我想看到只有那些与在的F5单元格中选择的受试者相关的唯一日期仪表板。但它根本不会产生任何下拉列表。
很明显,这些唯一的日期将来自主数据表的第1列。我的代码如下:
var spreadsheet = SpreadsheetApp.getActive();
var dashboard = spreadsheet.getSheetByName("Dashboard");
var wsOptions = spreadsheet.getSheetByName("Master");
var options = wsOptions.getRange(2, 1, wsOptions.getLastRow()-1,6).getValues();
function onEdit(e){
var range = SpreadsheetApp.getActiveSheet().getRange('F5');
var val = range.getValue();
if(val === "All"){
dashboard.getRange('G5').setValue(new Date()).setNumberFormat("yyyy-mm-dd");
dashboard.getRange('G5').clearDataValidations();
}
else{
var filteredOptions = options.filter(function(o){return o[0] === val});
var listToApply = filteredOptions.map(function(o){return o[6]});
//console.log(listToApply);
var cell = dashboard.getRange('G5');
var rule = SpreadsheetApp.newDataValidation().requireValueInList(listToApply).setAllowInvalid(false).build();`
cell.setDataValidation(rule);
}
}
说明:
你很亲密。
代码中有两个主要问题与同一件事有关:
var filteredOptions = options.filter(function(o){return o[0] === val});
var listToApply = filteredOptions.map(function(o){return o[6]});
您根据错误的列进行筛选。
filteredOptions
应该在列F上进行筛选,因此它应该是return o[5] === val
。listToApply
应该过滤列A,因此它应该是return o[0]
。
我还做了一些更改:
我使用getDisplayValues((而不是getValues(,以避免将日期获取为时间戳。
每次选择后,我都会清除下拉菜单中的上一个值:
cell.clearContent(); cell.clearDataValidations();
最后但并非最不重要的是,当使用onEdit(e)
时,最好获得对使用event
对象编辑的图纸和单元格的引用。
例如,通过使用此if条件,您可以确保您的代码将仅在Dashboardsheet:中的单元格F5上进行编辑时执行
if (val_not =='F5' && as.getName() == "Dashboard") {code to be executed}
解决方案:
var spreadsheet = SpreadsheetApp.getActive();
var dashboard = spreadsheet.getSheetByName("Dashboard");
var wsOptions = spreadsheet.getSheetByName("Master");
var options = wsOptions.getRange(2, 1, wsOptions.getLastRow()-1,6).getDisplayValues();
function onEdit(e){
var as = e.source.getActiveSheet();
var val = e.range.getValue();
var val_not = e.range.getA1Notation();
if (val_not =='F5' && as.getName() == "Dashboard"){
if(val === "All"){
dashboard.getRange('G5').setValue(new Date()).setNumberFormat("yyyy-mm-dd");
dashboard.getRange('G5').clearDataValidations();
}
else{
var filteredOptions = options.filter(function(o){return o[5] === val});
var listToApply = filteredOptions.map(function(o){return o[0]}).sort().reverse();
var cell = dashboard.getRange('G5');
var rule = SpreadsheetApp.newDataValidation().requireValueInList(listToApply).setAllowInvalid(false).build();
cell.clearContent();
cell.clearDataValidations();
cell.setDataValidation(rule);
}
}
}