依赖于动态填充的下拉列表Google表格

时间:2018-04-07 02:31:19

标签: drop-down-menu google-sheets dropdown google-sheets-api

当输入街道名称时,我只想自动填充包含链接到特定街道的所有细分的点细分。 当街道名称输入到C栏时,D栏应该有一个只包含该街道的点数的下拉列表。 虽然我意识到这可以通过在“数据”选项卡中创建过滤器来实现,但我正在尝试创建一个不允许这样做的表单,因此需要编写脚本。

这是Google表格:

https://docs.google.com/spreadsheets/d/1QbTqPegE_GLj9V6x5uCNNXAoi0v12Pmaelhc7uaMknE/edit?usp=sharing

我已经编写了这段代码,但是我无法通过Street过滤。

function setDataValid_(range, sourceRange) {
var rule = SpreadsheetApp.newDataValidation().requireValueInRange(sourceRange, 
true).build();
range.setDataValidation(rule);
}
function onEdit() {
var aSheet = SpreadsheetApp.getActiveSheet();
var aCell = aSheet.getActiveCell();
var aColumn = aCell.getColumn();

if (aColumn == 3 && aSheet.getName() == 'Sheet1') {
    var range = aSheet.getRange(aCell.getRow(), aColumn + 1);
    var sourceRange = aSheet.getRange('Sheet1!B2:B5131');
    setDataValid_(range, sourceRange)
  }
}

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

您已离婚,但您应该使用requireValueInList代替requireValueInRange。您正在传递sourceRange,它等于点数所有

要完成过滤,您需要查看所有街道值。如果街道值与选择匹配,则将相邻的点段保存到单独的列表中。保存所有这些点段后,将其传递给requireValueInList。为此,您需要利用getValues()将范围值作为arrayloop通过它获取。

我做了一些其他修改:

  • onEdit中,您应该使用an event object
  • 更改了您的变量名称,以便更容易理解
  • 添加了一项检查,以确保街道单元格不为空(当您从单元格中删除值时无需触发操作)
  • 添加了执行过滤的功能getPointSegments
  • 删除了setDataValid_函数,因为它使代码的可读性降低,在我看来,不值得成为自己的函数

    function onEdit(event) {
      var eventSheet = event.range.getSheet();
      var eventCell = event.range;
      var eventColumn = eventCell.getColumn();
      var eventValue = eventCell.getValue();
      if (eventColumn == 3 && eventSheet.getName() == "Sheet1" && eventValue != "") {
        var pointRange = eventSheet.getRange(eventCell.getRow(), eventColumn + 1);
        var pointSegments = getPointSegments_(eventSheet, eventValue);
        var rule = SpreadsheetApp.newDataValidation().requireValueInList(pointSegments, true).build();
        pointRange.setDataValidation(rule);
      }
    }
    
    function getPointSegments_(sheet, selectedStreet) {
      var streetsAndPoints = sheet.getRange("A2:B").getValues();
      var pointSegments = [];
      for (var i=0; i<streetsAndPoints.length; i++) {
        var street = streetsAndPoints[i][0];
        var pointSegment = streetsAndPoints[i][1];
        if (street === selectedStreet)
          pointSegments.push(pointSegment);
      }
      return pointSegments;
    }
    

最后,请确保您在街道字段中的数据验证看起来像这样(我实际上建议对无效数据“拒绝输入”)。

enter image description here