google-apps-script - 在保留受保护范围的同时制作电子表格副本
问题描述
我希望这不会让我丢分,但我一直在到处寻找,但找不到答案:
- 我有一个带有受保护范围的电子表格。
- 我制作了电子表格的副本。
- 受保护的范围在副本中消失了。
有没有办法将受保护的范围保留在新副本中?
如果不可能,也许使用
var protection = spreadsheet.getRange('D1:G9').protect();
在新副本上?
但是后来我不知道如何将它分配给新副本,因为脚本将在原始电子表格中,并且电子表格的副本在创建之前没有 ID ...
解决方案
- 当将一张电子表格复制到其他电子表格时,您还希望复制受保护的范围。
a spreadsheet
ofMake a copy of a spreadsheet while keeping protected ranges
表示电子表格中的工作表。
复制电子表格时,也会复制受保护的范围。所以我像上面一样理解。如果我的理解是正确的,这个答案怎么样?请认为这只是几个答案之一。
问题:
不幸的是,在当前阶段,当使用copyTo()
Class Sheet 和 Sheets API 的 copyTo 方法将工作表复制到电子表格时,不会复制受保护的范围。这种情况与手动复制相同。
解决方法:
为了复制受保护的范围,需要将受保护的范围复制到复制的工作表中。但是当电子表格服务用于这种情况时,脚本变得有点复杂。所以在这个答案中,作为一种解决方法,我使用了 Sheets API。在这种情况下,get 方法检索到的对象与batchRequest 方法的请求体几乎相同。所以我用了这个。
示例脚本:
在使用此脚本之前,请在 Advanced Google Services 中启用 Sheets API。另外,请设置srcId
,srcSheetName
和的变量dstId
。
var srcId = "###"; // Please set source Spreadsheet ID.
var srcSheetName = "###"; // Please set source sheet name you want to copy.
var dstId = "###"; // Please set destination Spreadsheet ID.
var src = SpreadsheetApp.openById(srcId);
var dst = SpreadsheetApp.openById(dstId);
var sheetId = src.getSheetByName(srcSheetName).copyTo(dst).getSheetId();
var protectedRanges = Sheets.Spreadsheets.get(srcId, {ranges: [srcSheetName], fields: "sheets/protectedRanges"});
var requests = protectedRanges.sheets[0].protectedRanges.map(function(e) {
e.range.sheetId = sheetId;
return {addProtectedRange: {protectedRange: e}};
});
Sheets.Spreadsheets.batchUpdate({requests: requests}, dstId);
参考:
如果我误解了您的问题并且此解决方法不是您想要的方向,我深表歉意。
推荐阅读
- android - 在我的应用程序中使用自动完成地址搜索谷歌地图的功能
- python - 标签文本没有改变 Kivi Python
- maven - Maven JavaDoc 插件给出警告而不是错误
- javascript - 获取服务器设置的客户端 cookie
- php - 用于各种 vhost 配置的通用 docker 映像
- c++ - 在 Windows 中加速 printf 和 cout
- excel - 删除空白行的问题
- java - 更改 disableProperty() 函数的颜色/如何禁用单击舞台
- excel - 在 Excel 的 VLOOKUP 函数中使用 MATCH 函数作为范围
- xcode - 如何在不改变操作系统主题的情况下使 Xcode 10 变暗?