我有一个包含多个编辑器的电子表格。我得到一个用逗号分隔的所有用户的列表:
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()
);
}
创建的下拉菜单显示带逗号的列表。什么是奇怪的是当我右键单击单元格并转到"数据验证,"我可以看到用户输入正确。当我点击“确定”时要关闭菜单,下拉列表会自行更正并且我已正确格式化用户列表。
我的代码出错吗?或者这是一个错误吗?
欣赏您的见解。
答案 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时,它会将输入的单个字符串拆分为多个不同的字符串,这就是为什么当您单击“确定”时,下拉列表会按照您最初的预期填充。