我有一个 Google 表单,可以在链接的电子表格中收集回复。表单中的字段之一是
Username
(工作表中的 B 列)。我正在编写一个脚本,以便在新用户(唯一的用户名)提交时通知我。为此,我:
这是我到目前为止所得到的:
function isUserNew() {
var spreadsheet = SpreadsheetApp.openById("INSERT ID HERE");
var sheet = SpreadsheetApp.setActiveSheet(spreadsheet.getSheets()[0]);
var last_row_number = sheet.getLastRow()
var penultimate_row_number = (last_row_number-1)
var latest_username = sheet.getRange(last_row_number, 2).getValue()
var usernames = sheet.getRange("B2:B" + penultimate_row_number).getValues();
}
这给了我一个 2D 数组
usernames
,看起来像 [[UserA],[UserB],[UserC],[UserC],[UserA],[UserX]].
然后我尝试了 if (usernames.indexOf(latest_username) == -1
但这不起作用 - 它只适用于 1D 数组。我想到使用循环将数组转换为一维:
for (var i = 0; i < usernames.length; i++) {
Logger.log(usernames[i][0]);
}
这使得记录器正确记录我想要的所有用户名,但我不知道如何将它们放入数组中。
2个主要问题:
是的,您可以展平数组并与
indexOf
进行比较:
var flattened_usernames = [] ;
for (var i = 0; i < usernames.length; i++) {
flattened_usernames.push(usernames[i][0]);
}
但是你最好只在循环内进行检查:
if (usernames[i][0] === latest_username)
顺便说一句,我假设您知道如何直接从
onFormSubmit
事件中获取用户名,而不是从工作表的最后一行中获取用户名。但如果没有,你应该学习如何做到这一点!
代替:
var usernames = sheet.getRange("B2:B" + penultimate_row_number).getValues();
做:
var usernames = [].concat(...sheet.getRange("B2:B" + penultimate_row_number).getValues());
这会将列的 2d 结果展平为 1d 数组。如果这不是最短路线,那么它应该是最接近的。不知道效率如何。
从列返回的
getValues()
结构一致,因此我为此使用了 range.getValues().flat()
。
你可以尝试用 flat()
来展平数组// this is what you get from a range passed to a function as param (2d array)
var myArrayFromRange = [['hello'], ['your'], ['world'], ['sucks']];
//this returns a 1-dimension array
var list1Flatten = myArrayFromRange.flat();
Logger.log(list1Flatten)
//result: ['hello', 'your', 'world', 'sucks']