【问题标题】:Protect spreadsheet then unprotect specific cells and ranges with script保护电子表格,然后使用脚本取消保护特定单元格和范围
【发布时间】:2021-05-13 15:15:53
【问题描述】:

我拥有一个电子表格,我拥有 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 行)

提前感谢您的帮助!

【问题讨论】:

  • 你试过你的代码了吗?有用吗?
  • @Rubén 不,我刚刚从 stackoverflow 中挑选了这些信息
  • 如果您不熟悉编程、JavaScript 或 Google Apps 脚本,我认为您应该提及这一点,并且您从该站点选择了代码或想法(包括源链接)并询问是否运行它是安全的,否则您应该在发布问题之前测试代码 How to Ask 建议显示尝试过的内容并添加对已完成搜索工作的简要描述。附言如果您不熟悉使用 Google Apps 脚本扩展 Google 表格,请阅读developers.google.com/apps-script/guides/sheets
  • @Rubén 谢谢你的建议认为你可以从我所有的问题中看出我是初学者
  • 请按照How to Ask 中的建议,展示您尝试过的内容并简要说明您的搜索工作。

标签: google-apps-script google-sheets


【解决方案1】:

如果我正确理解了您的帖子,那么您的目标是:

  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
  });
}

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

结果:

样本表

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

其他单元格被锁定

解锁的范围单元格是可编辑的

【讨论】:

  • 工作非常酷,正是我想要的,非常感谢!
  • 可以忽略几张吗?
  • 是的,您可以在 main 方法上实现 if 语句来检查是否要跳过某个工作表名称。我在我的示例脚本上添加了评论。
  • 有了这个我可以跳过一个,但我怎样才能跳过更多?我尝试了这些:“List,List2”或这些“List”,“List2”,但它不起作用
  • 我明白了,我已经用一个数组更新了我的主函数示例脚本,您可以在其中放置要忽略的工作表的名称。
猜你喜欢
  • 2022-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多