在单元格中输入值时,如何延迟单元格保护



我在第一次输入数据后使用了以下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分钟后,编辑的单元格将受到保护
  • 这个脚本的流程如下。
    1. 编辑单元格时,LockCells由可安装的OnEdit触发器运行
    2. 将编辑单元格的a1Notation和日期放入Properties Service,10分钟后安装时间驱动触发器
    3. 当时间驱动触发器运行函数lockCellsByTrigger时,10分钟后编辑的单元格受到保护

参考文献:

  • 属性服务
  • newTrigger(functionName(

相关内容

  • 没有找到相关文章

最新更新