Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 将列范围放入一维数组的最有效方法_Arrays_Multidimensional Array_Google Apps Script_Google Sheets - Fatal编程技术网

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

Arrays 将列范围放入一维数组的最有效方法,arrays,multidimensional-array,google-apps-script,google-sheets,Arrays,Multidimensional Array,Google Apps Script,Google Sheets,我有一个谷歌表单,可以在链接的电子表格中收集回复。表单中的一个字段是用户名(工作表中的B列)。我正在编写一个脚本,当新用户(唯一用户名)提交时通知我。为此,我: 获取B列中除最新值以外的所有值 获取最新的用户名 检查最新用户名是否在值列表中(如果不在,请执行操作) 以下是到目前为止我得到的信息: function isUserNew() { var spreadsheet = SpreadsheetApp.openById("INSERT ID HERE"); var sheet = S

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

  • 获取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数组。我想使用循环将数组转换为1D:

      for (var i = 0; i < usernames.length; i++) {
        Logger.log(usernames[i][0]);
      }
    
    for(var i=0;i
    这使得记录器正确地记录了我想要的所有用户名,但我不知道如何将它们放入数组中

    2个主要问题:

  • 如何将值放入数组而不是记录器中
  • 这是做我想做的事情的最好方法吗?似乎没有必要每次提交时,我都获取一个2D数组,转换为1D,然后进行比较。列数据不会改变,每次只会增加1。当数据增长到1000时,这会对运行时间产生怎样的影响

  • 是的,您可以将数组展平并与
    indexOf
    进行比较:

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

    顺便说一句,我假设你知道如何直接从
    onFormSubmit
    事件中获取用户名,而不是从工作表的最后一行获取用户名。但如果不知道,你应该学会如何这样做!

    这很有意义,我会尝试将其放入循环中,谢谢!你能详细说明
    onFormSubmit
    部分吗?我的计划是创建一个表单提交触发器(
    Edit>Current project's triggers
    )来运行函数,是否有其他方法?如果向函数添加参数,则为isUserNew(e),然后onFormSubmit触发器将表单提交数据传递给您的函数。然后您可以像这样获取最新的用户名:
    var username=e.namedValues[“User name”][0]
    。请参阅使用
    Array#map
    var users1d=usernames.map(函数(行){return row[0];})
    Apps脚本中有一些较新的
    Array
    方法可用-它们将在自动完成中显示。您可以查看它们在所选JavaScript语言引用(如MDN)上的工作方式。@tehhowch对于延迟响应表示抱歉,感谢您的提示!
    if (usernames[i][0] === latest_username)