我正在为老师创建工作簿,以监控学生在特定技能上的进步。我们有一本带有各种模板的工作簿,他们可能需要复制每个孩子所需的图纸/图形。这些表受到保护,除了教师需要输入单元格以输入学生数据外。现在,当我们使用“复制到新电子表格”时,我们将失去这些保护。 (我们的大多数K-2老师都不具备足够的技术知识,无法完全访问带有图形的表格。)必须有一种方法可以创建某种类型的保护,该保护可以传递给复制的文件,并且非常安全。感谢任何知道如何执行此操作的人。
我尝试使用此代码,但确实复制了我的工作表并对其进行了保护,但是当COPY TO用于另一个现有工作簿时,如何使其保持受保护的状态?
function duplicateProtectedSheet() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
sheet = ss.getSheetByName("B - General Info");
sheet2 = sheet.copyTo(ss).setName("My Copy1");
var p = sheet.getProtections(SpreadsheetApp.ProtectionType.SHEET)[0];
var p2 = sheet2.protect();
p2.setDescription(p.getDescription());
p2.setWarningOnly(p.isWarningOnly());
if (!p.isWarningOnly()) {
p2.removeEditors(p2.getEditors());
p2.addEditors(p.getEditors());
// p2.setDomainEdit(p.canDomainEdit()); // only if using an Apps domain
}
var ranges = p.getUnprotectedRanges();
var newRanges = [];
for (var i = 0; i < ranges.length; i++) {
newRanges.push(sheet2.getRange(ranges[i].getA1Notation()));
}
p2.setUnprotectedRanges(newRanges);
}
这是我当前工作簿的一个示例,教师将模板复制到自己的工作簿中。 https://docs.google.com/spreadsheets/d/1JB95bdu4Qatx7uMZrQFP7GkiKBuuB47PCV8ZjyQWmHo/edit?usp=sharing
答案 0 :(得分:0)
尝试一下:
function test(){
var ss = SpreadsheetApp.getActiveSheet();
var protections = ss.getProtections(SpreadsheetApp.ProtectionType.RANGE);
var newSheet = ss.copyTo(SpreadsheetApp.getActive());
var prot;
var p;
var editors;
for (var i = 0; i < protections.length; i++){
prot = protections[i];
p = newSheet.getRange(prot.getRange().getA1Notation()).protect();
p.setDescription(prot.getDescription());
editors = prot.getEditors();
for (var j = 0; j < editors.length; j++){
p.addEditor(editors[i]);
}
}
}
此代码将复制工作表并存储原始保护,然后在新创建的工作表中设置相同的保护。对您来说,只需将ss
和newSheet
设置为您要使用的内容即可。