目标是创建具有多个工作表的电子表格的冻结备份。备份电子表格需要复制值和格式,而不是公式。
有些工作表具有=IMPORTRANGE
,如果先复制电子表格,然后再复制相同范围内的值以再次摆脱公式,这将成为问题,因为新电子表格需要访问函数中间的导入范围(这导致A1中的#REF)。
显然已经多次问过这个问题,但是似乎没有一个答案可以解决这个问题。我已经看过这些问题(实际上还有更多):链接1,链接2,链接3,链接4,链接5和链接6。我尝试从这些问题的答案或它们的组合中实施代码片段,但无济于事。跟踪我测试过的每一段代码变得很困难。
我尝试使用copyTo()
任一forEach
功能复制整个工作表,使用选项{contentsOnly:true}
和进行复制{formatOnly:true}
,但均未成功。无论是copyTo()
希望的范围是在同一个电子表格/张或getDataRange()
不匹配的备份范围...
这是我当前正在使用的脚本,该脚本成功创建了仅包含值的整个电子表格的副本。我不记得是从哪个问题得到的。
function copyEntireSpreadsheet(){
var ss,ssName,sheet,sheetName,data,destination
ss = SpreadsheetApp.openById("id").getSheets();
ssName = SpreadsheetApp.openById("id").getName();
destination = SpreadsheetApp.create(ssName + " - " + new Date().toLocaleString());
for (var i = 0; i < ss.length; i++){
sheet = ss[i];
sheetName = sheet.getSheetName();
data = sheet.getSheetValues(1, 1, sheet.getLastRow(), sheet.getLastColumn());
destination.insertSheet(sheetName);
destination.getSheets()[i+1].getRange(1, 1, sheet.getLastRow(), sheet.getLastColumn()).setValues(data);
}
destination.deleteSheet(destination.getSheetByName('Sheet1'));
}
源电子表格具有许多合并单元格的格式,条件格式等,非常适合复制。我也可以将某些工作表硬编码到脚本中,如果这与其他方法有所不同的话。
简而言之:我正在寻找具有多张工作表的电子表格的冻结备份。值和格式需要复制,而不是公式。
在所有这些问题的答案之一中,我可能缺少某些内容,因此我将继续尝试。同时,任何帮助/指导将不胜感激。提前致谢!
解决: @Tanaike的下面第二个示例脚本是一种很好的解决方法,用于复制引用了其他电子表格的工作表,因此需要访问它们之后才能仅被值覆盖。非常感谢@Tanaike在此方面的广泛帮助-非常感谢。
The source spreadsheet has a lot of formatting with merged cells, conditional formatting, etc.
IMPORTRANGE
。用于上述目标的示例脚本的流程如下。
IMPORTRANGE
变为#REF
。因为需要在新复制的电子表格上进行授权。为了避免这种情况,将临时表复制到源电子表格中。通过上述流程,未经的授权,只能复制值IMPORTRANGE
。
function copyEntireSpreadsheet() {
var 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));
}
});
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句