[英]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 = 1
和selValsMir[0].length = 10
。 因此,顯然,嘗試訪問selValsMir[1]
任何內容都會引發錯誤並在那里停止腳本。
我還建議查看if
語句,該語句查看名稱的前兩個字母,因為我相信您可以用更少的代碼來完成相同的工作。 始終嘗試精簡。 考慮使用switch()
,如果出現這種情況,最終會使用很多else if
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.