[英]Google apps script - trouble with for loops (again)
我已经在 Google 表格中从事这个副项目有一段时间了。 ( 复制链接)当它工作时,它将在个人工作表(Miranda、Piper、Lowes 和 Golden)的 I 列(是或否)中接受一个条件参数,并向 B 列和 Q 列中的地址发送电子邮件主表,以及通过运行函数末尾的 switch 语句返回的任何电子邮件。 通过我通过这个网站得到的建议,我已经能够极大地改进我的代码,我非常感激! 这是我最近的障碍-
for (var ii = 0; ii < holdingData.masterStudNames.length; ii++) {
if (holdingData.masterStudNames[ii] === holdingData.selectedStudName) {
//Push Master column B to holdingData
holdingData.selectedTeacherEmail = holdingData.masterTeacherEmail[ii].toLowerCase();
//Push Master Column Q for selected student to holdingData
holdingData.selectedIEP = holdingData.allIEPContents[ii].toLowerCase();
}
}
for (var j = 0; j < holdingData.selectedIEP.length; j++) {
switch (holdingData.masterIEP[j]) {
case "dreier": holdingData.selectedIEPEmail = "Fake-email1@hotmail.com"; break;
case "forbes": holdingData.selectedIEPEmail = "Fake-email2@hotmail.com"; break;
case "green": holdingData.selectedIEPEmail = "Fake-email3@hotmail.com"; break;
case "marlo": holdingData.selectedIEPEmail = "Fake-email4@hotmail.com"; break;
case "mcDonald": holdingData.selectedIEPEmail = "Fake-email5@hotmail.com"; break;
case "nakkour": holdingData.selectedIEPEmail = "Fake-email6@hotmail.com"; break;
case "wright": holdingData.selectedIEPEmail = "Fake-email7@hotmail.com"; break;
default: break;
}
}
问题:查看 holdingData.selectedIEP [JSFiddle 中的第 79 行] 的 for 循环被阻塞了。 我相信它可能使用它的 [j] 计数器错误,或者其他循环之一正在妨碍。 我承认,一个函数中有 3 个 for 循环对我来说似乎太多了,但我想不出不同的方法来做到这一点。 有什么明显的我遗漏了吗?
我已经将代码减少了......很多。 所以我完全意识到可能还有更多改进的空间(我仍在学习中:)如果您有任何建议,我很乐意听取他们的意见!
更新:通过使用调试器,我发现的问题之一是我的 for 循环只提取所选列中的最后一个值。 例如,在第一个循环中:
for (var h = 0; h < dataMaster.length; h++) {
//Push all student first names from master sheet for later use
var masterStudFirstName = masterSheetDataLooped[h][4];
}
这将 masterStudentFirstName 设置为“test”,这是第 4 列中的最后一个单元格。 我需要的是获取该列中的所有值,并将它们存储在一个我可以稍后调用的数组中。
我觉得我在这里错过了一些简单的东西...... :)
经过一些故障排除,并按照 Karl_S 的建议查看调试器(谢谢!)我现在已经完善了我遇到的问题,并得到了解决。
我的代码的问题是 for 循环没有提取正确的数据。 我在这张表上有 4 个标签,每个标签都包含一些我需要提取的数据。 在第一种情况下(“Master”选项卡),我需要提取 E 列“Student First Name”的值并将它们存储在我的主“holdingData”对象内的数组对象中。
我之前的方法是循环遍历该列:
for (var h = 0; h < dataMaster.length; h++) {
//Push all student first names from master sheet for later use
var masterStudFirstName = masterSheetDataLooped[h][4];
}
但我发现,虽然这很有用,但它需要我编写条件以使代码的其他部分起作用。 所以我最终做的是这个(发布更多上下文变量):
//Set a new object to hold data
var holdingData = new Object();
holdingData.studFirstNames = [];
holdingData.allSheetsNamesAndIds = [[sheets[1], sheets[1].getSheetName(),
543328548], [sheets[3], sheets[3].getSheetName(), 1377446903], [sheets[4],
sheets[4].getSheetName(), 748028814], [sheets[5], sheets[5].getSheetName(),
431951580], [sheets[6], sheets[6].getSheetName(), 193755985]];
//Skippng a few lines....
//Load the master sheet, get its entire range, and then get all values
SpreadsheetApp.setActiveSheet(holdingData.allSheetsNamesAndIds[0][0]);
var numRowsMaster = masterSheet.getLastRow();
var dataRangeMaster = masterSheet.getRange(2, 1, numRowsMaster - 1, 26);
var dataMaster = dataRangeMaster.getValues();
//Loop dataMaster and pull the relevant columns
for (var h = 0; h < dataMaster.length; ++h) {
holdingData.studFirstNames.push(dataMaster[h][4]);
}
基本上,这会遍历 Master 选项卡的每一行。 然后每次到达第 4 列时,我们将特定行中该列的内容推送到holdingData 数组。
总而言之,循环是说“逐行通过 dataMaster”。 然后我们说“您循环的每一行都将该行中第 4 列的内容推送到holdingData.studFirstNames”
您当然可以采用不同的方法来存储数据(变量) 对于此应用程序,我可以更轻松地将楼上的数据传递给一个持有对象。 我意识到我主要是在向自己解释这个 :) 但我希望将来有人看到这篇文章并找到比我更快的答案。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.