繁体   English   中英

Google 应用程序脚本 - for 循环问题(再次)

[英]Google apps script - trouble with for loops (again)

我已经在 Google 表格中从事这个副项目有一段时间了。 复制链接)当它工作时,它将在个人工作表(Miranda、Piper、Lowes 和 Golden)的 I 列(是或否)中接受一个条件参数,并向 B 列和 Q 列中的地址发送电子邮件主表,以及通过运行函数末尾的 switch 语句返回的任何电子邮件。 通过我通过这个网站得到的建议,我已经能够极大地改进我的代码,我非常感激! 这是我最近的障碍-

代码: JSFiddle 的全部内容都在这里

 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM