Google apps script 从另一个电子表格动态下拉列表
有了这个脚本,我可以自动填充从一个电子表格到另一个电子表格的下拉列表,但它仅限于在下拉列表中导入500个值,我需要它来获取更多值 此外,当我运行它时,它会在我在目标工作表中选择的单元格上工作。 如何设置下拉列表的特定范围,例如整个C列Google apps script 从另一个电子表格动态下拉列表,google-apps-script,google-sheets,drop-down-menu,Google Apps Script,Google Sheets,Drop Down Menu,有了这个脚本,我可以自动填充从一个电子表格到另一个电子表格的下拉列表,但它仅限于在下拉列表中导入500个值,我需要它来获取更多值 此外,当我运行它时,它会在我在目标工作表中选择的单元格上工作。 如何设置下拉列表的特定范围,例如整个C列 function importSheetA() { return SpreadsheetApp.openById('xxxxx') .getSheetByName('xxxxx')
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);
}
试试这个:
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个独特的项目。不过我可能弄错了 <> >下面的脚本将考虑数据中的<强>唯一<强>值,如果唯一值的总数小于500,则问题将得到解决。
- 要查找
,您可以使用:值的唯一列表
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);
}
函数populateDropdown(){
var值=importSheetA();
var uniqueValues=values.filter((v,i,a)=>a.indexOf(v)==i);//谢谢您的回答,但是数据验证中500个值的限制也有同样的错误。您自己试试。我将其更改为需要范围内的值,如建议的错误,现在它可以工作了。在使用它之前,我可以在哪里写电子表格源Id?看起来范围必须在同一个电子表格中才能工作。我的目标是加载dat在下拉列表中,来自不同的电子表格,因为我想避免在同一张表中过载,因此在同一张表中使用脚本填充下拉列表是没有意义的,正常的下拉列表已经可以从同一电子表格的另一个选项卡中的某个范围加载。嗨,Marios。我的列表大约是8000个项目。每个项目都不同。我可以作为K关于你的目标?为什么你想要一个8K项目的下拉列表?对于最终用户来说这是如何有用和实用的?他必须永远向下滚动才能到达底部项目。还考虑文件的下拉项目会有多重。你可以考虑基于某种类型将你的项目分组到不同的下拉菜单中。gory.@Popoff我有一个电子表格,其中有很多行的数据用于各种下拉列表,因此电子表格的速度非常慢。我的目标是从另一个电子表格加载下拉列表,以避免在下拉列表中有其他包含大量数据的选项卡。我认为在下拉菜单中不可能有8k项。我不认为有是您的逻辑的解决方案,因此您可能需要您的逻辑并妥协于google sheets的限制。@Popoff使用正常下拉菜单,其值可能来自某个范围,也可能来自8k项,但我将从两个不同的电子表格中使用此功能。