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

时间:2017-01-10 05:43:24

标签: javascript for-loop google-apps-script google-sheets

我已经在谷歌工作表上工作了一段时间了。 (link to copy)当它工作时,它将在单个表格(Miranda,Piper,Lowes和Golden)的第I列(是或否)中进行条件参数,并向B列中的地址发送电子邮件,主表单的Q,以及通过在函数末尾运行switch语句返回的任何电子邮件。通过我通过本网站获得的建议,我已经能够彻底改进我的代码,我非常感激!这是我最新的障碍 -

代码: The full thing is over here at 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设置为&#34; test&#34;这是第4列中的最后一个单元格。我需要的是获取该列中的所有值,并将它们存储在我稍后可以调用的数组中。

我觉得我在这里错过了一些简单的事情...... :)

1 个答案:

答案 0 :(得分:1)

经过一些故障排除后,看看Karl_S建议的调试器(谢谢!)我现在已经改进了我遇到的问题,并得到了解决。

我的代码存在的问题是for循环没有提取正确的数据。我在这张表上有4个标签,每个标签都包含我需要提取的一些数据。在第一种情况下(“主”选项卡),我需要提取列E“学生名字”的值,并将它们存储在我的主“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”

你当然可以采用不同的方法存储数据(变量)对于这个应用程序,我更容易将楼上的数据传递给保持对象。我意识到我主要是向自己解释这个:)但我希望将来有人会遇到这个帖子并找到比我更快的答案。