首页 > 解决方案 > 使用 Apps 脚本从 CSV 列表创建单元内下拉列表(Google 表格数据验证)

问题描述

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

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

创建的下拉菜单显示带有逗号的列表。奇怪的是,当我右键单击单元格并转到“数据验证”时,我可以看到用户已正确输入。当我然后单击“确定”关闭菜单时,下拉菜单会自行更正,并且我的用户列表格式正确。

我的代码做错了吗?或者这是一个错误?

欣赏您的见解。

标签: google-apps-scriptgoogle-sheets

解决方案


的预期输入格式requireValueInList是一个Strings 数组。正如你提到的,ss.getEditors().toString()创建一个String逗号分隔的电子邮件。然后将这个单一 对象包装String到一个数组中,并将它传递给数据验证构建器。实际上,这类似于:

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

这与

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

解决方案是不调用返回的对象.toString()数组。相反,通过在每个用户上调用其方法来转换为,然后将这个s 数组传递给数据验证构建器:Userss.getEditors()User[]String[]getEmail()String

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

应该足够了。

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


推荐阅读