当前位置: 首页 > 知识库问答 >
问题:

在使用谷歌应用脚本创建基于选择另一个下拉列表的下拉列表时找不到问题?

唐弘益
2023-03-14

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

现在在仪表板的G5单元格中,我想看到一个下拉列表,其中只列出与仪表板F5单元格中所选主题相关的唯一日期。但它根本不会产生任何下拉列表。

显然,这些独特的日期将来自Master表的第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);            
    }      
  } 

共有1个答案

孔砚
2023-03-14

你很接近。

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

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

您根据错误的列进行筛选。

>

  • filteredOptions应该过滤列F,因此它应该返回o[5]===val。

    listToApply应该在列A上过滤,因此它应该是返回o[0]

    我也做了一些改变:

    >

    我在每次选择后清除下拉框中的前一个值:

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

    最后但并非最不重要的一点是,当您使用onEdit(e)时,最好获取对使用事件对象编辑的工作表和单元格的引用。

    例如,通过使用此if条件,可以确保仅在仪表板工作表中的单元格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);            
        }      
      } 
      }
    

  •  类似资料:
    • 我已经创建了一个基于本教程的依赖下拉列表的谷歌表。我创建的工作表的副本。我对依赖下拉列表的功能很满意,但是我的目标是从“材料”表(列B: I)中复制一行中的所有数据,这些数据对应于从列E中的依赖下拉列表中选择的选项"crop_specific"表,将此信息复制到列E: L。我想保留当前脚本的功能,如果从D列中选择的内容发生更改,则清除E列中的内容,并将其扩展到整个行。任何帮助都将不胜感激。脚本的代

    • 我想在选择另一个select元素的一个选项时显示一个select元素,在选择另一个选项时隐藏它。 这是JavaScript: 感谢任何帮助。谢谢

    • 问题内容: 我想创建两个下拉列表,类别和项目。 如果我选择名为car的类别之一,则项目下拉列表应包含Honda,Volvo和Nissan。 如果我选择一个名为phone的类别,则项目下拉列表应具有此iPhone,Samsung,Nokia。 我怎样才能做到这一点?我知道我无法使用纯HTML做到这一点。 问题答案: 工作演示 (带有jquery) 更新 :使用eval()能够添加所需的任意数量的数组

    • 我已经通读了所有其他文章,我没有找到我的答案。 我从一个带有对象选项的JOptionPane开始。当用户选择动物或栖息地时,会出现另一个带有选项的下拉列表。现在我正在努力让另一个信息弹出窗口在狮子被选中时打开。但我不能让它工作。 我还查看了其他人的输入,以便能够显示这些下拉列表。但他们使用的是JFrame,因此在NetBeans之外会打开另一个java窗口。 我现在要做的是为下拉列表中的选项输入i

    • 问题内容: 我需要使用cypress测试angularjs应用程序的下拉列表。 我需要单击一个下拉列表,然后从下拉列表中选择或单击一个项目。我尝试如下所示,它只能在一个实例上使用,而不能在其他情况下使用,因为第二个get()方法中的ID号随着其动态生成而不断变化。这不是带有html中选项的标准选择。 1)无论如何,我可以在每个选项上设置一个唯一属性并仅选择所需的属性,还是可以仅基于列表项的描述进行

    • 问题内容: 我需要使用JavaScript根据下拉菜单A中的选择更改下拉菜单B的内容。没有涉及到数据库查询- 我事先知道应该在A中选择B的内容。我已经找到了一些使用AJAX的示例,但是由于没有涉及到数据库查询,所以没有必要。谁能为我指出一些示例代码以实现此目的? 问题答案: function configureDropDownLists(ddl1, ddl2) {