保护电子表格,然后使用脚本取消保护特定单元格和范围

时间:2021-05-13 15:15:53

标签: google-apps-script google-sheets

我拥有一个电子表格,我有 10 个拥有编辑权限的用户 由于有很多单元格需要解锁或锁定,最好先锁定所有内容 并解锁他们可以安全使用而不会意外错误地编辑公式的那些

现在我只是在猜测最好的解决方案是什么 我想避免用户被删除

如果这很重要,那么没有人在一个组中

这些是编辑可以编辑的

['B3:U27', 'W3:AP27', 'E29:E31', 'I29:I31', 'M29:M31', 'Q29:Q31', 'U29:U31', 'Z29:Z31', 'AD29:AD31', 'AH29:AH31', 'AL29:AL31', 'AP29:AP31', 'B29', 'F29', 'J29', 'N29', 'R29', 'W29', 'AA29', 'AE29', 'AI29', 'AM29', 'C29', 'G29', 'K29', 'O29', 'S29', 'X29', 'AB29', 'AF29', 'AJ29', 'AN29', 'D29', 'H29', 'L29', 'P29', 'T29', 'Y29', 'AC29', 'AG29', 'AK29', 'AO29', 'B31', 'F31', 'J31', 'N31', 'R31', 'W31', 'AA31', 'AE31', 'AI31', 'AM31', 'C31', 'G31', 'K31', 'O31', 'S31', 'X31', 'AB31', 'AF31', 'AJ31', 'AN31', 'D31', 'H31', 'L31', 'P31', 'T31', 'Y31', 'AC31', 'AG31', 'AK31', 'AO31', 'B33:C33', 'F33:G33', 'J33:K33', 'N33:O33', 'R33:S33', 'W33:X33', 'AA33:AB33', 'AE33:AF33', 'AI33:AJ33', 'AM33:AN33' ,'D33:E33', 'H33:I33', 'L33:M33', 'P33:Q33', 'T33:U33', 'Y33:Z33', 'AC33:AD33', 'AG33:AH33', 'AK33:AL33', 'AO33:AP33'];

其他一切都可以锁定

  1. 每天会创建 1 或 2 个额外的工作表吗?从现在开始这是否适用于所有工作表?

  2. 已经有几张手动保护(没有脚本)的工作表重要吗?

  3. 用户会收到通知 还是这一切只是在后台发生?

更新:

我找到了保护页面和解锁范围的正确脚本 并且完美运行

link

function testProtect() {
var sheet = SpreadsheetApp.getActiveSheet();
var protection = sheet.protect().setDescription('Sample protected sheet');
var unprotected = sheet.getRange('B3:I27');
protection.setUnprotectedRanges([unprotected]);

var me = Session.getEffectiveUser();
protection.addEditor(me);
protection.removeEditors(protection.getEditors());
if (protection.canDomainEdit()) {
  protection.setDomainEdit(false);

}
    }

但是有两件事我想不通 如何将其应用于所有工作表并添加更多单元格和范围? 因为如果我添加另一个范围它会出错

var unprotected = sheet.getRange('B3:I27','F29:I29');

异常:B3:I27 无法转换为 int 类型(“代码”文件中的第 4 行)

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

如果我正确理解您的帖子,这就是您的目标:

  1. 创建一个脚本来锁定您的工作表,并且只允许具有编辑权限的用户可以编辑特定范围。
  2. 将该脚本应用于电子表格文件中的所有工作表。

推荐的解决方案:

您可以参考下面的示例脚本,它会锁定您的工作表并仅解锁您设置的特定范围。

示例脚本

[更新]

function main(){ //Main function to run
  var sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets();
  var disregard = ["Sheet3","Sheet4","Sheet5"]; //ADD SHEET NAMES HERE THAT YOU WANT TO BE DISREGARDED

  for(var x=0; x<sheets.length; x++){
    if(disregard.some(data => sheets[x].getName().includes(data))){ 
      //E.g. Disregard any sheet names added on the "disregard" array
    }else{
      unlockCertainRanges(sheets[x]);
    }
  }
}

function unlockCertainRanges(currentSheet){ //Function to unlock certain ranges on your spreadshseet
  var sheet = currentSheet;
  // Remove all range protections in the spreadsheet
  var protections = sheet.getProtections(SpreadsheetApp.ProtectionType.RANGE);
  for (var i = 0; i < protections.length; i++) {
    var protection = protections[i];
    protection.remove();
  }

  var protection = sheet.protect();
  //restrict editors to owner
  protection.getRange().getA1Notation();
  var eds = protection.getEditors();
  protection.removeEditors(eds);

  //set unprotected ranges
  var ranges = protection.getUnprotectedRanges();
  var data = ["A1:A5","B6:B10","C11:C15"]; // ADD YOUR RANGES HERE
  data.forEach(res => { //LOOPS INTO EVERY ARRAY CONTAINING SPECIFIC RANGES
    ranges.push(sheet.getRange(res));
    protection.setUnprotectedRanges(ranges); //REMOVES THE PROTECTION ON THE RANGE
  });
}

注意: 借用了一段脚本来解锁 How to protect a sheet then unprotect specific cells 中的特定范围作为参考。

结果:

样品表

所有单元格都被锁定,除了范围 "A1:A5","B6:B10" & "C11:C15"(包含“解锁”字以提高可见性)

enter image description here

其他单元格被锁定 enter image description here

解锁的范围单元格是可编辑的 enter image description here