【问题标题】:Can't find the issue while creating a dropdown list based on the selection of another dropdown list using Google App Scripts?在使用 Google App Scripts 根据选择另一个下拉列表创建下拉列表时找不到问题?
【发布时间】:2020-09-19 12:59:58
【问题描述】:

我在名为“仪表板”的工作表的 F5 单元格中有一个主题下拉列表。主题列表(例如 All、ICTE4113、HUM4115、PHY 4105)来自另一个名为“Master”的选项卡,其中主题位于第 6 列,日期位于第 1 列。

现在在仪表板的 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);            
    }      
  } 

【问题讨论】:

  • 也许你需要在应用新的之前使用 cell.clearDataValidations()。
  • 您能否提供一份工作表副本,以便我们测试和重现该问题?谢谢
  • @Marios 请注意,它用于在 F5 和 G5 单元格手动输入。工作表位于:docs.google.com/spreadsheets/d/…
  • @TamjidTaha 我发布了我的解决方案。让我知道它是否对您有用。
  • @Marios 目前下拉列表是按升序排列的,但我需要它按降序排列,最新日期排在第一位。试图解决这些方法但做不到 //var optionss = options.sort({column: 1, ascending: false}); //var options2 = options.sort(descOrder);请指教。

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


【解决方案1】:

解释:

你们很亲密。

代码中有两个主要问题与同一件事有关:

var filteredOptions = options.filter(function(o){return o[0] === val});
var listToApply = filteredOptions.map(function(o){return o[6]});

您根据错误列进行过滤。

  1. filteredOptions 应该在 F 列 上过滤,因此它应该是 return o[5] === val

  2. listToApply 应该在A 列 上过滤,因此它应该是return o[0]


我还做了一些更改:

  • 我使用getDisplayValues() 而不是getValues() 来避免将日期作为时间戳

  • 每次选择后我都会清除下拉菜单中的前一个值:

    cell.clearContent();
    cell.clearDataValidations();
    

最后但同样重要的是,当您使用 onEdit(e) 时,获取对使用 event 对象编辑的工作表和单元格的引用总是一个好主意。

例如,通过使用这个 if 条件,您可以确保您的代码DashboardF5 上进行编辑时执行/strong> 表格:

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);            
    }      
  } 
  }

【讨论】:

  • 您能否告诉我如何按降序对下拉列表进行排序,以找到最新日期位于列表顶部。目前它是按升序排列的。谢谢。
  • 试图解决这些方法但做不到 //var optionss = options.sort({column: 1, ascending: false}); //var options2 = options.sort(descOrder); //var listToApply2 = listToApply.sort({column: 1, ascending: false});
  • @TamjidTaha 我更新了我的答案,以降序对下拉日期进行排序。看看吧:)
  • 请注意,您的最终代码会生成错误消息,“数据验证规则的项目数超过了 500 的限制。请改用“范围内的列表”条件”。另请注意,主表包含 8-10K 行数据,下拉列表来自这些数据。谢谢
  • @TamjidTaha 感谢您的提醒。当我构建代码时,文件的行数较少。我认为错误是不言自明的。下拉菜单不能超过 500 项。这不是解决方案的限制。这是 Google 的限制。你想发布一个关于这个问题的新问题吗?这可能值得关注,其他专家(包括我)可能能够提供解决方法。
猜你喜欢
  • 1970-01-01
  • 2018-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多