Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 暂时禁用触发器_Javascript_Google Apps Script_Triggers_Google Sheets - Fatal编程技术网

Javascript 暂时禁用触发器

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

我的任务是使用谷歌表单在单元格内创建按钮。由于GAS除了使用图像外,本机不允许使用按钮,因此我决定使用数据验证来完成这项工作。我创建了数据验证,而不是带有单个条目的按钮,并在单元格的值更改为列表中的值时使用onEdit触发器触发脚本

当单元格最初更改时,脚本将按预期激发。但是,如果不再次触发onEdit触发器,我无法找到将伪按钮中的值更改回其原始值的方法。下面是我的工作表中一个相对简单的按钮的支持代码:

// 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创建的菜单呢?它们比这个技巧更好:其想法是为工作表中的按钮创建一个变通方法。为这个项目雇佣我的人想要按钮,因为他们觉得按钮更直观。此外,如果我这样做,菜单将变得相当长,因为工作表中有大量的行/列。但对于我将要添加的其他一些功能来说,这仍然是一个不错的主意,因此感谢您的建议!如果您找到了问题的解决方案,请将其作为答案发布,而不是将其作为编辑添加到问题中。我正在寻找一种临时禁用触发器的方法。虽然此编辑允许我的代码按预期运行(对于此特定按钮),但我的代码的其他部分仍需要解决。因此,这并没有真正回答我的问题。我认为你应该编辑或发布一个新问题。事实上,这看起来是一场灾难