在 Apps 脚本中,整个工作表或范围(包括公式、值、合并、格式设置等)是否有 getter?

Is there a getter for an entire worksheet or range including formulas, values, merges, formatting etc. in Apps Script?

我正在尝试备份整个作品sheet,包括公式、值、格式、行和列大小、单元格合并等,这样当用户完成编辑时我可以重置 sheet。目前我正在使用 Range.getFormulas() 创建一个字符串化对象(然后我可以将其作为常量粘贴到我的代码中)以重置单元格的所有内容,但是如果用户更改行大小或删除一个单元格,我希望能够快速重建整个 sheet 而无需遍历行和列(Apps 脚本对此来说太慢了)。我以前的方法是创建 sheet 的副本并简单地隐藏它,但仍然有人可以取消隐藏和编辑它。

我一直在研究文档,但没有找到任何有用的信息。总而言之,我想要这样的东西:

function resetHandler() {
    var destinationWorksheet = SpreadsheetApp.getActiveSpreadsheet().getRange("A1:H132"),
        backupWorksheet = [...object...];
    backupWorksheet.copyTo(destinationWorksheet);
}

其中“[...object...]”是 getter 的输出,其中包含整个 sheet 作为对象。我试过 JSON.stringify(SpreadsheetApp.getActive().getSpreadSheetByName("Workorder").getRange("A1:H132")) 但它只输出“{}”,因为 Range class 都是私有的。

如果没有办法,我总是可以求助于隐藏备份 sheet。

没有通过名称检索传播sheet 的 Apps 脚本方法,您需要通过 id 或 url

检索它
  • 请注意,在 Google 驱动器中,一个文件夹中可以存在多个具有相同名称的传播sheet,这就是尝试检索传播没有任何意义的原因sheet 名字
  • 相反,您需要使用方法 openById(id)openByUrl(url) (不太推荐)
  • 要从外部传播sheet获取sheet并将其复制到当前传播,您可以执行以下操作:
function resetHandler() {
    var destinationWorksheet = SpreadsheetApp.getActiveSpreadsheet();
    backupWorksheet = SpreadsheetApp.openById("123456789").getSheetByName("The Name of the Sheet");
    backupWorksheet.copyTo(destinationWorksheet);
}

其中 123456789 是备份传播的 IDsheet,您可以在地址栏的 url 中找到它,看起来像 https://docs.google.com/spreadsheets/d/1234456789/edit#gid=1392862199

  • 将范围从 sheet 从外部价差 sheet 复制到当前价差 sheet 中的 sheet 和 copyTo 是不可能的, 您只能使用 getValues() and setValues respectively, however this will not copy the formatting. Also for the formulas, you need to perform additoinally getFormulas() and setFormulas(formulas).

更新

如果您想将范围从一个 sheet 复制到另一个 sheet 的相同点差sheet,您可以按如下方式修改代码:

function resetHandler() {
  var activeSpreadsheet = SpreadsheetApp.getActive();
  var destinationSheet = activeSpreadsheet.getSpreadSheetByName("Workorder");
  var destinationRange = destinationSheet.getRange("A1:H132");
  var backupWorksheet = activeSpreadsheet.getSpreadSheetByName("Backup").getRange("A1:H132");
  var backupRange = backupWorksheet.getRange("A1:H132");
  backupRange.copyTo(destinationRange);
}
  • 您的代码的主要问题是您混淆了方法 copyTo(destination) for ranges with copyTo(spreadsheet)
  • 两种方法名称相同,但第一种方法将一个范围复制到另一个范围(复制到同一个 sheet 或另一个 sheet 的相同范围 sheet;覆盖之前的内容),而另一个将整个(附加的)sheet 从 spreadsheet 插入到相同或不同的 spreadsheet
  • 仔细查看文档中的示例,以便在每种情况下应用正确的语法
  • 另外:方法getSpreadSheetByName()不存在,是getSheetByName()
  • 注意措辞:Google 谈论 sheets 和 spreadsheets,它们等同于 Excel worksheets 和分别是工作簿。

描述

我创建了一个示例,其中 sheet 具有公式、条件格式和数据验证。使用 testCopyTo,我将 Sheet1 复制到 Backup spreadsheet。复制所有属性。使用 testCopyFrom 首先从备份 spreadsheet 复制,然后复制 spreadsheet 范围内的范围,最后删除备份 sheet.

的副本

还原前

恢复后

脚本

function testCopyTo() {
  try {
    let source = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1");
    let dest = SpreadsheetApp.openById("xxxx.......");
    source.copyTo(dest);
  }
  catch(err) {
    console.log(err);
  }
}

function testCopyFrom() {
  try {
    let dest = SpreadsheetApp.getActiveSpreadsheet();
    let source = SpreadsheetApp.openById("xxxx.......").getSheetByName("Copy of Sheet1");
    source.copyTo(dest);
    source = dest.getSheetByName("Copy of Copy of Sheet1");
    dest = dest.getSheetByName("Sheet1");
    source.getDataRange().copyTo(dest.getRange(dest.getLastRow()+1,1));
    SpreadsheetApp.getActiveSpreadsheet().deleteSheet(source);
  }
  catch(err) {
    console.log(err);
  }
}