我在谷歌应用程序脚本中工作,似乎搞砸了我的一个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位置的值运行。
我需要它做什么(AKA - 我以为我写过它:)
ZW变量持有Google表格中的二维单元格值数组。我循环遍历,检查每个数组条目的第9个值是否为&#34;是&#34;然后运行函数的其余部分(对于每个列,使用&#34;是&#34;)如果条件为真。
我以为我之前有这个工作,但最近不得不重组和优化一些事情。现在我开始认为我可能需要重新思考并使用不同的循环方法。谁能教育我?
编辑:根据要求提供了更多上下文:
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语句之间有它吗? (Here是表格的链接)
答案 0 :(得分:4)
确实这是微不足道的。你混淆了你的增量。你写了
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