簡體   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