Javascript 谷歌应用程序脚本-循环中断

Javascript 谷歌应用程序脚本-循环中断,javascript,loops,for-loop,google-apps-script,google-sheets,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 (va

我在谷歌应用程序脚本中工作,似乎把我的一个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...
    }
}
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....
        }
      }
    }
}
var ss=SpreadsheetApp.getActiveSpreadsheet();
var sheets=ss.getSheets();
var lastRow=sheets[3]。getLastRow();
var zw=sheets[3]。getRange(2,1,lastRow-1,26)。getValues();
对于(var j=0;j
什么不起作用:

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...
    }
}
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....
        }
      }
    }
}
for循环不会递增。在调试器中运行代码时,var j保持在0.0的值,函数的其余部分仅基于zw的0位置的值运行

我需要它做什么(AKA-我认为我是如何写的:)

ZW变量保存来自Google工作表的二维单元格值数组。我正在循环这个过程,检查每个数组项的第9个值是否有“Yes”字符串,然后如果条件为真,则运行函数的其余部分(每个列都有“Yes”)

我以前以为我能做到这一点,但最近不得不对一些东西进行重组和优化。现在我开始认为我可能需要重新思考,并使用不同的循环方法。有人能教我吗

编辑:根据要求,这里有更多的上下文:

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...
    }
}
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....
        }
      }
    }
}
函数menuItem1(){
var ui=SpreadsheetApp.getUi();
var response=ui.alert('您确定要发送电子邮件吗?',ui.ButtonSet.YES\u 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();
如果(响应===ui.Button.YES){
对于(var j=0;j
我有一个菜单项连接到一个简单的onOpen,它调用menuItem1()。调用该函数会提示用户他们将要发送电子邮件,然后根据工作表的内容获取数据以分配电子邮件地址。firstLetterLastName就是一个例子


我仍然没有让循环正常工作,是不是因为它位于两个if语句之间?(是工作表的链接)

事实上,这是非常琐碎的。你把你的增量弄混了。你写的

for (var j = 0; j < zw.length; ++j)
这意味着您需要执行
i+1
并更新
i
,因此您将获得预期的
0+1
1+1

编辑:

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...
    }
}
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....
        }
      }
    }
}
首先,我建议不要像这样

if (responseMir === ui.Button.YES) {
  // Your For loop

在for循环中以类似的方式

if (zw[j][9] !== 'Yes') {
  break
}
当您只想停止执行时,它主要通过在单个if下不包含大块代码来帮助提高可读性

您的
for
循环因此处的错误而中断:

teacherEmailMir.push(selValsMir[j][7]);
所以你的循环会重复一次。但是在下一次提交时,您尝试推送不存在的
selValsMir[1][7]
。请注意,您拥有的每一笔交易
var selValsMir=[]
在循环内部,这意味着对于每个
j
SELVALMIR
将始终是一个空的数组。下面的一行

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=1
selValsMir[0]。length=10
。因此,显然,尝试从
selValsMir[1]
访问任何内容都会抛出错误,并立即停止脚本


我还建议查看查看名称的首字母和前两个字母的
if
语句,因为我相信您可以用更少的代码完成相同的操作。总是尽量精简。考虑使用 Switch()/代码>,在这里你使用了大量的<代码>,否则,如果

确实是非常微不足道的。你把你的增量弄混了。你写的

for (var j = 0; j < zw.length; ++j)
这意味着您需要执行
i+1
并更新
i
,因此您将获得预期的
0+1
1+1

编辑:

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...
    }
}
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....
        }
      }
    }
}
首先,我建议不要像这样

if (responseMir === ui.Button.YES) {
  // Your For loop

在for循环中以类似的方式

if (zw[j][9] !== 'Yes') {
  break
}
当您只想停止执行时,它主要通过在单个if下不包含大块代码来帮助提高可读性

您的
for
循环因此处的错误而中断:

teacherEmailMir.push(selValsMir[j][7]);
所以你的循环会重复一次。但是在下一次提交时,您尝试推送不存在的
selValsMir[1][7]
。请注意,您拥有的每一笔交易
var selValsMir=[]
在循环内部,这意味着对于每个
j
SELVALMIR
将始终是一个空的数组。下面的一行

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=1
selValsMir[0]。length=10
。因此,显然,尝试从
selValsMir[1]
访问任何内容都会抛出错误,并立即停止脚本


我还建议查看查看名称的首字母和前两个字母的
if
语句,因为我相信您可以用更少的代码完成相同的操作。总是尽量精简。考虑使用<代码> Switch()/代码>,在这里你使用了大量的<代码>,否则,如果/P>你能显示电子表格数据是什么样子的吗?因为您编写的for循环似乎没有任何问题。我添加了一个编辑,是吗