将工作表中的值和格式复制到新的Google电子表格文档中?

use*_*814 6 google-sheets google-apps-script

我需要将Google SpreadSheet上的工作表复制到另一个SpreadSheet文档.

我已经完成了我的研究,我找到了两种方法来做到这一点,但是两者都存在我不知道如何修复的问题.

第一种方法使用格式复制工作表,但它保留了引用的单元格,因此我在新文档(#ref)中得到引用错误.我需要一个复制格式和值(不是引用)的函数.

function copySheet() {
   var source = SpreadsheetApp.getActiveSpreadsheet();
   var sheet = source.getSheets()[0];
   var destination = SpreadsheetApp.openById("15ucPbZrIYXZAOCYVdpK6OA0oyQT1NcsmuiJmDRfdpHQ");

   sheet.copyTo(destination);
}
Run Code Online (Sandbox Code Playgroud)

第二种方法复制没有引用的值,但它只复制值,没有格式.

function copySheetValues()
{
  var source = SpreadsheetApp.getActiveSheet();
  var sourcename = source.getSheetName();
  var sourceDataRange = source.getDataRange();
  var sourceSheetValues = sourceDataRange.getValues();
  var sourceRows = sourceDataRange.getNumRows();
  var sourceColumns = sourceDataRange.getNumColumns();

  var destination = SpreadsheetApp.openById('15ucPbZrIYXZAOCYVdpK6OA0oyQT1NcsmuiJmDRfdpHQ');
  destination.insertSheet(sourcename, 0);
  destination.getDataRange().offset(0, 0, sourceRows, sourceColumns).setValues(sourceSheetValues);

}
Run Code Online (Sandbox Code Playgroud)

如何编写保留格式并复制值的函数?

Ser*_*sas 12

由于您似乎知道如何使用整个数据范围获取和设置值,因此只需使用其他方法来获取和设置所有其他参数.

在这种情况下,脚本编辑器自动完成是一个很好的帮助,尽量不要忘记一个!

我希望列表完整,尽管写起来有点痛苦!

下面的代码,如果其中一个对你没用,只需将其删除(在两个方向(设置和获取)).

function copySheetValues(){
  var source = SpreadsheetApp.getActiveSheet();
  var sourcename = source.getSheetName();
  var sValues = source.getDataRange().getValues();
  var sBG = source.getDataRange().getBackgrounds();
  var sFC = source.getDataRange().getFontColors();
  var sFF = source.getDataRange().getFontFamilies();
  var sFL = source.getDataRange().getFontLines();
  var sFFa = source.getDataRange().getFontFamilies();
  var sFSz = source.getDataRange().getFontSizes();
  var sFSt = source.getDataRange().getFontStyles();
  var sFW = source.getDataRange().getFontWeights();
  var sHA = source.getDataRange().getHorizontalAlignments();
  var sVA = source.getDataRange().getVerticalAlignments();
  var sNF = source.getDataRange().getNumberFormats();
  var sWR = source.getDataRange().getWraps();

  var destination = SpreadsheetApp.openById('15ucPbZrIYXZAOCYVdpK6OA0oyQT1NcsmuiJmDRfdpHQ');
  var destinationSheet = destination.insertSheet(sourcename, 0);
  destinationSheet.getRange(1,1,sValues.length,sValues[0].length).setValues(sValues)
  .setBackgrounds(sBG)
  .setFontColors(sFC)
  .setFontFamilies(sFF)
  .setFontLines(sFL)
  .setFontFamilies(sFFa)
  .setFontSizes(sFSz)
  .setFontStyles(sFSt)
  .setFontWeights(sFW)
  .setHorizontalAlignments(sHA)
  .setVerticalAlignments(sVA)
  .setNumberFormats(sNF)
  .setWraps(sWR);
}
Run Code Online (Sandbox Code Playgroud)

编辑:

布莱恩的回答和你的评论使我想到了另一个解决方案,更简单,也处理合并的单元格.这是代码:

function copySheetValuesV2(){
  var source = SpreadsheetApp.getActiveSheet();
  var sourceName = source.getSheetName();
  var sValues = source.getDataRange().getValues();
  var destination = SpreadsheetApp.openById('15ucPbZrIYXZAOCYVdpK6OA0oyQT1NcsmuiJmDRfdpHQ');
  source.copyTo(destination)
  var destinationSheet = destination.getSheetByName('Copy of '+sourceName)
  destinationSheet.getRange(1,1,sValues.length,sValues[0].length).setValues(sValues);// overwrite all formulas that the copyTo preserved
}
Run Code Online (Sandbox Code Playgroud)

在这两个脚本是确保目标表名称存在.我没有处理这种情况,尽管使用try/catch结构很容易.