[英]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 定义createProtectTriggerB
和createUnprotectTriggerB
但它与其他范围相同):
function createTriggers() {
createProtectTriggerA();
createUnprotectTriggerA();
createProtectTriggerB();
createUnprotectTriggerB();
}
请注意,正如 CodeCamper 所说,如果用户有权编辑电子表格,他们可能会使用脚本来破坏您的保护。 因此,根据编辑此内容的人员,也许您应该拥有一份只有您可以访问的电子表格副本。
我希望这有任何帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.