google-apps-script - 如何从 Google 表格和应用程序脚本中的撤消历史列表中删除 onEdit 触发器执行的操作
问题描述
在我的一张工作表中,我使用一个简单的脚本来更改每次编辑时某些单元格的边框。
它看起来像这样:
function onEdit(e) {
...
sheet.getRange(1, 1, sheet.getMaxRows(), sheet.getMaxColumns()).setBorder(null, null, null, null, false, false);
sheet.getRangeList(rangeList).setBorder(null, null, true, null, false, false, "#BBDEFB", SpreadsheetApp.BorderStyle.SOLID_THICK);
}
}
一切都很好,但是,在编辑某些内容之后,假设我按 CMD+Z(或 CTRL+Z)撤消我的上一个操作。实际发生的是添加的边框被删除,因为从技术上讲,这是最后一个动作。
对于这种性质的问题,是否有众所周知的解决方案?
编辑:我根据第一个答案创建了一个手动触发功能。但是,Google 表格限制每个用户每个电子表格有一个触发器。所以边界只改变了一次。我还按照它所说的删除了触发器,即使那样它也不起作用。
此外,有没有更好的方法来做到这一点?在每次编辑时将边框设置为 null 基本上使得根本无法添加自定义边框。
解决方案
- 当按下 CMD+Z(或 CTRL+Z)的键时,您不想删除脚本添加的边框。
- 您的基本脚本用于在 Google Sheets 中添加基于分组行和条件格式的边框。
如果我的理解是正确的,这个解决方法怎么样?请将此视为几种解决方法之一。
当从外部修改电子表格时,即使按下 CMD+Z(或 CTRL+Z)的键,也不能取消修改的动作。在这个解决方法中,我使用了这个。
修改后的脚本:
在使用此脚本之前,请先安装sample()
as OnEdit 事件触发器的功能。这样,当您编辑单元格时,sample()
会自动运行 的功能。您可以在此处查看如何安装触发器。
function sample(e) {
if (e.source.getActiveSheet().getSheetName() == "Sheet1") {
var sheet = SpreadsheetApp.openById(e.source.getId()).getSheetByName("Sheet1"); // Modified
var values = sheet.getRange(3, 3, sheet.getLastRow() - 1, 1).getValues();
var rangeList = values.reduce(function(ar, e, i) {
if (i > 0 && (values[i - 1][0] != e[0] && e[0] != "")) {
ar.push("A" + (i + 2) + ":P" + (i + 2));
}
return ar;
}, [])
rangeList.push(sheet.getRange(sheet.getLastRow(), 1, 1, sheet.getLastColumn()).getA1Notation());
sheet.getRange(1, 1, sheet.getMaxRows(), sheet.getMaxColumns()).setBorder(null, null, null, null, false, false);
sheet.getRangeList(rangeList).setBorder(null, null, true, null, false, false, "black", SpreadsheetApp.BorderStyle.SOLID_THICK);
}
}
笔记:
- 使用此脚本时,请将 的函数重命名
onEdit(e)
为其他名称,如onEdit_sample(e)
. 因为onEdit()
在脚本中有,都sample()
作为 OnEdit 触发器安装并onEdit()
运行。请注意这一点。
参考:
如果我误解了你的问题,我很抱歉。
编辑:
根据您的附加要求,我添加了一个示例脚本,用于安装 OnEdit 事件触发器的功能sample()
。
示例脚本:
var id = SpreadsheetApp.getActiveSpreadsheet().getId();
ScriptApp.newTrigger("sample").forSpreadsheet(id).onEdit().create();
推荐阅读
- python - 在 django 模板上调用具有多个参数的模型方法
- pandas - 如何按小时进行插值
- python - 从python中的排序列表中过滤字符串
- javascript - 来自反应形式的未定义输入
- html - Css,Html:为什么chrome会忽略容器宽度?(在所有其他浏览器上工作正常)
- graphql - Apollo Server:如何在没有指令的情况下对所有“id:ID”字段进行后处理?
- python - 如何在 pyqt5 图中添加十字准线
- oracle-apex - Oracle APEX - 如何以编程方式在弹出式 LOV 中选择显示值
- go - 如何发送消息并忽略路由
- android - 在两个容器上实例化一个片段只会渲染一个片段