Google应用脚本 - 针对循环断开

时间:2017-01-26 20:19:51

标签: javascript loops for-loop google-apps-script google-sheets

我在谷歌应用程序脚本中工作,似乎搞砸了我的一个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是表格的链接)

1 个答案:

答案 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 = 1selValsMir[0].length = 10。因此,显然尝试从selValsMir[1]访问任何内容都会引发错误并在那里停止脚本。

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