通过更改满足条件时保护 Sheet (Google Sheet)

Protect Sheet when condition is met by change (Google Sheet)

有一个案例是对某个学生进行了测试。学生只能在给定时间之前使用测试答案。

示例案例如下: https://docs.google.com/spreadsheets/d/1xS3SMrSh2vHCb-ShP96IzzKQGRXYK7ACKO0Ua4_OHOY/edit?usp=sharing

  1. Sheet1!A:A 是给出问题的地方
  2. Sheet1!B:B 是学生必须填写答案的地方
  3. Sheet2!A1 是保护或取消保护 Sheet1 的条件。当日期在 15 号之后,此单元格变为 1,否则保持为 0。此单元格自动更改,因为它包含 TODAY() 公式。
  4. 当 Sheet2!A1 变为 1 时,Sheet1!A:B 需要被保护以防止任何人编辑,除非文件的所有者

是否可以在满足条件时自动保护 sheet 或范围(示例中为 Sheet1!A:B)?

例如,如果 Sheet2 中的单元格 A1 为 0,则 Sheet1 将受到保护,不会被任何人(不包括我)编辑。如果Sheet2的A1单元格不为0,则Sheet1不再被锁定

有什么公式或google sheet脚本可以解决这个问题吗?

您实际上可以使用 Apps 脚本的 Time Driven TriggerSheet 上实现它。时间驱动触发器在特定时间执行。在您的情况下,您必须使用 Month timer 作为 Type of time based trigger月计时器 具有 day of monthtime of day 属性,您可以设置这些属性以确定脚本将 运行.

示例:

按照以下步骤操作:

  1. 将下面的代码复制并粘贴到您的代码编辑器中并保存。
function testFunc(){
    var e = {
    'day-of-month':16
    }
    lockUnlockSheet(e)
}


function lockUnlockSheet(e) {
    var sheet1 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet1');
    if (e['day-of-month'] >= 16) {
    var protection = sheet1.protect().setDescription("Protect Sheet1");
    var me = Session.getEffectiveUser();
    protection.addEditor(me);
    protection.removeEditors(protection.getEditors());
    if (protection.canDomainEdit()) {
        protection.setDomainEdit(false);
    }
    } else {
    sheet1.protect().remove();
    }
}
  1. 粘贴代码后,单击保存
  2. 转到编辑器中的触发器 选项卡(位于编辑器的左侧,带有闹钟符号)
  3. 单击添加触发器
  4. 复制下面触发器的配置(您应该生成了 2 个触发器)

它应该是这样的:

一切就绪。但是为了测试函数,我们需要另一个函数的帮助来模仿 Trigger 的行为。这是我们使用 testFunc().

的地方

在您的编辑器中单击 Debug 按钮旁边的下拉菜单并将其更改为 testFunc 然后单击 运行.

如果将day-of-month的值设置为16-31,则会锁定Sheet1.

如果您将其更改为 1 - 15,它将解锁。

注意:可安装的触发器始终 运行 在创建者的帐户下。 getEffectiveUser()永远是你。


更新:使用 onEdit 触发器

代码:

function onEditLock(e) {
  var range = e.range;
  var sheet = range.getSheet();
  var sheet1 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet1');
  if (range.getA1Notation() == "A1" && sheet.getName() == "Sheet2") {
    if (e.value == 1) {
      var protection = sheet1.protect().setDescription("Protect Sheet1");
      var me = Session.getEffectiveUser();
      protection.addEditor(me);
      protection.removeEditors(protection.getEditors());
      if (protection.canDomainEdit()) {
        protection.setDomainEdit(false);
      }
    } else if(e.value == 0) {
      sheet1.protect().remove();
    }
  }
}

触发器设置:

输出:

注意:当用户更改电子表格中的值时 onEdit() 仅 运行s。

参考文献: