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.