我一直在寻找Stack Overflow以获取有关动态下拉列表的一些指导。但是,大多数似乎都是基于创建类别标题,然后是它下面每个标题的值。我有一个不同的设置,使我很难调整该方法到我的问题,因为我想根据第一个下拉列表的选择筛选第二列。
我有三列数据(这个问题我只需要两列)
城市,名称,电子邮件
我有一份代表名单,其中很多来自同一个城市。例如:
Boston John Smith
Atlanta Chris Jones
New York City Alan Chan
Boston Phillip Cho
Boston Sarah Fieler
Atlanta Eric Parks
我正在尝试在Google表格中制作两个下拉列表。第一个下拉列表很简单,因为我只选择整个列。但是,我希望第二列根据第一列过滤值,所以如果是波士顿,它只会显示John Smith,Phillip Cho和Sarah Fieler。
这可能吗?任何指导都将不胜感激。
修改 我想在Serge的回答中添加更新。 我想更进一步,每次选择城市时都不想刷新整个列的验证规则,所以我通过添加
来修改脚本var r = tSheet.getActiveCell();
var nextCell = r.offset(0, 1);
var rule =SpreadsheetApp.newDataValidation().setAllowInvalid(true).requireValueInList(names).build();
nextCell.setDataValidation(rule);
现在每次修改city列时,它只会影响它旁边的单元格。 希望其他人可以使用此功能。谢谢Serge
答案 0 :(得分:2)
以下是在工作表中获取该行为的完整设置。 我不得不假设您可能需要做出一些设置决定,以适应您的要求,例如列和工作表名称。
TriggerSetup
函数只需运行一次即可设置onEdit
触发器
getCities()
应该在打开时运行,或者当您决定需要更新第一个验证时。
我添加了一个小工具来删除数组中的重复项,我需要它来创建没有重复项的验证列表。
function setupTrigger(){
ScriptApp.newTrigger('onEditGetNames')
.forSpreadsheet(SpreadsheetApp.getActive())
.onEdit()
.create();
}
function onEditGetNames(){
var ss = SpreadsheetApp.getActiveSpreadsheet();
var tSheet = ss.getActiveSheet();
var col = ss.getActiveRange().getColumn();
if(tSheet.getName()!='schedule' || col!=1){ // assuming city validation is in column A
Logger.log('wrong sheet or wrong column');
return;
}
var cityMatch = tSheet.getActiveCell().getValue();
var data = ss.getSheetByName('contacts').getRange('A2:B').getValues();//assuming names are in column B
var names = [];
for(var n in data){
if(data[n][0] == cityMatch && data[n][1] != ''){
names.push(data[n][1]);
}
}
names.sort();
var tSheet = SpreadsheetApp.getActive().getSheetByName('schedule');
var targetRange = tSheet.getRange('B2:B');
targetRange.clearDataValidations();
var rule = SpreadsheetApp.newDataValidation().setAllowInvalid(true).requireValueInList(names).build();
targetRange.setDataValidation(rule);
}
function getCities(){
var ss = SpreadsheetApp.getActiveSpreadsheet();
var data = ss.getSheetByName('contacts').getRange('A2:A').getValues();//assuming cities are in column A
var city = [];
for(var n in data){
if(data[n][0] !=''){
city.push(data[n][0]);
}
}
city.sort();
var tSheet = SpreadsheetApp.getActive().getSheetByName('schedule');
var targetRange = tSheet.getRange('A2:A');
targetRange.clearDataValidations();
var rule = SpreadsheetApp.newDataValidation().setAllowInvalid(true).requireValueInList(city).build();
targetRange.setDataValidation(rule);
}
function removeDups(array){
var data = array.slice();
var outArray = [];
data.sort(
function(x,y){
var xp = x.toLowerCase();
var yp = y.toLowerCase();
return xp > yp ? 1 : xp < yp ? -1 : 0;
});
outArray.push(data[0]);
for(var n=0;n<data.length-1;n++){
if(data[n+1]!=data[n]){outArray.push(data[n+1])}
}
return outArray;
}
屏幕截图: