谷歌表格.锁定范围



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

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

在列表 B 范围中,不应仅在 2020 年 2 月 1 日到 2020 年 2 月 5 日之间锁定 C2:F21。

我将非常感谢任何答案

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

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

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

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

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

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

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

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

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

我希望这有什么帮助。

最新更新