【问题标题】:Most efficient way to get a column range into a 1D array将列范围转换为一维数组的最有效方法
【发布时间】:2018-06-28 10:28:27
【问题描述】:

我有一个 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,看起来像[[UserA],[UserB],[UserC],[UserC],[UserA],[UserX]]. 然后我尝试了if (usernames.indexOf(latest_username) == -1,但这不起作用——它只适用于一维数组。我想过使用循环将数组转换为一维:

  for (var i = 0; i < usernames.length; i++) {
    Logger.log(usernames[i][0]);
  }

这使得记录器可以正确记录我想要的所有用户名,但我不知道如何将它们放入数组中。

2 个主要问题:

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

【问题讨论】:

  • 使用 Array#map: var users1d = usernames.map(function (row) { return row[0]; }); Apps 脚本有一些较新的 Array 方法可用 - 它们会显示在自动完成中。您可以查看它们在您选择的 JavaScript 语言参考(如 MDN)上的工作方式。
  • @tehhowch 抱歉延迟回复并感谢您的提示!

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


【解决方案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 事件中获取用户名,而不是从工作表的最后一行获取用户名。但如果不是,你应该学习如何做到这一点!

【讨论】:

  • 有道理,我试试把它放到循环里面,谢谢!您能否详细说明onFormSubmit 部分?我的计划是创建一个表单提交触发器(Edit &gt; Current project's triggers)来运行该函数,有没有不同的方法?
  • 如果你给函数添加一个参数,isUserNew(e),那么onFormSubmit触发器会将表单提交数据传递给你的函数。然后你可以得到最新的用户名:var username = e.namedValues["User name"][0]。见developers.google.com/apps-script/guides/triggers/events
猜你喜欢
  • 2010-09-18
  • 1970-01-01
  • 2021-10-16
  • 1970-01-01
  • 2022-12-07
  • 1970-01-01
  • 2011-07-05
  • 2020-02-11
  • 1970-01-01
相关资源
最近更新 更多