首页 > 解决方案 > 当编辑的单元格更改为某个值时,谷歌脚本保护整行

问题描述

当行中的一个下拉值设置为某个值('ON HOLD')时,我一直在尝试制作一个脚本来保护一行。我最接近找到解决方案的是(使用应用程序脚本将下拉菜单更改为“锁定”时保护行)不幸的是,该解决方案不是描述性的,所以我不知道从哪里开始更改它。到目前为止,这就是我的解决方案

function onEdit(event){
var eventsheet = event.source.getActiveSheet();
var editedcell = eventsheet.getActiveCell();

var step = event.range;
var step2 = step.getRow();

Logger.log(step2);

var protectcol = 5;

if(editedcell.getColumn() == protectcol){
  if(editedcell.getDisplayValue() == 'ON HOLD'){
    var protectionrg = step2.protect();
    protectionrg.addEditor('Email@mail.com'); //Entire Row Protect
  }
 } 
}

我该怎么办?

标签: google-apps-scriptgoogle-sheets

解决方案


这是一个示例代码:

function onEdit(event){
var eventsheet = event.source.getActiveSheet();
var editedcell = event.range;

var rowRange = eventsheet.getRange("A"+editedcell.getRow()+":"+editedcell.getRow());

Logger.log(rowRange.getA1Notation());

var protectcol = 5;

  if(editedcell.getColumn() == protectcol){
    if(editedcell.getDisplayValue() == 'ON HOLD'){
      var protectionrg = rowRange.protect();
      protectionrg.addEditor('Email@mail.com'); //Entire Row Protect
      protectionrg.removeEditors(protectionrg.getEditors());
      Logger.log("PROTECTED");
    }
    else{
      //Remove protection
      var protections = eventsheet.getProtections(SpreadsheetApp.ProtectionType.RANGE);
      protections.forEach(protection => {
        var protectedRange = protection.getRange();
        if(protectedRange.getRow() == editedcell.getRow()){
          //Remove protection
          protection.remove();
        }
      });
    }
  } 
}

先决条件:

使用可安装的编辑触发器

在此处输入图像描述

所做的修改:

笔记:

removeEditors()不允许删除当前用户。如果工作表被其他用户(不是 Email@mail.com)修改并将其设置为ON HOLD. 您的简单onEdit触发器将无法在您的受保护范围内将另一个用户作为编辑者删除。作为一种解决方法,您需要使用可onEdit安装触发器来运行所有者创建的代码。

参考:无法使用脚本从受保护范围的编辑权限中删除有效用户 - 谷歌表格

  • 最后,当 columnE 中的单元格设置为 以外的任何值时,使用getProtections(type)ON HOLD获取当前工作表中的所有受保护范围,保护类型设置为。然后循环所有现有的保护。检查保护范围的行索引是否与修改单元格的行索引相同。使用remove()删除保护RANGE

推荐阅读