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

时间:2014-08-03 16:13:49

标签: google-apps-script google-sheets

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

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

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

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

   sheet.copyTo(destination);
}

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

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

}

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

3 个答案:

答案 0 :(得分:9)

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

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

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

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

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

编辑:

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

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
}

在两个脚本中,请确保目标工作表名称不存在。我没有处理这种情况,尽管使用try / catch结构非常容易。

答案 1 :(得分:3)

另一种尝试的方法,我认为Serge暗指here

function myFunction() {
  var source = SpreadsheetApp.openById('SOURCE_ID');
  var sourceSheet = source.getSheetByName('Sheet1');
  var sourceRange = sourceSheet.getDataRange();
  var sourceValues = sourceRange.getValues();

  var tempSheet = source.getSheetByName('temp');
  var tempRange = tempSheet.getRange('A1');

  var destination = SpreadsheetApp.openById('DEST_ID');

  sourceRange.copyTo(tempRange);  // paste all formats?, broken references
  tempRange.offset(0, 0, sourceValues.length, sourceValues[0].length)
  .setValues(sourceValues);  // paste all values (over broken refs)

  tempSheet.copyTo(destination);  // now copy temp sheet to another ss
}

答案 2 :(得分:0)

这是谢尔盖答案的变体。

此脚本将复制所有可见的工作表,并将其导出到新的电子表格中,其中包含"最终"附在文件标题上。

function copySheetValuesV4(){
  var sourceSpreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var sourceSheets = sourceSpreadsheet.getSheets();
  var destination = SpreadsheetApp.create(sourceSpreadsheet.getName()+' Final');
    for (var i = 0; i < sourceSheets.length; i++){
      var sourceSheet = sourceSheets[i];
      if (!sourceSheet.isSheetHidden()) {
        var sourceSheetName = sourceSheet.getSheetName();
        var sValues = sourceSheet.getDataRange().getValues();
        sourceSheet.copyTo(destination)
        var destinationSheet = destination.getSheetByName('Copy of '+sourceSheetName).setName(sourceSheetName);
        destinationSheet.getRange(1,1,sValues.length,sValues[0].length).setValues(sValues);// overwrite all formulas that the copyTo preserved */

      }
    destination.getSheetByName("sheet1").hideSheet() // Remove the default "sheet1" */
  }
}