首页 > 解决方案 > 在 JavaScript 中循环多行?

问题描述

我被卡住了,简单而可怕的 for 循环是我的克星,我可以使用一些帮助。我有一个谷歌表,目前有 3 行(不包括标题)和 8 列。随着用户通过 Web 应用程序提供输入,行数将动态增长。我需要获取此表中收集的数据,并使用它来将电子邮件定向到我们组织内的特定服务。

我不需要所有 8 列数据,实际上我只需要 6 列。我正在努力解决的是遍历所有列和行。我尝试了一个简单的for循环,一个嵌套的for循环和一个for每个函数,它们都没有产生我期望的输出:(

我最新的代码如下:

function serviceSelector() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName('Response');
  var row = sheet.getLastRow();
  var range = sheet.getDataRange();
  var data = range.getValues();
  var holderArray = [];
  for(i = 0; i < data.length; i++){
     holderArray.push(
       data[1][0],
       data[1][1],
       data[1][2],
       data[1][4],
       data[1][5],
       data[1][6]);
  }
 Logger.log(holderArray);


//  switch(holderArray[1]){
//    case 'Volunteering':
//      MailApp.sendEmail('andypaulstevens@gmail.com', 'Message ID# ' +holderArray[2], 'You have receive the following message regarding Volunteering: \n\n'+holderArray[3]); 
//      break;  
//    case 'Home Help Service':
//      MailApp.sendEmail('andypaulstevens@gmail.com', 'Message ID# ' +holderArray[2], 'You have receive the following message regarding the Home Help Service: \n\n'+holderArray[3]); 
//      break;
//  }
} 

我已注释掉 switch 语句以解决获取正确数据的问题。

根据已经提供的 GREAT 建议,我已将代码更新如下:

function serviceSelector() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName('Response');
  var row = sheet.getLastRow();
  var range = sheet.getRange(2,1, sheet.getLastRow() -1,8);
  var data = range.getValues();
  var holderArray = [];
  for(i in data[0]){
    for(j in data[i]){
      holderArray.push(data[j])
    }
  }

  Logger.log(holderArray);

日志输出如下:

[格林威治标准时间 20-03-26 12:35:22:136] [[安迪,史蒂文斯,andys@.com,2020 年 3 月 25 日星期三 16:43:38 GMT+0000(格林威治标准时间),k87k4rp4,家庭帮助服务, Hello World, andy.s@.uk], [Andy, Stevens, andys@.com, Wed Mar 25 2020 16:44:40 GMT+0000 (Greenwich Mean Time), k87k63ae, Home Help Service, Hello World, andy。 s@.uk], [Andy, Stevens, andys@.com, Wed Mar 25 2020 16:46:38 GMT+0000 (Greenwich Mean Time), k87k8mmo, Home Help Service, Hi Joolz, Just send a quick email to show您将如何使用 Web 表单。我正在使用它,只需要电子邮件地址并弄清楚当我们得到回复时如何触发它。除此之外,它几乎完成了:), andy.s@.uk], null, null, null, null, null, [Andy, Stevens, andys@.com, Wed Mar 25 2020 16:43:38 GMT+0000 (格林威治标准时间),k87k4rp4,家庭帮助服务,Hello World,andy.s@.uk],[Andy,Stevens,andys@.com,2020 年 3 月 25 日星期三 16:44:40 GMT+0000(格林威治标准时间),k87k63ae,Home Help Service,Hello World,andy.s@.uk],[Andy,Stevens,andys@。 com,2020 年 3 月 25 日星期三 16:46:38 GMT+0000(格林威治标准时间),k87k8mmo,家庭帮助服务,您好 Joolz,只需发送一封快速电子邮件,向您展示 Web 表单的功能。我正在使用它,只需要电子邮件地址并弄清楚当我们得到回复时如何触发它。除此之外,它几乎完成了:), andy.s@.uk], null, null, null, null, null, [Andy, Stevens, andys@.com, Wed Mar 25 2020 16:43:38 GMT+0000 (格林威治标准时间),k87k4rp4,家庭帮助服务,Hello World,andy.s@.uk],[Andy,Stevens,andys@.com,2020 年 3 月 25 日星期三 16:44:40 GMT+0000(格林威治标准时间), k87k63ae, Home Help Service, Hello World, andy.s@org.uk], [Andy, S, andys@.com, 2020 年 3 月 25 日星期三 16:46:38 GMT+0000(格林威治标准时间),k87k8mmo,家庭帮助服务,您好 Joolz,只需发送一封快速电子邮件,向您展示 Web 表单的功能。我正在使用它,只需要电子邮件地址并弄清楚当我们得到回复时如何触发它。除此之外它几乎是完整的:), andy.s@.uk], null, null, null, null, null]

下面添加的完整代码,包括我哪里出错的 switch 语句?

function serviceSelector() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName('Response');
  var row = sheet.getLastRow();
  var range = sheet.getRange(2,1, sheet.getLastRow() -1,8);
  var data = range.getValues();
  var cols = range.getNumColumns();
  var rows = range.getNumRows();
  var holderArray = [];
  for (var i = 0; i < rows; i++){
    for (var j = 0; j < cols; j++) {
       holderArray.push(data[i][j]);
    }
  }
  Logger.log(holderArray);
  Logger.log(holderArray);
  switch(holderArray[5]){
    case 'Volunteering':
      MailApp.sendEmail(holderArray[2], 'Message ID# ' +holderArray[4], 'You have receive the following message regarding Volunteering: \n\n'+holderArray [6]); 
      break;  
    case 'Home Help Service':
      MailApp.sendEmail(holderArray[2], 'Message ID# ' +holderArray[4], 'You have receive the following message regarding the Home Help Service: \n\n'+holderArray [6]); 
      break;
  }
}

标签: javascriptgoogle-apps-scriptgoogle-sheets

解决方案


解释

您拥有的data变量是一个二维数组,这本质上意味着为了遍历它,for在这种情况下您将需要两个循环。由于data可能没有相同的行数和列数,您可以添加两个变量来表示您拥有的numbers of rows和。columns这样,一个循环将遍历行,另一个循环将遍历列。因此,每次遍历都由data[i][j]元素表示。

片段

 var cols = range.getNumColumns();
 var rows = range.getNumRows();
 var holderArray = [];
 for (var i = 0; i < rows; i++) 
    for (var j = 0; j < cols; j++) 
       holderArray.push(data[i][j]);

如果您只需要6列,您可以轻松地将cols变量替换为6.

参考


推荐阅读