Jen*_*010 0 javascript loops for-loop google-sheets google-apps-script
我正在使用 Google 应用程序脚本,似乎搞砸了我的一个 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...
}
}
Run Code Online (Sandbox Code Playgroud)
什么不工作:
for 循环不会增加。在调试器中运行代码时,var j 的值保持为 0.0,而函数的其余部分仅根据 zw 的 0 位置的值运行。
我需要它做什么(又名 - 我是怎么写的:)
ZW 变量保存来自 Google 工作表的二维单元格值数组。我正在循环遍历,检查每个数组条目的第 9 个值是否为“是”字符串,然后如果条件为真,则运行函数的其余部分(对于带有“是”的每一列)。
我以为我以前有这个工作,但最近不得不重组和优化一些东西。现在我开始认为我可能需要重新考虑事情并使用不同的循环方法。有人可以教育我吗?
编辑:根据要求,这里有更多的上下文:
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....
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我有一个菜单项附加到一个简单的 onOpen,它调用 menuItem1()。调用该函数会提示用户他们即将发送电子邮件的警告,然后根据工作表的内容获取数据以分配电子邮件地址。firstLetterLastName 就是一个例子。
我仍然没有让循环起作用,是因为我在两个 if 语句之间有它吗?(这是工作表的链接)
事实上,这是非常微不足道的。你混淆了你的增量。你写了
for (var j = 0; j < zw.length; ++j)
Run Code Online (Sandbox Code Playgroud)
这意味着您这样做1 + i(并且我们知道在开始时i = 0这意味着您的值将始终为 1)而不是使用通常的
for (var j = 0; j < zw.length; j++)
Run Code Online (Sandbox Code Playgroud)
这意味着您执行i + 1并更新i,因此您将获得预期0 + 1 1 + 1等
编辑:
首先,我推荐而不是像
if (responseMir === ui.Button.YES) {
// Your For loop
Run Code Online (Sandbox Code Playgroud)
正在做
if (responseMir !== ui.Button.YES) {
return
}
Run Code Online (Sandbox Code Playgroud)
并以类似的方式在 for 循环中
if (zw[j][9] !== 'Yes') {
break
}
Run Code Online (Sandbox Code Playgroud)
当您只想停止执行时,它主要通过不在单个 if 下包含大块代码来帮助提高可读性。
for由于这里的错误,您的循环被破坏:
teacherEmailMir.push(selValsMir[j][7]);
Run Code Online (Sandbox Code Playgroud)
所以你的循环会结束一次。但是,在下一次迭代中,您尝试推送selValsMir[1][7]不存在的内容。请注意,循环var selValsMir = []; 内的每个迭代,这意味着 for eachj 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]]);
Run Code Online (Sandbox Code Playgroud)
您的数组将始终具有selValsMir.lenght = 1和selValsMir[0].length = 10。所以很明显,试图访问任何东西selValsMir[1]都会给你一个错误,并在那里停止脚本。
我还建议查看if查看名称的第一个和前两个字母的语句,因为我相信您可以用更少的代码完成相同的操作。总是尝试精简。考虑使用switch()您最终使用大量else if