【问题标题】:Google apps script - Broken for loopGoogle 应用程序脚本 - 循环中断
【发布时间】:2017-01-26 20:19:50
【问题描述】:

我正在使用 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...
    }
}

什么不起作用:

for 循环不会递增。在调试器中运行代码时,var j 的值保持在 0.0,而函数的其余部分仅根据 zw 的 0 位置的值运行。

我需要它做什么(AKA - 我以为我是这样写的:)

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....
        }
      }
    }
}

我有一个附加到一个简单的 onOpen 的菜单项,它调用 menuItem1()。调用该函数会提示用户他们将要发送电子邮件的警告,然后开始获取数据以根据工作表的内容分配电子邮件地址。 firstLetterLastName 就是一个例子。

我仍然没有让循环运行,是因为我在两个 if 语句之间有它吗? (Here 是工作表的链接)

【问题讨论】:

  • 您能展示一下电子表格数据的样子吗?因为您编写的 for 循环似乎没有任何问题。
  • 我添加了一个编辑,它是否提供了您正在寻找的数据?
  • 我复制了您的电子表格,从您的 for 循环和 ifclauses 中删除了代码,运行您的逻辑没有问题。如果您没有得到预期的结果,我将专注于您的 for 循环中的代码。如果您能提供更多关于哪些错误(如果有的话)的信息,您将得到这将帮助我们解决您的问题。
  • 我得到的错误是 [j] 保持在 0,而不是通过我需要它的数据递增 - zw[j][9]。这对应于列...U?在电子表格中,询问客户是否要发送电子邮件。 var zw 有所有预期的数据(一个数组的数组,每行的所有单元格内容,对于每个内部数组项)我试图循环通过它,确定每行的第 9 列中是否有一个是,然后基于此运行函数。但是,由于 [j] 保持为 0,它只会查看其中一行。本身不是“错误”,我只是做错了:)
  • copied your file 并开始查看您的代码。在我复制的文件中查看我对代码的编辑。

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


【解决方案1】:

确实很简单。你混淆了你的增量。你写的

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
}

当您只想停止执行时,它不会在单个 if 下包含大块代码,这主要有助于提高可读性。

你的for循环因为这里的错误而被破坏:

teacherEmailMir.push(selValsMir[j][7]);

所以你的循环会重复一次。但是在下一次迭代中,您尝试推送不存在的selValsMir[1][7]。请注意,var selValsMir = []; inside 循环的每个迭代,这意味着对于每个 j selValsMir 将始终是一个 empty 数组。所以用下面这行

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

【讨论】:

  • 你是对的,谢谢 :) 我确信这是问题的一部分,但我认为我还有另一个问题。如果您想看一下,我在上面添加了一个编辑并链接了我的工作表
  • @Jensen010 我更新了我的答案。到目前为止,似乎我一直在使用您的特定脚本进行很多工作:D 无论如何,尝试使用更多空格。留下几个空行来分解逻辑不同的代码。例如,在for 循环中,您将所有var 放在一个块中,在该块之前和之后放置一个空行。可读性将立即增加,并且代码不会执行任何不同。 始终使用空格
  • 谢谢!这很有意义。在切换到菜单以充当触发器之前,我让它捕获了我需要的所有数据,但是我在该过程中更改的一些东西一定把它搞砸了。这将大大有助于弄清楚这一点,并使整个事情适应更通用的网络应用程序(上面的 Karl_S 评论)再次感谢您提供所有有用的答案! :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-29
  • 1970-01-01
  • 2015-10-25
  • 1970-01-01
  • 2022-11-16
  • 2022-12-05
相关资源
最近更新 更多