Google apps script Google应用程序脚本与数组的比较

Google apps script Google应用程序脚本与数组的比较,google-apps-script,Google Apps Script,我试图比较两个包含采购订单数据的选项卡。第一列包含采购订单编号。我希望它检查新数据与旧数据,如果采购订单同时出现在这两个位置,并且新的旧数据只保留新数据。我仍然想保留所有没有相同采购订单号的旧数据。我收到一个错误,上面写着“Javascipt运行时意外退出。请提前感谢 function Data_Duplicates() { var WNSFleetCostsSpreadsheetID = ""; var WNSFleetCostsSpreadsheet

我试图比较两个包含采购订单数据的选项卡。第一列包含采购订单编号。我希望它检查新数据与旧数据,如果采购订单同时出现在这两个位置,并且新的旧数据只保留新数据。我仍然想保留所有没有相同采购订单号的旧数据。我收到一个错误,上面写着“Javascipt运行时意外退出。请提前感谢

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