将列范围转换为一维数组的最有效方法

问题描述 投票:0回答:4

我有一个 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();
}

这给了我一个 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个主要问题:

  1. 如何将值放入数组而不是记录器中?
  2. 这是做我想做的事情的最佳方法吗?每次提交时,我都会抓取一个 2D 数组,转换为 1D 并进行比较,这似乎没有必要。列数据不会改变,每次只会增长1。当数据增长到 1000 时,这将如何影响运行时间?
arrays multidimensional-array google-apps-script google-sheets
4个回答
4
投票

是的,您可以展平数组并与

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


0
投票

代替:

var usernames = sheet.getRange("B2:B" + penultimate_row_number).getValues();

做:

var usernames = [].concat(...sheet.getRange("B2:B" + penultimate_row_number).getValues());

这会将列的 2d 结果展平为 1d 数组。如果这不是最短路线,那么它应该是最接近的。不知道效率如何。


0
投票

从列返回的

getValues()
结构一致,因此我为此使用了
range.getValues().flat()


0
投票

你可以尝试用 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']
© www.soinside.com 2019 - 2024. All rights reserved.