我在第一次输入数据后使用了以下OnEdit((触发代码来锁定单元格:
function LockCells(event){
var range = event.range;
var description = 'Protected'; // + stringDate;
var protection = range.protect().setDescription(description);
var me = Session.getEffectiveUser();
protection.addEditor(me);
protection.removeEditors(protection.getEditors());
if (protection.canDomainEdit()) {
protection.setDomainEdit(false);
}
}
当我以用户身份(而不是工作表管理员(在单元格中输入值时,它会立即阻止单元格重新输入值。我们能推迟这个过程吗?我的意思是,如果我们现在输入值,但在10分钟或一小时后对该单元格进行保护,但不是立即?
我相信您的目标如下。
LockCells
的功能由OnEdit可安装触发器执行- 您希望在运行OnEdit触发器之后在函数
LockCells
中运行脚本
在这种情况下,下面的修改脚本如何?
修改的脚本1:
例如,当运行OnEdit触发器时,当您想在大约6分钟后运行函数LockCells
中的脚本时,修改后的脚本可以有点简单,如下所示。
function LockCells(event) {
Utilities.sleep(5 * 60 * 1000); // For example, after 5 minutes, the script is run.
var range = event.range;
var description = 'Protected'; // + stringDate;
var protection = range.protect().setDescription(description);
var me = Session.getEffectiveUser();
protection.addEditor(me);
protection.removeEditors(protection.getEditors());
if (protection.canDomainEdit()) {
protection.setDomainEdit(false);
}
}
修改的脚本2:
如果要在函数LockCells
中运行脚本超过6分钟,则修改后的脚本如下所示。请将以下脚本复制并粘贴到电子表格的脚本编辑器中。并且,请将OnEdit可安装触发器重新安装到函数LockCells
。这样,当您编辑单元格时,在此示例脚本中,经过编辑的单元格将在10分钟后受到保护。
var time = 10 * 60 * 1000; // 10 minutes
function LockCells(event) {
var date = new Date().getTime();
var range = event.range;
var a1Notation = `'${range.getSheet().getSheetName()}'!${range.getA1Notation()}`;
var p = PropertiesService.getScriptProperties();
var ranges = p.getProperty("ranges");
ranges = ranges ? JSON.parse(ranges).concat({ date, a1Notation }) : [{ date, a1Notation }];
p.setProperty("ranges", JSON.stringify(ranges));
ScriptApp.newTrigger("lockCellsByTrigger").timeBased().after(time).create();
}
function lockCellsByTrigger(e) {
ScriptApp.getScriptTriggers().forEach(t => {
if (t.getUniqueId() == e.triggerUid) ScriptApp.deleteTrigger(t);
});
var limit = time;
var now = new Date().getTime();
var p = PropertiesService.getScriptProperties();
var ranges = p.getProperty("ranges");
if (!ranges) return;
ranges = JSON.parse(ranges);
var {rranges, r} = ranges.reduce((o, e) => {
o[e.date + limit < now ? "rranges" : "r"].push(e);
return o;
}, {rranges: [], r: []});
if (rranges.length == 0) return;
p.setProperty("ranges", JSON.stringify(r));
var description = 'Protected';
var me = Session.getEffectiveUser();
rranges.forEach(({a1Notation}) => {
var protection = SpreadsheetApp.getActiveSpreadsheet().getRange(a1Notation).protect().setDescription(description);
protection.addEditor(me);
protection.removeEditors(protection.getEditors());
if (protection.canDomainEdit()) {
protection.setDomainEdit(false);
}
});
}
- 如果您想更改时间,请修改
time
。在当前阶段,10分钟后,编辑的单元格将受到保护 - 这个脚本的流程如下。
- 编辑单元格时,
LockCells
由可安装的OnEdit触发器运行 - 将编辑单元格的a1Notation和日期放入Properties Service,10分钟后安装时间驱动触发器
- 当时间驱动触发器运行函数
lockCellsByTrigger
时,10分钟后编辑的单元格受到保护
- 编辑单元格时,
参考文献:
- 属性服务
- newTrigger(functionName(