简体   繁体   中英

Quickest method of copy-pasting range of cells in Google App Script

Background

I wrote script for copying range of cells from one document to another. It works correctly. But depending on volume of data it could run for 10+ minutes. Which is odd, because manual copy-pasting of this data without script will took 2 minutes. I ran some tests that revealed most time-consuming piece of code that needs to be speed up

Question

What is the quickest method of copying range of cells from one Google Spreadsheet document to another? Or how should I change my code to speed it up?

  // Copying 1st batch of data
  var srcLastRow = srcSheet1.getLastRow();
  var srcLastCol = srcSheet1.getLastColumn();
  var srcRange = srcSheet1.getRange(2, 1, srcLastRow-1, srcLastCol);
  var transfValues = srcRange.getValues();
  destSheet.getRange(destLastRow + 1,1,srcLastRow-1, srcLastCol).setValues(transfValues);

Appendix

And here is full script, that runs correctly but slow, just in case

function sborka() {

  // Destination sheet variables
  var destSpreadSheet = SpreadsheetApp.getActiveSpreadsheet();
  var destSheet = destSpreadSheet.getSheetByName("destination");
  
  // Source sheet variables
  var srcSpreadSheet1 = SpreadsheetApp.openById('xxxxxx');
  var srcSheet1 = srcSpreadSheet1.getSheetByName("source 1");
  var srcSpreadSheet2 = SpreadsheetApp.openById('ууууууу');
  var srcSheet2 = srcSpreadSheet2.getSheetByName("source 2");
  
  // Clear all except 1st row with headers
  var destLastRow = destSheet.getLastRow();
  destSheet.deleteRows(2,destLastRow)
  
  // What is last row in destination sheet?
  var destLastRow = destSheet.getLastRow(); 

  // Copying 1st batch of data
  var srcLastRow = srcSheet1.getLastRow();
  var srcLastCol = srcSheet1.getLastColumn();
  var srcRange = srcSheet1.getRange(2, 1, srcLastRow-1, srcLastCol);
  var transfValues = srcRange.getValues();
  destSheet.getRange(destLastRow + 1,1,srcLastRow-1, srcLastCol).setValues(transfValues);

  // What is last row in destination sheet now?
  var destLastRow = destSheet.getLastRow(); 
  
  // Copying 2nd batch of data
  var srcLastRow = srcSheet2.getLastRow();
  var srcLastCol = srcSheet2.getLastColumn();
  var srcRange = srcSheet2.getRange(2, 1, srcLastRow-1, srcLastCol);
  var transfValues = srcRange.getValues();
  destSheet.getRange(destLastRow + 1,1,srcLastRow-1, srcLastCol).setValues(transfValues);

  // Done
}

Try this:

  var srcSheet1 = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var destSS = SpreadsheetApp.openById("destination ss id");

  //Copy Source Sheet
  srcSheet1.copyTo(destSS);
  var newSrcSheet1 = destSS.getSheetByName("Copy of "+srcSheet1.getName());
  Logger.log(newSrcSheet1);

  //Copy range
  var destSheet = destSS.getSheetByName("Sheet1");
  var srcLastRow = newSrcSheet1.getLastRow();
  var srcLastCol = newSrcSheet1.getLastColumn();
  var srcRange = newSrcSheet1.getRange(2, 1, srcLastRow-1, srcLastCol);
  srcRange.copyTo(destSheet.getRange(destSheet.getLastRow() + 1,1));

  //Delete Sheet
  destSS.deleteSheet(newSrcSheet1);
  • I copied first the source sheet to the destination spreadsheet. The name of the copied sheet will be "Copy of [original sheet name]". Refer to Sheet.copyTo()

  • Then, I copied the range from the new source sheet to the destination sheet using Range.copyTo(destination)

  • Lastly, I deleted the new source sheet.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM