我正在使用代码来复制其中具有多个范围保护的模板工作表,
当前,我正在运行脚本以逐个创建新选项卡。任何人都可以使用以下脚本来帮助我,以便一次完成多次复制模板的操作(例如,从“模板工作表”创建以下选项卡:A,B,C,D,E,F):
脚本
function duplicateSheetWithProtections() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
sheet = ss.getSheetByName('Template');
sheet2 = sheet.copyTo(ss).setName('A');
var protections = sheet.getProtections(SpreadsheetApp.ProtectionType.RANGE);
for (var i = 0; i < protections.length; i++) {
var p = protections[i];
var rangeNotation = p.getRange().getA1Notation();
var p2 = sheet2.getRange(rangeNotation).protect();
p2.setDescription(p.getDescription());
p2.setWarningOnly(p.isWarningOnly());
if (!p.isWarningOnly()) {
p2.removeEditors(p2.getEditors());
p2.addEditors(p.getEditors());
}
}
}
谢谢您的帮助
答案 0 :(得分:3)
此修改如何?我认为您可以使用Sheets API实现所需的功能。该示例脚本的流程如下。
使用此脚本时,请在高级Google服务和API控制台中启用Sheets API。您可以在here上了解如何启用Sheets API。
["A", "B", "C",,]
。这是您的问题。通过此流程,仅通过一个API调用就可以将模板工作表的受保护范围复制到所有复制的工作表中。
function duplicateSheetWithProtections() {
var sheetNames = ["A", "B"]; // Please set copied sheet names here.
var ss = SpreadsheetApp.getActiveSpreadsheet();
var spreadsheetId = ss.getId();
var sheet = ss.getSheetByName('Template');
// Copy template sheet.
var copiedSheetIds = sheetNames.map(function(e) {return sheet.copyTo(ss).setName(e).getSheetId()});
// Retrieve protected ranges from Template sheet.
var sheets = Sheets.Spreadsheets.get(spreadsheetId).sheets;
var templateSheet = sheets.filter(function(e) {return e.properties.title == "Template"});
var protectedRanges = templateSheet[0].protectedRanges;
// Create request body.
var resources = copiedSheetIds.map(function(e) {
return protectedRanges.map(function(f) {
var obj = JSON.parse(JSON.stringify(f));
delete obj.protectedRangeId;
if (obj.warningOnly) delete obj.editors;
obj.range.sheetId = e;
return {"addProtectedRange": {"protectedRange": obj}};
});
});
resources = Array.prototype.concat.apply([], resources);
// Set protected ranges to copied sheets
Sheets.Spreadsheets.batchUpdate({"requests": resources}, spreadsheetId);
}
如果我误解了您的问题,请告诉我。我想修改它。