繁体   English   中英

Google Apps脚本-断线循环

[英]Google apps script - Broken for loop

我正在使用Google Apps脚本,似乎搞砸了我的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位置的值运行。

我需要它做的事情(又名-我以为我是怎么写的:)

ZW变量保存来自Google工作表的单元格值的二维数组。 我正在遍历整个过程,检查每个数组条目的第9个值是否为字符串“是”,然后在条件为true的情况下运行函数的其余部分(对于带有“是”的每一列)。

我以为我以前曾做过这项工作,但最近不得不重组和优化一些东西。 现在,我开始认为我可能需要重新考虑事情并使用其他循环方法。 谁能教育我?

编辑:这是根据要求提供的更多上下文:

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语句之间使用了循环吗? 是到工作表的链接)

确实,这是微不足道的。 您混合了您的增量。 你写了

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM