繁体   English   中英

谷歌表。 锁定范围

[英]Google sheets. Lock range

我有 2 个范围为 C2:F21 的列表,应该可以在特定时期内为所有用户填写。

从 01.01.2020 到 05.01.2020,列表 A 中的范围 C2:F21 不应该被锁定,但在其他时间它应该对除我之外的所有用户锁定。

在列表 B 中,C2:F21 不应仅从 01.02.2020 到 05.02.2020 锁定。

我将不胜感激任何答案

处理此问题的最“安全”方法是在到期日期将数据实际保存为单独的电子表格(只有您有权编辑),您也可以使用脚本自动执行此操作。 然后,如果您需要用户在主表中查看它,您可以使用一系列importrange函数来创建只读信息列表。 电子表格的任何编辑者都有能力(也许不是知识)以各种创造性的方式绕过您的细胞保护。

如果你仍然坚持使用单元保护来完成这个很简单,使用Protection类并使用脚本编辑器中的小时钟向项目添加触发器,选择事件源Time-driven和基于时间的触发器Specific date and time .

首先,您需要保护范围,您可以通过 Web UI 通过选择要保护的范围、右键单击并选择Protect range轻松完成此操作。 您也可以通过 Apps Script 执行此操作,方法是运行如下函数:

function protectRangeA() {
  var ss = SpreadsheetApp.openById("your-spreadsheet-id"); // Change accordingly
  var sheetA = ss.getSheetByName("your-sheet-name"); // Change accordingly
  var protection = sheetA.getRange("C2:F21").protect();
  var me = Session.getEffectiveUser();
  protection.addEditor(me);
  protection.removeEditors(protection.getEditors());
  if (protection.canDomainEdit()) {
    protection.setDomainEdit(false);
  }
}

此函数从具有特定 ID 的电子表格中获取具有特定名称的工作表(正如其他人在我之前所说,出于安全原因 - 避免人们弄乱您的脚本 - 如果它是一个独立的脚本会更好,而不是绑定到您的电子表格),并使用Protect()保护范围C2:F21 ,您将是唯一的编辑器。

其次,您想在某个日期取消保护此范围,并在另一个日期再次保护它。 为此,您可以创建时间驱动触发器 例如,您可以使用atDate 触发器,它将在您指定的年、月和日运行您指定的函数。 因此,如果您想取消保护01.01.2020的范围,例如,您可以使用以下功能:

function createUnprotectTriggerA() {
  ScriptApp.newTrigger("unprotectRangeA")
  .timeBased()
  .atDate(2020, 1, 1)
  .create();
}

这将触发一个调用的函数unprotectRangeA接近午夜01.01.2020 (+/- 15分钟)。 此时将运行的函数应该取消对所需范围的保护。 它可能是以下几行:

function unprotectRangeA() {
  var ss = SpreadsheetApp.openById("your-spreadsheet-id"); // Change accordingly
  var sheetA = ss.getSheetByName("your-sheet-name"); // Change accordingly
  var protections = sheetA.getProtections(SpreadsheetApp.ProtectionType.RANGE);
  for (var i = 0; i < protections.length; i++) {
    var protection = protections[i];
    if (protection.canEdit()) {
      protection.remove();
    }
  }
}

此函数使用getProtections获取工作表中存在的所有范围保护,并在检查当前用户是否可以通过canEdit()对其进行编辑之前,使用remove()删除这些保护。

为了在05.01.2020再次保护它,使用这个触发器,它会在这个日期触发函数protectRangeA (之前定义的):

function createProtectTriggerA() {
  ScriptApp.newTrigger("protectRangeA")
  .timeBased()
  .atDate(2020, 1, 5)
  .create();
}

最后,因为您想要保护/取消保护多个范围并且您需要多个触发器,所以您可以调用在同一函数中创建触发器的所有函数,您必须运行一次以设置您需要的所有触发器(我没有) t 定义createProtectTriggerBcreateUnprotectTriggerB但它与其他范围相同):

function createTriggers() {
  createProtectTriggerA();
  createUnprotectTriggerA();
  createProtectTriggerB();
  createUnprotectTriggerB();
}

请注意,正如 CodeCamper 所说,如果用户有权编辑电子表格,他们可能会使用脚本来破坏您的保护。 因此,根据编辑此内容的人员,也许您应该拥有一份只有您可以访问的电子表格副本。

我希望这有任何帮助。

暂无
暂无

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

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