Javascript 为什么我的谷歌应用脚本中的数组会被覆盖?

Javascript 为什么我的谷歌应用脚本中的数组会被覆盖?,javascript,arrays,logging,google-apps-script,Javascript,Arrays,Logging,Google Apps Script,我有一个大数组,其中包含来自电子表格的所有数据,我从中派生出包含初始数组部分的较小数组 现在,每执行一步,前面的数组都会发生变化,并与派生数组相等,直到最后所有数组都相同 知道我做错了什么吗 我不是专业人士,仍在构建脚本,因此请容忍我对丑陋/低效代码的看法: function dataTables() { /* All spreadsheet data to tables */ var mastersheet = SpreadsheetApp.openById("xyz");

我有一个大数组,其中包含来自电子表格的所有数据,我从中派生出包含初始数组部分的较小数组

现在,每执行一步,前面的数组都会发生变化,并与派生数组相等,直到最后所有数组都相同

知道我做错了什么吗

我不是专业人士,仍在构建脚本,因此请容忍我对丑陋/低效代码的看法:

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);




}
Log 1的预期输出是完整的电子表格数据,没有一些空行-工作正常,可以输出大约15行

日志2的预期输出是步骤1的索引数组以及原始数组。相反,它会输出索引数组两次

日志3和日志4的预期输出将是原始数组、索引原始数组和两个分解的数组,每个数组大约有两行。相反,所有记录的阵列都是包含两行的细分阵列。它们都一样

在此过程中,原始完整数组似乎被多次覆盖。

而不是使用此变量completetableindex=completeTable

试试这个:

var completeTableIndexed=[];
completeTable.forEach(function(r){completeTableIndexed.push(r.slice();});

这将返回整个数组的副本,而不是对它的引用。在研究这一点时,我发现slice在多维数组上似乎不起作用。我不知道这是否能解决你所有的问题,因为你的问题相当广泛。但这可能会帮助你走得更远。

在发布任何进一步的问题之前,我建议你抓住这个机会,学习如何写作。因为你的问题很广泛,你的例子也很复杂。好的,谢谢你的建议。我会的!正如我在下面的评论中所说,你的问题挑战了我认为我知道的关于slice的一切,因此我觉得有必要问一个关于堆栈溢出的问题。然而,当我写这个问题时,我问了自己一个问题,我想知道它是否只适用于一维数组。就像过去很多次我试图写一个最简单的综合性问题一样,这让我找到了解决方案。因此根本不需要问这个问题。我明白,这是有道理的!非常感谢,您的解决方案非常有效。事实上,在处理数组时,它创建引用而不是副本是一个问题。这个Stackoverflow线程提供了关于克隆阵列的各种方法以及哪些方法最快的全面答案,尽管并不是所有这些方法都适用于应用程序脚本:感谢链接,我想了解更多有关这方面的信息。我承认我发现解决你的问题很有挑战性,因为我认为slice可以处理二维数组,但我无法让它工作。我必须把它们分成扁平的阵列。有一段时间,它挑战了我对这一片所知的一切。我很高兴我能有所回报。就我对本文的理解而言,您的解决方案甚至是处理阵列复制的最快/最好的方法。干得好,再次感谢!