1

我一直在Google床单的这个侧面项目工作了一段时间。 (link to copy)当它起作用时,它将在单独表(Miranda,Piper,Lowes和Golden)的第I列(是或否)中进行有条件的论证,并发送电子邮件至Master和B列中的地址工作表,以及通过在函数结尾处运行switch语句返回的任何电子邮件。通过我通过这个网站得到的建议,我已经能够大幅提高我的代码,我非常感谢!这里是我的最新障碍 -谷歌应用程序脚本 - for循环的麻烦(再次)

代码: 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 = "[email protected]"; break; 
      case "forbes": holdingData.selectedIEPEmail = "[email protected]"; break; 
      case "green": holdingData.selectedIEPEmail = "[email protected]"; break; 
      case "marlo": holdingData.selectedIEPEmail = "[email protected]"; break; 
      case "mcDonald": holdingData.selectedIEPEmail = "[email protected]"; break; 
      case "nakkour": holdingData.selectedIEPEmail = "[email protected]"; break; 
      case "wright": holdingData.selectedIEPEmail = "[email protected]"; break; 
      default: break; 
     } 
    } 

的问题: for循环看起来通过holdingData.selectedIEP [中的jsfiddle线79]是越来越举起。我相信它可能会使用它的[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列中的最后一个单元格。我需要的是获取该列中的所有值,并将它们存储在稍后可以调用的数组中。

我觉得我错过了简单的东西在这里... :)

+1

你在脚本编辑器中以调试模式运行代码吗? –

+0

好主,我怎么错过那个功能..... 。谢谢你,这将是非常有价值的:) – Jensen010

+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]); 
} 

基本上,这个循环遍历制表大师的每一行。然后,每次我们到达第4列时,我们都会将特定行内该列的内容推送到holdData数组。

总结起来,循环是说“逐行浏览dataMaster”。那么我们说“每一行循环通过将该行内的第四列的内容推送到holdingData。studFirstNames“

你当然可以采取不同的方式来存储数据(变量)对于这个应用程序,我更容易将数据传递给一个控制对象,我知道我主要向自己解释这个:)但我希望在未来有人遇到这个帖子,并找到比我更快的答案。