Google 应用程序脚本 - 循环中断

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 语句之间有它吗?(是工作表的链接)

Vyt*_*tas 5

事实上,这是非常微不足道的。你混淆了你的增量。你写了

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 = 1selValsMir[0].length = 10。所以很明显,试图访问任何东西selValsMir[1]都会给你一个错误,并在那里停止脚本。

我还建议查看if查看名称的第一个和前两个字母的语句,因为我相信您可以用更少的代码完成相同的操作。总是尝试精简。考虑使用switch()您最终使用大量else if