需要复制包含所有数据并格式化Google表格的多页电子表格

时间:2019-11-07 19:38:27

标签: google-apps-script google-sheets

我正在尝试将Google云端硬盘中的两页电子表格复制到另一个文件夹。

这是我设法束缚自己的地方;

function clearRange() {
  var sheet = SpreadsheetApp.getActive().getSheetByName('Internal copy');
  sheet.getRange('B3:B7').clearContent();
  sheet.getRange('D3:D5').clearContent();
  sheet.getRange('B12:C15').clearContent();
  sheet.getRange('B20:C23').clearContent();
  sheet.getRange('B28:C31').clearContent();
}

function copySpreadSheet() {
  var source = SpreadsheetApp.getActiveSheet();
  var sourceName = source.getSheetName();
  var sValues = source.getDataRange().getValues();
  var destination = SpreadsheetApp.openById('1Mcnlyknqmtf2u_TEhbWxwzYqlxGw39Sno2bOXgkErb4');
  source.copyTo('destination')
  var destinationSheet = destination.getSheetByName('Copy of '+sourceName)
  destinationSheet.getRange(1,1,sValues.length,sValues[0].length).setValues(sValues);

function main() {
  copySpreadSheet("Internal Estimate invoice Blundell");
}

请注意,第一位是保存后清除单元格的另一功能。这是我希望我的商店使用的报价模板,而不会弄乱报价。我希望他们输入数据,将其保存为副本,然后将字段重置为零,以备下一次引用。

任何帮助将不胜感激!

****更新********

所以,我已经使它有些工作了。这是我的新代码;


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" */
  }
}

它会在我的/ root文件夹中进行复制,这现在可以了,但是它不会复制任何公式,也不会复制受保护的范围。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

  • 您只想将未隐藏的工作表复制到新的电子表格中。
  • 您要在复制工作表时保留格式和公式。
  • 对于目标电子表格,您想隐藏sheet1的工作表。
  • 您想使用Google Apps脚本实现这一目标。

如果我的理解正确,那么这个答案如何?请认为这只是几个答案之一。在此答案中,copySheetValuesV4()被修改。

此示例脚本的流程如下。

流量:

  1. 复制源电子表格。
  2. 删除隐藏的工作表。

模式1:

在此模式中,以上流程用作简单脚本。

示例脚本:

function copySheetValuesV4() {
  var sourceSpreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var dst = sourceSpreadsheet.copy(sourceSpreadsheet.getName()+' Final');
  var sheets = dst.getSheets();
  for (var i = 0; i < sheets.length; i++) {
    if (sheets[i].isSheetHidden()) {
      dst.deleteSheet(sheets[i]);
    }
  }
  dst.getSheetByName("sheet1").hideSheet();
}

模式2:

在此模式下,使用上面的流程。并且,为了删除已删除隐藏表格的电子表格的历史记录,将临时电子表格复制为输出电子表格。然后,新的电子表格被移动到特定的文件夹。临时电子表格已移至垃圾箱。

示例脚本:

function copySheetValuesV4() {
  var folderId = "###"; // Please set the destination folder ID.

  var sourceSpreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var temp = sourceSpreadsheet.copy("temp");
  var sheets = temp.getSheets();
  for (var i = 0; i < sheets.length; i++) {
    if (sheets[i].isSheetHidden()) {
      temp.deleteSheet(sheets[i]);
    }
  }
  temp.getSheetByName("sheet1").hideSheet();
  var id = temp.copy(sourceSpreadsheet.getName()+' Final').getId();
  var file = DriveApp.getFileById(id);
  DriveApp.getFolderById(folderId).addFile(file);
  file.getParents().next().removeFile(file);
  DriveApp.getFileById(temp.getId()).setTrashed(true);
}

参考文献:

如果我误解了您的问题,而这不是您想要的方向,我深表歉意。