【问题标题】:Dynamic dropdown from another spreadsheet来自另一个电子表格的动态下拉列表
【发布时间】:2020-10-25 15:41:48
【问题描述】:

使用这个脚本,我可以自动将一个下拉列表从一个电子表格填充到另一个,但它仅限于在下拉列表中导入 500 个值,我需要它来获取更多值。

此外,当我运行它时,它适用于我在目标工作表中选择的单元格。 如何为下拉菜单设置特定范围,例如整个 C 列?

function importSheetA() { 
  return SpreadsheetApp.openById('xxxxx')
                       .getSheetByName('xxxxx')
                       .getRange('xxxxx')
                       .getValues()
                       .flat(); // This ensures a simple array is returned
}

function populateDropdown() {
  var values = importSheetA();
  var rule = SpreadsheetApp.newDataValidation()
                           .requireValueInList(values, true)
                           .setAllowInvalid(false)
                           .build();
  var range = SpreadsheetApp.getActiveRange();
  range.setDataValidation(rule);  
}

【问题讨论】:

    标签: google-apps-script google-sheets drop-down-menu


    【解决方案1】:

    试试这个:

    function importSheetA() { 
      const ss=SpreadsheetApp.openById('ssid');
      const sh=ss.getSheetByName('Sheet1');
      const rg=sh.getRange(1,3,sh.getLastRow());
      return rg;//passing range now
    }
    
    function populateDropdown() {
      const rg=importSheetA();
      const rule=SpreadsheetApp.newDataValidation().requireValueInRange(rg).setAllowInvalid(false).build();
      const range=SpreadsheetApp.getActiveRange();
      range.clearDataValidations();
      range.setDataValidation(rule);  
    }
    

    也许您可以实现这样的解决方法:

    function importSheetA() { 
      const ss=SpreadsheetApp.openById('ssid')
      const sh=ss.getSheetByName('Sheet1');
      const rg=sh.getRange(1,3,sh.getLastRow());
      return rg.getValues();
    }
    
    function populateDropdown() {
      const ss=SpreadsheetApp.getActive();
      const sh=ss.getSheetByName('validationsheet');//local sheet for storing remote validation values
      sh.getDataRange().clear();//optional it is noticeably slower
      const v=importSheetA();
      const rg=sh.getRange(1,1,v.length,1);
      rg.setValues(v);
      const rule=SpreadsheetApp.newDataValidation().requireValueInRange(rg).setAllowInvalid(false).build();
      const range=SpreadsheetApp.getActiveRange();
      range.clearDataValidations();
      range.setDataValidation(rule);  
    }
    

    【讨论】:

    • 感谢您的回答,但在数据验证中限制为 500 个值也存在相同的错误。自己试试吧。
    • 我将其更改为需要范围内的值,就像建议的错误一样,现在它可以工作了。
    • 在我使用它之前,我可以在哪里写电子表格源ID?
    • 看起来范围必须在同一个电子表格中才能工作
    • 我的目标是从下拉列表中的不同电子表格中加载数据,因为我会避免重载同一张表格,因此没有任何意义让脚本在同一张表格中填充下拉列表,正常的下拉菜单已经可以从同一电子表格中另一个选项卡中的范围加载..
    【解决方案2】:

    解释:

    • 我想假设您的列表包含更多 超过 500 个独特项。不过我很可能弄错了。

    • 以下脚本将考虑您数据中的唯一值,如果唯一值的总数少于 500 个,您的问题将得到解决。

    • 要查找values 的唯一列表,您可以使用filter

      var uniqueValues = values.filter((v, i, a) => a.indexOf(v) === i);


    解决方案:

    populateDropdown 更改为:

    function populateDropdown() {
      var values = importSheetA();
      var uniqueValues = values.filter((v, i, a) => a.indexOf(v) === i); // <= New code
      var rule = SpreadsheetApp.newDataValidation()
                               .requireValueInList(uniqueValues, true) // <= New code
                               .setAllowInvalid(false)
                               .build();
      var range = SpreadsheetApp.getActiveRange();
      range.setDataValidation(rule);  
    }
    

    【讨论】:

    • 嗨马里奥斯。我的清单大约有 8000 项。都各不相同..
    • 我可以问一下你的目标吗?为什么你想要一个包含 8k 项的下拉列表?这对最终用户有何用处和实用性?他必须永远向下滚动才能到达底部的项目。还要考虑使用这样的下拉项目文件的重量。您可以考虑根据某种类别将您的项目分组到不同的下拉菜单中。 @Popoff
    • 我有一个包含很多行的电子表格,其中包含各种下拉列表的数据,因此电子表格非常慢。我的目标是从另一个电子表格加载下拉列表,以避免其他选项卡包含许多下拉数据。
    • 我认为下拉菜单中不可能有 8k 项。我认为您的逻辑没有解决方案,因此您可能需要您的逻辑并妥协谷歌表格的限制。 @Popoff
    • 使用从一个范围内获取值的正常下拉列表,也可以使用 8k 项,但我会从两个不同的电子表格中使用此功能。
    猜你喜欢
    • 1970-01-01
    • 2021-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-01
    • 2021-07-23
    相关资源
    最近更新 更多