javascript - 在 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;
}
}
解决方案
解释
您拥有的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
.
参考
推荐阅读
- c++ - Typedef 给出错误“没有存储类或说明符”
- swift - 在 NSManagedObject 编辑上更新 SwiftUI 视图
- python - 如何在 OpenTurns Viewer 上设置轴限制?
- r - 如何根据字符串进行过滤
- php - 使用 Discord API 的 cURL PUT/PATCH 请求导致错误 400(错误请求)
- javascript - 尝试在 React 中调度按键事件
- react-native - 从对象数组中更改选定项的边框颜色
- c# - 神秘段故障
- java - 如何发送 HTML 电子邮件 Android
- java - 实现接口的枚举类的 Java 数组也接受其他未实现接口的枚举