我已经在Google表格中从事这个副项目了一段时间了。(复制链接)有效时,它将在“各个工作表”(米兰达,派珀,洛斯和金)的第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 = "[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;
}
}
问题:查看通过holdData.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”,这是第四列中的最后一个单元格。我需要获取该列中的所有值,并将它们存储在一个数组中,以备后用。
我觉得我在这里错过了一些简单的事情... :)
经过一些故障排除后,再看一下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列时,我们会将特定行中该列的内容推送到holdingData数组。
总结起来,循环是说“逐行遍历dataMaster”。那么我们说:“您遍历的每一行将该行中第四列的内容推送到holdingData.studFirstNames”
对于数据的存储方式(变量),当然可以采用不同的方法。对于此应用程序,将数据从楼上传递给保持的对象比较容易。我意识到我主要是在向自己解释:),但我希望将来有人能看到这篇文章,并找到比我更快的答案。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句