2016-09-02 88 views
3

對於範圍內的每一行,我想添加一個或幾個條目到一個數組中,取決於一個int的值,在一個行的列中。 E.g如果我行:Google Apps腳本 - ForEach範圍內

Val1 1 

我要推一個物體{VAL1, '美國'}我的陣列。 在另一方面,如果我行:

Val1 2 

我要推兩個對象:{VAL1, 'FR'},{VAL1, 'DE'}我的陣列。 我想不通,爲什麼下面的代碼不工作:

var range = sheet.getRange("A2:B"); 
    var results = range.getDisplayValues(); 
    var array = []; 

    results.forEach(function(row){   

    switch(row[1]){ 
     case '1' :    
     row[1] = "US";   
     array.push(row);       
     break; 
     case '2' : 
     row[1] = "FR"; 
     array.push(row);  
     row[1] = "DE"; 
     array.push(row);  
     break; 
     case '3' : 
     var entry1 = row; 
     var entry2 = row; 
     entry1[1] = "UK"; 
     entry2[1] = "SW"; 
     array.push(entry1);  
     array.push(entry2);  
     break;    
    }   
    });  
return array; 

這將返回我兩次「DE」和兩次「SW」。我在三種情況下嘗試了一種不同的方式,以確保問題不在變量引用中,但同樣的事情發生。難道這是因爲我在循環值?它爲什麼這樣表現?

謝謝你的幫助。

+0

您可以添加輸入/輸出的樣本值嗎?這不是很清楚你期望你的輸出是 –

回答

1

這是因爲JS推送了一個被修改的變量,所以這個值在任何地方都被替換了。

嘗試直接推動這個樣子,不存儲:

var range = sheet.getRange("A2:B"); 
    var results = range.getDisplayValues(); 
    var array = []; 

    results.forEach(function(row){   

    switch(row[1]){ 
     case '1' :    
     array.push([row[0],"US"]);       
     break; 
     case '2' : 
     array.push([row[0],"FR"]);  
     array.push([row[0],"DE"]);  
     break; 
     case '3' : 
     array.push([row[0],"UK"]);  
     array.push([row[0],"SW"]);  
     break;    
    }   
    });  
return array; 
+0

所以這意味着當你將一個變量推送到一個數組時,變量仍然在範圍內? Ahhh Js ... – Stanislasdrg

1

您正在修改「行」的地方,不進行復制。也就是說,您將「行」(同一個數組)引用到多個位置,然後再次修改「row」 - 從而覆蓋原始更改。

爲了避免這個問題,你可以使用Array.slice(),使行的副本,是這樣的:

var range = sheet.getRange("A2:B"); 
var results = range.getDisplayValues(); 
var array = []; 

results.forEach(function(row) { 
    switch(row[1]) { 
    case '1' : 
     // No copy necessary, since you're only using it once    
     row[1] = "US"; 
     array.push(row); 
     break; 
    case '2' : 
     // Copy not necessary for the first use 
     row[1] = "FR"; 
     array.push(row); 
     // Copy here, since you will modify it again 
     row = row.slice(); 
     row[1] = "DE"; 
     array.push(row); 
     break; 
    case '3' : 
     // Make one extra copy 
     var entry1 = row; 
     var entry2 = row.slice(); 
     entry1[1] = "UK"; 
     entry2[1] = "SW"; 
     array.push(entry1); 
     array.push(entry2); 
     break; 
    } 
}); 
return array; 

提醒你,因爲你只需要在陣列中兩個元素的情況下,你推動,爲每個案例建立新的陣列(如另一個答案所示)可能會更好。如果我打算在性能不是非常重要的產品代碼中使用這個代碼,那麼我可能會爲每個修改都製作一個副本,而不是上面這個只是當你需要的變體。我上面所寫的方式演示了必要的副本(以便更容易理解這一點),但與更改防禦地複製所有內容相比,更改它更容易。