[英]Google apps script - Broken for loop
我正在使用Google Apps脚本,似乎搞砸了我的for循环之一。 我确定我在这里缺少一些琐碎的东西,但是我似乎无法发现它。
代码段:
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheets = ss.getSheets();
var lastRow = sheets[3].getLastRow();
var zw = sheets[3].getRange(2, 1, lastRow - 1, 26).getValues();
for (var j = 0; j < zw.length; ++j) {
if (zw[j][9] === 'Yes') {
var masterEmail = [];
var firstLetterLastName = [];
var first2Letter = [];
var masterEmail.push(zw[j][22]);
var firstLetterLastName.push(zw[j][1].charAt(0).toLowerCase());
var first2Letter.push(zw[j][1].charAt(0).toLowerCase() + zw[j][1].charAt(1).toLowerCase());
//The rest of the function follows...
}
}
什么不起作用:
for循环不会增加。 在调试器中运行代码时,var j的值为0.0,其余函数仅基于zw的0位置的值运行。
我需要它做的事情(又名-我以为我是怎么写的:)
ZW变量保存来自Google工作表的单元格值的二维数组。 我正在遍历整个过程,检查每个数组条目的第9个值是否为字符串“是”,然后在条件为true的情况下运行函数的其余部分(对于带有“是”的每一列)。
我以为我以前曾做过这项工作,但最近不得不重组和优化一些东西。 现在,我开始认为我可能需要重新考虑事情并使用其他循环方法。 谁能教育我?
编辑:这是根据要求提供的更多上下文:
function menuItem1() {
var ui = SpreadsheetApp.getUi();
var response = ui.alert('Are you sure you want to send emails?', ui.ButtonSet.YES_NO);
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheets = ss.getSheets();
var lastRow = sheets[3].getLastRow();
var zw = sheets[3].getRange(2, 1, lastRow - 1, 26).getValues();
if (response === ui.Button.YES) {
for (var j = 0; j < zw.length; j++) {
if (zw[j][9] === 'Yes') {
var firstLetterLastName = [];
firstLetterLastName.push(zw[j][1].charAt(0).toLowerCase());
//Other Stuff....
}
}
}
}
我有一个菜单项附加到一个简单的onOpen上,该菜单项调用menuItem1()。 调用该函数会提示用户将要发送电子邮件的警告,然后根据表的内容获取数据以分配电子邮件地址。 firstLetterLastName是一个示例。
我仍然没有让循环发挥作用,是因为我在两个if语句之间使用了循环吗? ( 这是到工作表的链接)
确实,这是微不足道的。 您混合了您的增量。 你写了
for (var j = 0; j < zw.length; ++j)
这意味着您要做1 + i
(我们知道一开始i = 0
意味着您的值将始终为1),而不是通常
for (var j = 0; j < zw.length; j++)
这意味着您要做i + 1
并更新i
,因此您将获得预期的0 + 1
1 + 1
等
编辑:
首先,我建议不要使用类似
if (responseMir === ui.Button.YES) {
// Your For loop
干
if (responseMir !== ui.Button.YES) {
return
}
并以类似的方式在for循环中
if (zw[j][9] !== 'Yes') {
break
}
当您只想停止执行时,它不会在单个代码中不包含大量代码,从而有助于提高可读性。
您的for
循环由于此处的错误而中断:
teacherEmailMir.push(selValsMir[j][7]);
因此,您的循环将结束一次。 但是,在下一次发出信号时,您尝试推动不存在的selValsMir[1][7]
。 请注意,您每次发出的信号都会有var selValsMir = [];
在循环内部 ,这意味着对于每个j
selValsMir
都将始终是一个空数组。 因此,与以下行
selValsMir.push([zw[j][0], zw[j][1], zw[j][2], zw[j][3], zw[j][4], zw[j][5], zw[j][7], zw[j][22], zw[j][23], zw[j][24]]);
您的数组将始终具有selValsMir.lenght = 1
和selValsMir[0].length = 10
。 因此,显然,尝试访问selValsMir[1]
任何内容都会引发错误并在那里停止脚本。
我还建议查看if
语句,该语句查看名称的前两个字母,因为我相信您可以用更少的代码来完成相同的工作。 始终尝试精简。 考虑使用switch()
,如果出现这种情况,最终会使用很多else if
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.