我有一个冻结的备份脚本,该脚本可以工作(如下),但是由于行和公式的数量过多,它会超时。该脚本用于创建仅包含整个电子表格(或某些工作表)的值(无公式)的冻结备份。我试图通过不将带有公式的表格复制到新的电子表格中来改善它,而仅复制这些表格的“冻结”副本。任何帮助/指导将不胜感激。
下面的脚本可以很好地用于没有太多行和公式的电子表格。我试图通过使用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));
}
});
}
上面的脚本超时,因为在新的(已复制的)电子表格中,用公式处理所有单元格所需的时间太长,但是不必首先复制它们。
以上脚本的工作原理:
- 创建所有工作表的副本,并通过添加以下内容来重命名 “ _temp”。
- 使用参数
contentsonly: true
重写每个“ _temp”工作表,以便公式成为值。 - 创建整个电子表格的副本。
- 从源电子表格中删除“ _temp”表。
- 从目标电子表格中删除原始工作表。
我想完成的是:
- 创建所有工作表(“ _temp”)的副本并自行重写为 摆脱公式。 (以上1和2)
- 创建一个空白电子表格(新)
- 仅将“ _temp”工作表复制到新的电子表格中(新)
- 删除源电子表格中的“ _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]);
}