简体   繁体   English

将数据从一个电子表格复制到另一种保留格式且不使用公式

[英]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);

Modification points:修改点:

  • In your script, 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.未声明。
  • Method of copyTo in Class Range cannot be used for other Google Spreadsheet. Class Range 中的copyTo方法不能用于其他 Google 电子表格。 It seems that this is the current specification.这似乎是当前的规范。 I think that this might be the reason of your issue.我认为这可能是您的问题的原因。
  • And, for example, when IMPORTRANGE is used in the source sheet as the formula, when sourceRange.getSheet().copyTo(destSS) is used, the values cannot be shown because of the authorization.并且,例如,当在源表中使用IMPORTRANGE作为公式时,当使用sourceRange.getSheet().copyTo(destSS)时,由于授权,无法显示值。 Also I'm worry about this.我也很担心这个。

When above points are reflected to your script, it becomes as follows.当以上几点反映到您的脚本时,它变成如下。

Modified script:修改后的脚本:

Before you use this script, please set the variables of sourceID , sheetName and newID .在使用此脚本之前,请设置sourceIDsheetNamenewID的变量。 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);
  • I'm not sure your direction of DriveApp.getFolderById(destFolder).addFile(docFile);我不确定您的DriveApp.getFolderById(destFolder).addFile(docFile);方向and DriveApp.getRootFolder().removeFile(docFile);DriveApp.getRootFolder().removeFile(docFile); in your script.在你的脚本中。 So in this modification, I don't show it.所以在这个修改中,我没有展示它。 When you are required to use it, please add it.当您需要使用它时,请添加它。

Note:笔记:

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

References:参考:

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 在编辑时将数据从一个电子表格复制到另一个电子表格 - Copy data from one spreadsheet to another on edit 如何在编辑时将数据从一个电子表格复制到另一个电子表格 - How to copy data from one spreadsheet to another on edit 不使用导入范围功能将数据从一个电子表格导入到另一个电子表格 - Importing data from one spreadsheet to another without the import range function 将多个工作表从一个电子表格复制到另一个电子表格 - Copy several sheets from one spreadsheet to another spreadsheet 从另一个Google电子表格动态更新公式 - Dynamically Updating Formulas From Another Google Spreadsheet 我可以将数据从一个电子表格复制到新的电子表格吗? - Can I copy data from one spreadsheet to a new spreadsheet? 如何更正将数据从一个 Google 电子表格导出到另一个的格式问题? - How To Correct Format Issue Exporting Data From One Google Spreadsheet To Another? Google脚本会根据日期将范围从一个电子表格复制到另一个电子表格 - Google scripts copy range from one spreadsheet to another based on date Google电子表格将值从一行复制到另一张工作表 - Google spreadsheet copy values from one row to another sheet 将一行从一个Google表格电子表格复制到表单提交中的另一表格 - Copy a row from one Google Sheet Spreadsheet to Another on Form Submit
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM