基于第一选择

时间:2016-04-18 13:45:37

标签: validation google-apps-script google-sheets

我一直在寻找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

1 个答案:

答案 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;
}

屏幕截图:

enter image description here enter image description here