如何改进冻结的备份脚本以避免超时? 发件人:收件人:参考:

我有一个冻结的备份脚本,该脚本可以工作(如下),但是由于行和公式的数量过多,它会超时。该脚本用于创建仅包含整个电子表格(或某些工作表)的值(无公式)的冻结备份。我试图通过不将带有公式的表格复制到新的电子表格中来改善它,而仅复制这些表格的“冻结”副本。任何帮助/指导将不胜感激。

下面的脚本可以很好地用于没有太多行和公式的电子表格。我试图通过使用Spreadsheetapp.create而不是.copy来修改它来创建空白电子表格,然后尝试提出如何在.forEach中使用if方法语句以识别_temp个工作表并仅对其进行复制。我已经被卡住了一段时间了,所以这个问题。

当前脚本为:

function copyEntireSpreadsheet() {
  var id = "ID"; // Please set the source Spreadsheet ID.

  var ss = Spreadsheetapp.openById(id);
  var srcsheets = ss.getSheets();
  var tempSheets = srcsheets.map(function(sheet,i) {
    var sheetName = sheet.getSheetName();
    var dstSheet = sheet.copyTo(ss).setName(sheetName + "_temp");
    var src = dstSheet.getDataRange();
    src.copyTo(src,{contentsonly: true});
    return dstSheet;
  });
  var destination = ss.copy(ss.getName() + " - " + new Date().toLocaleString());
  tempSheets.forEach(function(sheet) {ss.deleteSheet(sheet)});
  var dstSheets = destination.getSheets();
  dstSheets.forEach(function(sheet) {
    var sheetName = sheet.getSheetName();
    if (sheetName.indexOf("_temp") == -1) {
      destination.deleteSheet(sheet);
    } else {
      sheet.setName(sheetName.slice(0,-5));
    }
  });
}

上面的脚本超时,因为在新的(已复制的)电子表格中,用公式处理所有单元格所需的时间太长,但是不必首先复制它们。

以上脚本的工作原理:

  1. 创建所有工作表的副本,并通过添加以下内容来重命名 “ _temp”。
  2. 使用参数contentsonly: true重写每个“ _temp”工作表,以便公式成为值。
  3. 创建整个电子表格的副本。
  4. 从源电子表格中删除“ _temp”表。
  5. 从目标电子表格中删除原始工作表。

我想完成的是:

  1. 创建所有工作表(“ _temp”)的副本并自行重写为 摆脱公式。 (以上1和2)
  2. 创建一个空白电子表格(新)
  3. 仅将“ _temp”工作表复制到新的电子表格中(新)
  4. 删除源电子表格中的“ _temp”表格(以上4个)

如果我可以对其进行修改,以便能够确定应该复制哪些工作表,那会更好,但是所有_temp工作表的简单副本也可以完成工作。

在此先感谢您的帮助!

最终脚本

@Tanaike的回答快速而简单-效果很好!添加了.slice,以从新复制的工作表中删除“ _temp”文本。这是寻找相似脚本的任何人的最终脚本:

function copyEntireSpreadsheetTest() {
  var id = "ID"; // Please set the source Spreadsheet ID.

  var ss = Spreadsheetapp.openById(id);
  var srcsheets = ss.getSheets();
  var tempSheets = srcsheets.map(function(sheet,{contentsonly: true});
    return dstSheet;
  });

  var destination = Spreadsheetapp.create(ss.getName() + " - " + new Date().toLocaleString());
  tempSheets.forEach(function(sheet) {
    sheet.copyTo(destination).setName(sheet.getSheetName().slice(0,-5));
    ss.deleteSheet(sheet);
  });
  destination.deleteSheet(destination.getSheets()[0]);
}
sdfweg34234 回答:如何改进冻结的备份脚本以避免超时? 发件人:收件人:参考:

  • 您希望通过修改脚本来实现以下流程。

    1. 创建所有工作表(“ _temp”)的副本,然后对其进行重写以摆脱公式。 (以上1和2)
    2. 创建一个空白电子表格(新)
    3. 仅将“ _temp”工作表复制到新的电子表格中(新)
    4. 删除源电子表格中的“ _temp”表格(以上4个)

如果我的理解是正确的,那么该修改如何?

发件人:

var destination = ss.copy(ss.getName() + " - " + new Date().toLocaleString());
tempSheets.forEach(function(sheet) {ss.deleteSheet(sheet)});
var dstSheets = destination.getSheets();
dstSheets.forEach(function(sheet) {
  var sheetName = sheet.getSheetName();
  if (sheetName.indexOf("_temp") == -1) {
    destination.deleteSheet(sheet);
  } else {
    sheet.setName(sheetName.slice(0,-5));
  }
});

收件人:

var destination = SpreadsheetApp.create(ss.getName() + " - " + new Date().toLocaleString());
tempSheets.forEach(function(sheet) {
  sheet.copyTo(destination).setName(sheet.getSheetName());
  ss.deleteSheet(sheet);
});
destination.deleteSheet(destination.getSheets()[0]);

参考:

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

本文链接:https://www.f2er.com/3120828.html

大家都在问