gpt4 book ai didi

javascript - Google 应用程序脚本 - for 循环损坏

转载 作者:行者123 更新时间:2023-11-28 13:11:43 25 4
gpt4 key购买 nike

我正在处理 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 位置的值运行。

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

ZW 变量保存来自 Google 工作表的单元格值的二维数组。我正在循环遍历它,检查每个数组条目的第 9 个值是否有"is"字符串,然后如果条件为真,则运行函数的其余部分(对于每个带有"is"的列)。

我以为我以前就可以做到这一点,但最近不得不重组和优化一些东西。现在我开始认为我可能需要重新考虑事情并使用不同的循环方法。谁能教教我吗?

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

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 (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 = [];内部循环,这意味着对于每个jselValsMir 将始终是一个数组。所以用下面的行

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

关于javascript - Google 应用程序脚本 - for 循环损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41882244/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com