well, I'm trying to do what is described in the header. Both tables have only one sheet, which I am comparing. One spreadsheet is and updates another, so I am trying to get only new content. (if it were a fc (dos command) function, how easy it would be ...)
After doing the search, I have the following script, which should work in most cases, which uses arrays for each sheet.
function test() { var Folder = DriveApp.getFoldersByName('theFolder').next(); var FolderId =Folder.getId(); //call old_spreadsheet var searchFor ="fullText contains 'sheet_old' and '" + FolderId + "' in parents"; var files = DriveApp.searchFiles(searchFor); var old_file = files.next(); var old_spreadsheet = SpreadsheetApp.openById(old_file.getId()); var old_sheet = old_spreadsheet.getSheets()[0]; var old_sheetname = old_sheet.getName(); var old_array = old_sheet.getDataRange().getValues(); Logger.log(old_file.getName() + ' : ' + old_sheetname + ' : ' + old_array.length); //call spreadsheet var searchFor ="fullText contains 'sheet' and '" + FolderId + "' in parents"; var files = DriveApp.searchFiles(searchFor); var file = files.next(); var spreadsheet = SpreadsheetApp.openById(file.getId()); var sheet = spreadsheet.getSheets()[0]; var sheetname = sheet.getName(); var array = sheet.getDataRange().getValues(); Logger.log(file.getName() + ' : ' + sheetname + ' : ' + array.length); var newarray = getNewData(array,old_array); Logger.log('there are ' + newarray.length + 'different rows'); } function getNewData(array1,array2){ var diff =array2; for (var i = 0; i<array1.length; i++){ var duplicate = false; for (var j = 0;j<diff.length;j++){ if (array1[i].join() == diff[j].join()){ Logger.log('duplicated line found on rows ' + i + ':' + j); diff.splice(j,1); var duplicate= true; break; } } if (duplicate==false) { Logger.log('not duplicated line found on row ' + i); diff.push(array1[i]); } } return diff; }
The fact is that the files are too large, almost 30,000 lines, so the scripts exceed the limit of 5 minutes to execute.
Is there a way to improve this, for example, to eliminate the inner loop? Or is there a way to do this piecemeal? like the first first 5000 lines, etc.
Hello,
EDIT: After a little analysis of the table, I found out that for each row there is an identifier, so now I can concentrate the search in only one column of each table. So here is my new implementation:
function test(){ var Folder = DriveApp.getFoldersByName('theFolder').next(); var FolderId =Folder.getId(); //call old_spreadsheet var searchFor ="fullText contains 'sheet_old' and '" + FolderId + "' in parents"; var files = DriveApp.searchFiles(searchFor); var old_file = files.next(); var old_spreadsheet = SpreadsheetApp.openById(old_file.getId()); var old_sheet = old_spreadsheet.getSheets()[0]; var old_sheetname = old_sheet.getName(); var old_array = old_sheet.getDataRange().getValues(); Logger.log(old_file.getName() + ' : ' + old_sheetname + ' : ' + old_array.length); //call spreadsheet var searchFor ="fullText contains 'sheet' and '" + FolderId + "' in parents"; var files = DriveApp.searchFiles(searchFor); var file = files.next(); var spreadsheet = SpreadsheetApp.openById(file.getId()); var sheet = spreadsheet.getSheets()[0]; var sheetname = sheet.getName(); var array = sheet.getDataRange().getValues(); Logger.log(file.getName() + ' : ' + sheetname + ' : ' + array.length); //The COlumn has an indicator, so i search for that. I don't control the formatting of the files, so i search in both spreadsheet for the indicator var searchString = 'NAME'; for (var i = 0; i < old_array.length; i++) { for (var j = 0; j < old_array[i].length; j++) { if (old_array[i][j] == searchString) { var Row_old = i+1; var Column_old = j; break; } } if (Row_old != undefined){ break; } } for (var i = 0; i < array.length; i++) { for (var j = 0; j < array[i].length; j++) { if (array[i][j] == searchString) { var Row = i+1; var Column = j; break; } } if (Row != undefined){ break; } } Logger.log(Row_old+':::'+Column_old+'\n'+Row+':::'+Column); var diff_index =[]; var row_ind = 0; for (var i=Row;i<array.length;i++){ Logger.log(i); var existe = ArrayLib.indexOf(old_array, Column_old, array[i][Column]); if (existe==-1){ Logger.log(row_ind+'!!!'); diff_index[row_ind]=i; row_ind++; } } Logger.log(diff_index); }
This still does not have enough time ... Now I will try to include your comments.