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

Google apps script 将工作表中的值和格式复制到新的google电子表格文档中?,google-apps-script,google-sheets,Google Apps Script,Google Sheets,我需要将谷歌电子表格上的表格复制到另一个电子表格文档 我做了研究,发现有两种方法可以做到这一点,但都有我不知道如何解决的问题 第一个方法以格式复制工作表,但它保留引用的单元格,因此我在新文档中得到了一个引用错误(#ref)。我需要一个复制格式和值(不是引用)的函数 第二个方法复制的值没有引用,但是它只复制值,没有格式 function copySheetValues() { var source = SpreadsheetApp.getActiveSheet(); var sourcen

我需要将谷歌电子表格上的表格复制到另一个电子表格文档

我做了研究,发现有两种方法可以做到这一点,但都有我不知道如何解决的问题

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

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

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

}

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

因为您似乎知道如何使用整个数据范围获取和设置值,所以只需使用其他方法获取和设置所有其他参数即可

在这种情况下,脚本编辑器autocomplete可以帮助您避免忘记一个脚本

我希望这个列表是完整的,但是写起来有点痛苦

下面的代码,如果其中一个对您没有用处,只需删除它(在两个方向(set和get)

编辑: 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结构非常容易。

我认为Serge提到的另一种尝试路线

函数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);//粘贴所有格式?,断开的引用
tempRange.offset(0,0,sourceValues.length,sourceValues[0].length)
.setValues(sourceValues);//粘贴所有值(覆盖断开的引用)
tempSheet.copyTo(目标);//现在将临时工作表复制到另一个ss
}

这是Sergei答案的变体

此脚本将复制所有可见的工作表,并将它们导出到新的电子表格中,并在文档标题后附加“Final”

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" */
  }
}
函数copySheetValuesV4(){
var sourceSpreadsheet=SpreadsheetApp.getActiveSpreadsheet();
var sourceSheets=sourceSpreadsheet.getSheets();
var destination=SpreadsheetApp.create(sourceSpreadsheet.getName()+'Final');
对于(var i=0;i
设置此参数的顺序是否重要?当我运行此函数时,会出现以下错误:找不到方法getRange(number,number,number,number)。(第32行,文件“code”)第32行是.setwrap(sWR);抱歉,我的错误…我必须创建一个新的工作表对象。现在它可以工作了,不,顺序不重要。很抱歉延迟,我正忙于另一个脚本;-)(我知道这是一个糟糕的借口;=)我添加了第二个解决方案,该解决方案也可以处理合并的单元格。我喜欢这种方法!我测试过,它可以工作,但它不会将合并的单元格复制为合并的单元格。。。。有什么好办法吗?@布赖恩:谢谢你的提醒!我确实忘记了那个帖子;-)。。。18个月,在某些方面花了很多时间+1对于你的回答,我看到合并的单元格仍然存在,除非你已经垂直合并,并且这些合并的单元格位于范围的底部边缘。如果在垂直合并的单元格下不存在其他单元格值,则不希望在这种情况下保留该值。
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
}
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" */
  }
}