【发布时间】:2020-10-22 10:48:13
【问题描述】:
目标是创建包含多个工作表的电子表格的冻结备份。备份电子表格需要复制值和格式,而不是公式。
有些工作表有=IMPORTRANGE,如果先复制电子表格,然后将值复制到同一范围内,这将成为一个问题,再次摆脱公式,因为新电子表格需要访问导入的范围在函数的中间(导致 A1 中的#REF)。
这个问题显然被问了很多次,但似乎没有一个答案能解决这个问题。我看过这些问题(实际上还有更多问题):Link 1、Link 2、Link 3、Link 4、Link 5 和 Link 6。我尝试从这些问题的答案或它们的组合中实施 sn-ps 无济于事。跟踪我测试的每一点 sn-p 变得很困难。
我尝试使用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 对此提供的广泛帮助——非常感谢。
【问题讨论】:
标签: google-apps-script google-sheets