gpt4 book ai didi

javascript - 为什么我的 google apps 脚本中的数组会被覆盖?

转载 作者:行者123 更新时间:2023-11-30 19:10:17 25 4
gpt4 key购买 nike

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

现在,随着每一步,前一个数组都会发生变化并变得等于派生数组,直到最后所有数组都相同。

知道我做错了什么吗?

(我不是专业人士,仍在构建脚本的过程中,所以对于丑陋/低效的代码,请多多包涵 :)

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 行。

Log 2 的预期输出是第一步的索引数组以及原始数组。相反,它输出索引数组两次。

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

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

最佳答案

而不是使用这个 var completeTableIndexed = completeTable;

试试这个:

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

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

关于javascript - 为什么我的 google apps 脚本中的数组会被覆盖?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58560361/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com