繁体   English   中英

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

[英]Protect spreadsheet then unprotect specific cells and ranges with script

我有一个我拥有的电子表格,我有 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. 用户会收到通知,还是这一切都只是在后台发生?

更新:

我找到了正确的脚本来保护页面并解锁范围,并且效果很好

关联

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. 创建一个脚本来锁定您的工作表,并且只允许具有编辑权限的用户可以编辑特定范围。
  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
  });
}

注意:借用一段脚本来解锁如何保护工作表中的特定范围,然后取消保护特定单元格作为参考。

结果:

样品表

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

在此处输入图像描述

其他单元格被锁定在此处输入图像描述

解锁范围单元格是可编辑的在此处输入图像描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM