我已经在谷歌工作表上工作了一段时间了。 (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列中的最后一个单元格。我需要的是获取该列中的所有值,并将它们存储在我稍后可以调用的数组中。
我觉得我在这里错过了一些简单的事情...... :)
答案 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”
你当然可以采用不同的方法存储数据(变量)对于这个应用程序,我更容易将楼上的数据传递给保持对象。我意识到我主要是向自己解释这个:)但我希望将来有人会遇到这个帖子并找到比我更快的答案。