[英]Why do the arrays in my google apps script get overwritten?
我有一個大數組,其中包含來自電子表格的所有數據,我從中派生出較小的 arrays 包含部分初始數組。
現在,隨着每一步,前面的數組都會改變並變得等於派生數組,直到最后所有的 arrays 都相同。
知道我做錯了什么嗎?
(我不是專業人士,仍在構建腳本的過程中,所以請多多包涵丑陋/低效的代碼:)
function dataTables() {
/* All spreadsheet data to tables */
var mastersheet = SpreadsheetApp.openById("xyz");
// Data array of whole sheet with values in "Artikelbezeichnung" (field 6)
var completeTable = mastersheet.getSheetByName("Mastersheet").getDataRange().getValues();
completeTable.splice(0,2); // Remove header lines 1 & 2
for ( i = completeTable.length; i > 0 ; i-- ) {
if (completeTable[i-1][6-1] == "") { completeTable.splice(i-1,1); } // Remove lines with empty "Artikelbezeichnung" (field 6) if necessary
}
Logger.log(completeTable); // Log 1
// Indexeded data array of whole sheet
var completeTableIndexed = completeTable;
for ( i = completeTableIndexed.length; i > 0; i-- ) {
completeTableIndexed[i-1].unshift(i+2);
}
Logger.log(completeTableIndexed); // Log 2
Logger.log(completeTable);
// Data array of all lines eligible for RTN sheet with Indexed
var rtnTableIndexed = completeTableIndexed;
for ( i = rtnTableIndexed.length; i > 0 ; i-- ) {
if ( rtnTableIndexed[i-1][17] == "Nein" ) { rtnTableIndexed.splice(i-1,1); } // Remove lines with "Reparaturcontroller" (field 17) = "Nein" if necessary
else if ( rtnTableIndexed[i-1][28] != "" ) { rtnTableIndexed.splice(i-1,1); } // Remove lines with "Versanddatum G4G -> Hersteller" (tracker, field 28) if necessary
else if ( rtnTableIndexed[i-1][23] == "Ja" && rtnTableIndexed[i-1][25] == "" ) { rtnTableIndexed.splice(i-1,1); } // Remove lines with "KVA (J/N)" (field 23) = "Ja" and KVA is not yet confirmed ("KVA bestätigt am", field 25) if necessary
}
// Data array of all lines eligible for KVA sendings with Indexed
var kvaTableIndexed = completeTableIndexed;
for ( i = kvaTableIndexed.length; i > 0 ; i-- ) {
if ( kvaTableIndexed[i-1][23] != "Ja" && kvaTableIndexed[i-1][24] != "" ) { kvaTableIndexed.splice(i-1,1); } // Remove lines with "KVA (J/N)" (field 23) not "Ja" and "KVA versendet am" (field 24) not empty if necessary
}
var results = [completeTableIndexed,rtnTableIndexed, kvaTableIndexed, completeTable]; // Log 3
Logger.log(completeTableIndexed); // Log 4
Logger.log(rtnTableIndexed);
Logger.log(kvaTableIndexed);
Logger.log(completeTable);
}
日志 1 的預期 output 是完整的電子表格數據,沒有一些空行 - 工作得很好並且吐出大約 15 行。
Log 2 的預期 output 是第一步的索引數組以及原始數組。 相反,它輸出索引數組兩次。
日志 3 和 4 的預期 output 將是原始數組、索引原始數組和兩個分解的 arrays,每個大約兩行。 相反,所有記錄的 arrays 都是包含兩行的分解 arrays。 它們都是相同的。
在此過程中,原始完整數組似乎被多次覆蓋。
而不是使用這個var completeTableIndexed = completeTable;
嘗試這個:
var completeTableIndexed=[];
completeTable.forEach(function(r){completeTableIndexed.push(r.slice();});
這將返回整個數組的副本,而不是對它的引用。 在研究這個時,我發現切片似乎不適用於多維 arrays。 我不知道這是否會解決您的所有問題,因為您的問題非常廣泛。 但這可能會幫助您走得更遠。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.