Google apps script 使用应用程序脚本从CSV列表创建单元格内下拉列表(谷歌工作表数据验证)

Google apps script 使用应用程序脚本从CSV列表创建单元格内下拉列表(谷歌工作表数据验证),google-apps-script,google-sheets,Google Apps Script,Google Sheets,我有一个有多个编辑器的电子表格。我得到一个所有用户的列表,使用逗号分隔: var users = ss.getEditors().toString(); 我想设置一个下拉菜单来查看用户,而不是用逗号分隔用户列表,这看起来很难看(我有100多个用户)。为此,我写了以下内容: function Dropdown() { var ss = SpreadsheetApp.getActiveSpreadsheet(); var TestSheetName = "Test" var TestS

我有一个有多个编辑器的电子表格。我得到一个所有用户的列表,使用逗号分隔:

var users = ss.getEditors().toString();
我想设置一个下拉菜单来查看用户,而不是用逗号分隔用户列表,这看起来很难看(我有100多个用户)。为此,我写了以下内容:

function Dropdown() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var TestSheetName = "Test"
  var TestSheet = ss.getSheetByName(TestSheetName);
  var users = ss.getEditors().toString();
  TestSheet.getRange(1, 1).setDataValidation(SpreadsheetApp.newDataValidation()
    .setAllowInvalid(true)
    .requireValueInList([users], true)
    .build()
  );
}
创建的下拉菜单显示带有逗号的列表。奇怪的是,当我右键单击单元格并转到“数据验证”时,我可以看到用户输入正确。然后,当我单击“确定”关闭菜单时,下拉列表会自动更正,并且用户列表格式正确

我的代码有问题吗?还是这是一只虫子


欣赏您的见解。

的预期输入格式是字符串数组。正如您所提到的,
ss.getEditors().toString()
创建一个由逗号分隔的电子邮件组成的
字符串。然后将此单个
字符串
对象包装到一个数组中,并将其传递给数据验证生成器。实际上,这类似于:

.requireValueInList(["email@example.com,email2@example.org"])
这与

.requireValueInList(["email@example.com", "email2@example.org"])
解决方案是不要对由返回的
User
对象数组调用
.toString()
。相反,通过对每个用户调用其方法
getEmail()
,将字符串转换为
String[]
,然后将该字符串数组传递给数据验证生成器:

var emails = ss.getEditors().map(function (user) { return user.getEmail(); });
/*...*/
.requireValueInList(emails, true)
/*...*/
应该足够了

当您手动打开数据验证UI时,它会将输入的单个字符串拆分为多个不同的字符串,这就是为什么当您单击“确定”时,下拉列表会按您最初的预期填充