将列范围放入一维数组的最有效方法

时间:2018-06-28 10:28:27

标签: arrays multidimensional-array google-apps-script google-sheets

我有一个Google表单,可在链接的电子表格中收集回复。表单中的字段之一是Username(工作表中的B列)。我正在编写一个脚本,以在新用户(唯一用户名)提交时通知我。为此,我:

  1. 获取B列中除最新值以外的所有值
  2. 获取最新的用户名
  3. 检查最新的用户名是否在值列表中(否则请执行某些操作)。

这是到目前为止我得到的:

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

这给了我一个看起来像usernames的2D数组[[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个主要问题:

  1. 如何将值放入数组而不是记录器?
  2. 这是做我想做的最好的方法吗?似乎没有必要每次提交时都抓取2D数组,转换为1D并进行比较。列数据不会改变,每次只会增加1。数据增长到1000s时,这将对运行时间有何影响?

1 个答案:

答案 0 :(得分:1)

是的,您可以将数组展平并在进行操作时与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事件中获取用户名,而不是从工作表的最后一行中获取用户名。但是,如果没有,您应该学习如何做!