Javascript 暂时禁用触发器
我的任务是使用谷歌表单在单元格内创建按钮。由于GAS除了使用图像外,本机不允许使用按钮,因此我决定使用数据验证来完成这项工作。我创建了数据验证,而不是带有单个条目的按钮,并在单元格的值更改为列表中的值时使用onEdit触发器触发脚本 当单元格最初更改时,脚本将按预期激发。但是,如果不再次触发onEdit触发器,我无法找到将伪按钮中的值更改回其原始值的方法。下面是我的工作表中一个相对简单的按钮的支持代码:Javascript 暂时禁用触发器,javascript,google-apps-script,triggers,google-sheets,Javascript,Google Apps Script,Triggers,Google Sheets,我的任务是使用谷歌表单在单元格内创建按钮。由于GAS除了使用图像外,本机不允许使用按钮,因此我决定使用数据验证来完成这项工作。我创建了数据验证,而不是带有单个条目的按钮,并在单元格的值更改为列表中的值时使用onEdit触发器触发脚本 当单元格最初更改时,脚本将按预期激发。但是,如果不再次触发onEdit触发器,我无法找到将伪按钮中的值更改回其原始值的方法。下面是我的工作表中一个相对简单的按钮的支持代码: // If Delete Standard button is pressed } else
// If Delete Standard button is pressed
} else if (cell.getColumn() == 1
&& cell.getRow() >= 8
&& SpreadsheetApp.getActiveSheet().getName() == analysisSheet.getName()
&& cell.getDisplayValue != "X") {
Browser.msgBox("Deleted Standard: " + analysisSheet.getRange(cell.getRow(), 3).getDisplayValue(), Browser.Buttons.OK_CANCEL);
analysisSheet.deleteRow(cell.getRow());
包含数据验证的列中的单元格的值为“X”,该值更改为“删除此标准”。这将触发onEdit函数,该函数将删除所选行。有时,这只删除一行,但大多数情况下,它还会删除下一行,在少数情况下,还会删除三行。我试图通过声明所选单元格值不能为“X”来限制对函数的访问,但在第二个触发器上,它似乎仍然可以访问这部分代码。是,将为删除的每一行触发Browser.msgBox
我的问题是,有没有办法暂时禁用触发器来防止这种行为发生?我尝试过使用以下方法,但运气不佳:
var lock = LockService.getScriptLock();
lock.waitLock(3000);
编辑:看起来我忘记了修复此问题的getDisplayValue方法后面的括号。不过,我仍然希望有一些临时禁用触发器的解决方法。您可以通过脚本添加/删除触发器。幸运的是,这不会删除执行历史记录。这在功能上等同于禁用触发器。下面是一个创建和删除触发器的示例,尽管我知道您的是onedit:
function createTimers() {
ScriptApp.newTrigger('calendar_test_occurred')
.timeBased()
.atHour(10)
.everyMinutes(1)
.create();
}
function deleteTimers() {
var allTriggers = ScriptApp.getProjectTriggers();
for (var i = 0; i < allTriggers.length; i++) {
if (triggers[i].getEventType() == ScriptApp.EventType.CLOCK) {
ScriptApp.deleteTrigger(allTriggers[i]);
}
}
}
函数createTimers(){
ScriptApp.newTrigger('日历测试发生')
.基于时间的()
.atHour(10)
.每分钟(1)
.create();
}
函数deleteTimers(){
var allTriggers=ScriptApp.getProjectTriggers();
对于(var i=0;i
此外,我对按钮使用复选框验证。我只在值为true时运行代码,然后脚本在最后将范围设置回false。您可以通过脚本添加/删除触发器。幸运的是,这不会删除执行历史记录。这在功能上等同于禁用触发器。下面是一个创建和删除触发器的示例,尽管我知道您的是onedit:
function createTimers() {
ScriptApp.newTrigger('calendar_test_occurred')
.timeBased()
.atHour(10)
.everyMinutes(1)
.create();
}
function deleteTimers() {
var allTriggers = ScriptApp.getProjectTriggers();
for (var i = 0; i < allTriggers.length; i++) {
if (triggers[i].getEventType() == ScriptApp.EventType.CLOCK) {
ScriptApp.deleteTrigger(allTriggers[i]);
}
}
}
函数createTimers(){
ScriptApp.newTrigger('日历测试发生')
.基于时间的()
.atHour(10)
.每分钟(1)
.create();
}
函数deleteTimers(){
var allTriggers=ScriptApp.getProjectTriggers();
对于(var i=0;i
此外,我对按钮使用复选框验证。我只在值为true时运行代码,然后脚本在最后将范围设置回false。为什么不使用可以使用onOpen创建的菜单?它们比这个技巧更好:其想法是为工作表内的按钮创建一个变通方法。为这个项目雇佣我的人想要按钮,因为他们觉得按钮更直观。此外,如果我这样做,菜单将变得相当长,因为工作表中有大量的行/列。但对于我将要添加的其他一些功能来说,这仍然是一个不错的主意,因此感谢您的建议!如果您找到了问题的解决方案,请将其作为答案发布,而不是将其作为编辑添加到问题中。我正在寻找一种临时禁用触发器的方法。虽然此编辑允许我的代码按预期运行(对于此特定按钮),但我的代码的其他部分仍需要解决。因此,这并没有真正回答我的问题。我认为你应该编辑或发布一个新问题。事实上,这看起来是一个为什么不使用onOpen创建的菜单呢?它们比这个技巧更好:其想法是为工作表中的按钮创建一个变通方法。为这个项目雇佣我的人想要按钮,因为他们觉得按钮更直观。此外,如果我这样做,菜单将变得相当长,因为工作表中有大量的行/列。但对于我将要添加的其他一些功能来说,这仍然是一个不错的主意,因此感谢您的建议!如果您找到了问题的解决方案,请将其作为答案发布,而不是将其作为编辑添加到问题中。我正在寻找一种临时禁用触发器的方法。虽然此编辑允许我的代码按预期运行(对于此特定按钮),但我的代码的其他部分仍需要解决。因此,这并没有真正回答我的问题。我认为你应该编辑或发布一个新问题。事实上,这看起来是一场灾难