首页 文章

基于Google表格中其他单元格的内容保护细胞

提问于
浏览
0

我有一个单独的工作表,其中包含用户在C&D列,第3行 - 第3行中输入的响应 . 响应是时间相关的,请查看E列第3行,看它是“锁定”还是“打开” .

使用保护,我锁定整个工作表进行编辑,但C3:D20除外 . 工作表设置为每分钟计算 .

我正在尝试编写一个脚本来检查列E,看它是否设置为锁定或打开 . 如果它设置为锁定,我想锁定(保护)该行中的列C&D,以便除了我自己以外的所有人进行编辑 . 我每隔5分钟运行一次脚本,并且我处理了for循环和if语句,但是当我去使用RemoveEditors函数时,它会做两件事:

  • 创建一个新的受保护范围(所以5分钟后我有1个额外的受保护范围,10分钟,我有2个额外的保护范围等)

  • 不会从能够编辑单元格的编辑器中删除其他编辑器 .

我尝试使用Google的示例代码,但他们的代码将当前用户添加为编辑器,这是我试图避免做的事情,因为那时编辑器可以删除代码所在的保护 .

您可以提供的任何帮助将不胜感激 .

现行守则如下:

function Lock_Cells() {
var sheet = SpreadsheetApp.getActive();
for (var i = 3; i <= 20; i++)
{
  var Check_Cell = "E" + i;
  var Temp = sheet.getRange(Check_Cell).getValue();
  if (Temp == "Locked")
  {
     var Lock_Range = "C" + (i + 2) + ":D" + "i";
     var protection = sheet.getRange(Lock_Range).protect();
     var description = "Row " + i;                 
     protection.setDescription(description);
     var eds = protection.getEditors();
     protection.removeEditors(eds);
  }
}  
}

1 回答

  • 0

    要避免创建一组新的受保护范围,可以添加逻辑以检查哪些行已被锁定 . 有了这些信息,您只需要跳过这些行:

    注意:这一行有一个错误: var Lock_Range = "C" + (i + 2) + ":D" + "i"; 变量我不应该引用 .

    function Lock_Cells() {
    var sheet = SpreadsheetApp.getActive();
    var rows = get_protected_Rows();
    
    for (var i =3; i <= 20; i++)
    {
      var Check_Cell = "E" + i;
      var cell = sheet.getRange(Check_Cell);
      var Temp = sheet.getRange(Check_Cell).getValue();
      if (Temp == "Locked" &&  rows.indexOf(i) <0)
      {
          var Lock_Range = "C" + i + ":D" + i; //In this line you put "i" 
      .....
    ...
    }
    function get_protected_Rows()
    {
      var ss = SpreadsheetApp.getActive();
      var protections = ss.getProtections(SpreadsheetApp.ProtectionType.RANGE);
      var rows = [];
      for (var i = 0; i < protections.length; i++) {
       var protection = protections[i];
       var anotation =   protection.getRange().getRow();
       rows.push(anotation);
      }
    
      return rows
    }
    

    您是对的,当其中一个用户执行代码时,该保护使该用户能够编辑这些行 . 我建议您作为文件的所有者,运行任务以从这些行中删除所有其他编辑器 . 该功能与之前的功能非常相似 . 我知道这不是最好的,但它可以帮助您处理您的用例 .

    function remove_editors()
    {
      var ss = SpreadsheetApp.getActive();
      var protections = ss.getProtections(SpreadsheetApp.ProtectionType.RANGE);
      for (var i = 0; i < protections.length; i++) {
       var protection = protections[i];
       var anotation =   protection.getRange().getA1Notation();
          var eds = protection.getEditors();
          protection.removeEditors(eds);
       }      
    }
    

    通过这样做,我能够限制其他用户的权限 . 希望能帮助到你 .

相关问题