使用应用脚本

时间:2018-04-26 12:11:23

标签: google-apps-script google-sheets

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

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

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

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

欣赏您的见解。

1 个答案:

答案 0 :(得分:1)

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

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

明显不同于

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

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

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

应该足够了。

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