Google apps script Google应用程序脚本与数组的比较
我试图比较两个包含采购订单数据的选项卡。第一列包含采购订单编号。我希望它检查新数据与旧数据,如果采购订单同时出现在这两个位置,并且新的旧数据只保留新数据。我仍然想保留所有没有相同采购订单号的旧数据。我收到一个错误,上面写着“Javascipt运行时意外退出。请提前感谢Google apps script Google应用程序脚本与数组的比较,google-apps-script,Google Apps Script,我试图比较两个包含采购订单数据的选项卡。第一列包含采购订单编号。我希望它检查新数据与旧数据,如果采购订单同时出现在这两个位置,并且新的旧数据只保留新数据。我仍然想保留所有没有相同采购订单号的旧数据。我收到一个错误,上面写着“Javascipt运行时意外退出。请提前感谢 function Data_Duplicates() { var WNSFleetCostsSpreadsheetID = ""; var WNSFleetCostsSpreadsheet
function Data_Duplicates() {
var WNSFleetCostsSpreadsheetID = "";
var WNSFleetCostsSpreadsheet = SpreadsheetApp.openById(WNSFleetCostsSpreadsheetID);
var DataCleansedSheet = WNSFleetCostsSpreadsheet.getSheetByName('data_cleansed');
var DataAfterCompareSheet = WNSFleetCostsSpreadsheet.getSheetByName('data_after_compare');
var DataPoolSheet = WNSFleetCostsSpreadsheet.getSheetByName('data_pool');
// Get New and old Data and put into arrays
var ImportData = DataCleansedSheet.getDataRange().getValues();
var ExistingData = DataPoolSheet.getDataRange().getValues();
var NewData = [];
for(var e = 0; e<ExistingData.length;e++){ // Existing Data Loop
for(var i = 0; i<ImportData.length;i++){ // Importing Data Loop
if (ExistingData[e][0] == ImportData[i][0]){
NewData.push(ImportData[i]);
} else {
NewData.push(ExistingData[e])
} // End IF
} // End Importing Data Loop
} // End Existing Data Loop
DataAfterCompareSheet.getRange(1,1,NewData.length,8).setValue(NewData); //Put the Data onto Input Sheet Temp
} // End Function
函数数据\u重复项(){
var WNSFleetCostsSpreadsheetID=“”;
var WNSFleetCostsSpreadsheet=SpreadsheetApp.openById(WNSFleetCostsSpreadsheetID);
var DataCleansedSheet=WNSFleetCostsSpreadsheet.getSheetByName('data_cleansed');
var DataAfterCompareSheet=WNSFleetCostsSpreadsheet.getSheetByName('data\u aftercompare');
var DataPoolSheet=WNSFleetCostsSpreadsheet.getSheetByName('data_pool');
//获取新数据和旧数据并放入数组
var ImportData=DataCleansedSheet.getDataRange().getValues();
var ExistingData=DataPoolSheet.getDataRange().getValues();
var NewData=[];
对于(var e=0;e如果现有数据和新数据都有大约4000行,成对比较它们将进行4000*4000=16000000比较(“操作”)。如果该错误与内存有关,您可能需要尝试不同的方法来比较现有和新的位置
例如,一个更快的选择是使用现有数据构建一个查找表,一种实现方法是使用一个JavaScript对象,该对象将PO编号作为键,详细信息作为值,这将需要4000次“操作”
两个数据源都有大约4000行和8列宽,对于每个现有的数据源,您将遍历整个导入列表并每次推送一个值。因此,这大约是1600万行。这就是您想要做的吗?显然不是。我将尝试只推送不匹配的值,然后合并新数据。或者将它们写入一张工作表,然后使用.getLastRow添加新数据。感谢您指出我的错误。我认为这将解决您的运行时错误。此外,请确保使用复数形式setValues()
。setValues()
不是此问题的解决方案。如果调用setValue()
(单数),只需在定义的整个范围内重复设置一个值,而不是打印所有POs。
for(var e = 0; e<ExistingData.length;e++){ // Existing Data Loop
for(var i = 0; i<ImportData.length;i++){ // Importing Data Loop
if (ExistingData[e][0] != ImportData[i][0]){
NewData.push(ExistingData[e]);
} // End IF
} // End Importing Data Loop
} // End Existing Data Loop
DataAfterCompareSheet.getRange(1,1,NewData.length,8).setValues(NewData); //Put the Data onto after Sheet
} // End Function
var ExistingDataObject = {};
for (var e = 0; e < ExistingData.length; e++) {
ExistingDataObject[ExistingData[e][0]] = ExistingData[e];
}
for (var i = 0; i < ImportData.length; i++) {
ExistingDataObject[ImportData[i][0]] = ImportData[i];
}
function Data_Duplicates() {
var WNSFleetCostsSpreadsheetID = "";
var WNSFleetCostsSpreadsheet = SpreadsheetApp.openById(WNSFleetCostsSpreadsheetID);
var DataCleansedSheet = WNSFleetCostsSpreadsheet.getSheetByName('data_cleansed');
var DataAfterCompareSheet = WNSFleetCostsSpreadsheet.getSheetByName('data_after_compare');
var DataPoolSheet = WNSFleetCostsSpreadsheet.getSheetByName('data_pool');
// Get New and old Data and put into arrays
var ImportData = DataCleansedSheet.getDataRange().getValues();
var ExistingData = DataPoolSheet.getDataRange().getValues();
var NewData = [];
// Creates a JS object with the existing data
var ExistingDataObject = {};
for (var e = 0; e < ExistingData.length; e++) {
ExistingDataObject[ExistingData[e][0]] = ExistingData[e];
}
// Replace existing data with new values from imported data or add new data
for (var i = 0; i < ImportData.length; i++) {
ExistingDataObject[ImportData[i][0]] = ImportData[i];
}
// Get rows from JS object
NewData = Object.values(ExistingDataObject);
// Write updated data
DataAfterCompareSheet.getRange(1,1,NewData.length,NewData[0].length).setValues(NewData);
}