寻找一个脚本来在复制时在工作表上保存保护

时间:2019-09-08 04:15:19

标签: google-apps-script google-sheets

我正在为老师创建工作簿,以监控学生在特定技能上的进步。我们有一本带有各种模板的工作簿,他们可能需要复制每个孩子所需的图纸/图形。这些表受到保护,除了教师需要输入单元格以输入学生数据外。现在,当我们使用“复制到新电子表格”时,我们将失去这些保护。 (我们的大多数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

1 个答案:

答案 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]);
    }
  }
}

此代码将复制工作表并存储原始保护,然后在新创建的工作表中设置相同的保护。对您来说,只需将ssnewSheet设置为您要使用的内容即可。