[英]Copy data from one Spreadsheet to another keeping format and without formulas
What I'm looking to do is to copy a data range from one Spreadsheet to another while preserving formats (colors, styling, etc.) and only taking the values without the formulas.我要做的是将数据范围从一个电子表格复制到另一个电子表格,同时保留格式(颜色、样式等),并且只获取没有公式的值。
I already have this code (from a previous answer from @Tanaike), with a bit of modifications.我已经有了这段代码(来自@Tanaike 的先前回答),并进行了一些修改。 It preserves the formatting but copies the formulas and I only need the values.
它保留格式但复制公式,我只需要值。
//Source
var sourceSheet = SpreadsheetApp.openById(sourceID).getSheetByName(sheetName);
var sourceRange = sourceSheet.getRange(range);
//Destination
var destSS = SpreadsheetApp.openById(newID);
var destSheet = destSS.getSheets()[0];
var destRange = destSheet.getRange(range);
destSheet.clear();
//var copiedsheet = sourceRange.getSheet().copyTo(destSS); // <-- This works, but copies formulas and get Ref errors
var copiedsheet = sourceRange.getSheet().copyTo(destRange, {contentsOnly: true}); //Doesn't work, I tried many variations of this
copiedsheet.getRange(sourceRange.getA1Notation()).copyTo(destRange, {contentsOnly: true});
copiedsheet.getRange(sourceRange.getA1Notation()).copyTo(destRange, SpreadsheetApp.CopyPasteType.PASTE_COLUMN_WIDTHS, false); // Will preserve formatting
destSS.deleteSheet(destSS.getSheets()[0]);
DriveApp.getFolderById(destFolder).addFile(docFile);
DriveApp.getRootFolder().removeFile(docFile);
range
of var destRange = destSheet.getRange(range);
var destRange = destSheet.getRange(range);
range
范围and var sourceRange = sourceSheet.getRange(range);
var sourceRange = sourceSheet.getRange(range);
is not declared.copyTo
in Class Range cannot be used for other Google Spreadsheet. copyTo
方法不能用于其他 Google 电子表格。 It seems that this is the current specification.sourceRange.getSheet().copyTo(destSS)
is used, the values cannot be shown because of the authorization.sourceRange.getSheet().copyTo(destSS)
时,由于授权,无法显示值。 Also I'm worry about this. When above points are reflected to your script, it becomes as follows.当以上几点反映到您的脚本时,它变成如下。
Before you use this script, please set the variables of sourceID
, sheetName
and newID
.在使用此脚本之前,请设置
sourceID
、 sheetName
和newID
的变量。 And, please set range
as the A1Notation.并且,请将
range
设置为 A1Notation。
//Source
var sourceSS = SpreadsheetApp.openById(sourceID);
var sourceSheet = sourceSS.getSheetByName(sheetName);
var tempSheet = sourceSheet.copyTo(sourceSS);
var temoSheetRange = tempSheet.getRange(range);
temoSheetRange.copyTo(temoSheetRange, {contentsOnly: true});
SpreadsheetApp.flush(); // This might not be required.
//Destination
var destSS = SpreadsheetApp.openById(newID);
var destSheet = destSS.getSheets()[0];
destSheet.clear();
var destTempSheet = tempSheet.copyTo(destSS);
var destTempRange = destTempSheet.getRange(range);
var dstRange = destSheet.getRange("A1");
destTempRange.copyTo(dstRange);
destTempRange.copyTo(dstRange, SpreadsheetApp.CopyPasteType.PASTE_COLUMN_WIDTHS, false);
var i = 1;
var row = destTempRange.getRow();
for (var r = row; r <= row + destTempRange.getNumRows(); r++) {
destSheet.setRowHeight(i++, destTempSheet.getRowHeight(r));
}
destSS.deleteSheet(destTempSheet);
sourceSS.deleteSheet(tempSheet);
DriveApp.getFolderById(destFolder).addFile(docFile);
DriveApp.getFolderById(destFolder).addFile(docFile);
方向and DriveApp.getRootFolder().removeFile(docFile);
DriveApp.getRootFolder().removeFile(docFile);
in your script. If you can copy only the row height except for the default height of 21
pixels, the cost of script might be reduced.如果您只能复制除默认高度
21
像素之外的行高,则可能会降低脚本成本。 If you use it, please modify as follows.如果您使用它,请进行如下修改。 In this modification, Sheets API is not used.
在此修改中,不使用表格 API。
From从
for (var r = row; r <= row + destTempRange.getNumRows(); r++) { destSheet.setRowHeight(i++, destTempSheet.getRowHeight(r)); }
To至
for (var r = row; r <= row + destTempRange.getNumRows(); r++) { var rowHeight = destTempSheet.getRowHeight(r); if (rowHeight.= 21) destSheet,setRowHeight(i; rowHeight); i++; }
Or, when you use Sheets API, you can also use the following modification.或者,当您使用 Sheets API 时,您也可以使用以下修改。 In this case, please enable Sheets API at Advanced Google services.
在这种情况下,请在 Google 高级服务中启用表格 API。
From从
var i = 1; var row = destTempRange.getRow(); for (var r = row; r <= row + destTempRange.getNumRows(); r++) { destSheet.setRowHeight(i++, destTempSheet.getRowHeight(r)); }
To至
var reqs = []; var sheetId = destSheet.getSheetId(); var reqs = Sheets.Spreadsheets.get(newID, {ranges: [destTempSheet.getSheetName()], fields: "sheets(data(rowMetadata))"}).sheets[0].data[0].rowMetadata.reduce((ar, {pixelSize}, r) => { if (pixelSize.= 21) ar:push({updateDimensionProperties:{range:{sheetId,sheetId:dimension,"ROWS":startIndex,r:endIndex,r+1}:properties:{pixelSize,pixelSize}:fields;"pixelSize"}}); return ar, }; []). if (reqs.length > 0) Sheets.Spreadsheets:batchUpdate({requests, reqs}; newID);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.