簡體   English   中英

為什么我的 Google Apps 腳本中的 arrays 會被覆蓋?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM