0

我正在谷歌應用程序腳本,似乎已經搞砸了我的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位置的值運行。

我需要做的(AKA什麼 - 我是怎樣想我已經寫好了:)

的ZW變量保持單元格值的2維數組從谷歌片。我正在循環,檢查每個數組條目的第9個值是否爲「是」,然後在條件爲真時運行該函數的其餘部分(對於具有「是」的每列)。

我以爲我以前工作過,但最近不得不重新調整和優化一些東西。現在我開始認爲我可能需要重新思考並使用不同的循環方法。任何人都可以教育我嗎?

編輯:這是按要求多一點背景:我有連接到一個簡單的OnOpen菜單項,調用menuItem1

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.... 
     } 
     } 
    } 
} 

()。調用該函數會提示用戶發出要發送電子郵件的警告,然後根據表單內容獲取數據以分配電子郵件地址。 firstLetterLastName就是一個例子。

我還沒有得到循環的功能,是因爲我有它之間的兩個if語句? (Here是指向表單的鏈接)

+0

你能展示電子表格數據的外觀嗎?因爲你寫的for循環似乎沒有什麼問題。 –

+0

我添加了一個編輯,它提供了您要查找的數據嗎? – Jensen010

+0

我製作了電子表格的副本,將代碼從'for'循環和'if'clauses中剝離出來,並且在運行邏輯時沒有任何問題。如果你沒有得到預期的結果,我會專注於'for'循環中的代碼。如果您想提供更多關於哪些錯誤的信息(如果有的話),您將獲得幫助我們解決問題的信息。 – Silinus

回答

4

確實,這是相當無足輕重的。你混淆了你的增量。你寫

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 + 11 + 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 = [];裏面循環,這意味着每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

+0

你是對的,謝謝:)我確信這是問題的一部分,但我認爲我也有其他問題。我在上面添加了一個編輯並鏈接了我的工作表,如果您想查看 – Jensen010

+1

@ Jensen010我更新了我的答案。好像我到目前爲止一直在處理你的特定腳本:D無論如何,嘗試使用更多的空格。留下幾行空行來分解邏輯不同的代碼。例如,在'for'循環中,在一個塊中有所有'var',在該塊之前和之後放置一個空行。可讀性將立即增加,代碼不會執行任何不同的操作。 **總是使用空格** – Vytautas

+0

謝謝!這很有意義。在切換到菜單以充當觸發器之前,我已經捕獲了所需的所有數據,但是我在該過程中改變的一些內容一定會讓它變得混亂。這對於解決這個問題將會有很長的路要走,並且將整個事情調整到一個更通用的Web應用程序(上面的Karl_S註釋),再次感謝您所有有用的答案! :) – Jensen010