首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >是否不允许为使用触发函数运行的函数设置触发器?

是否不允许为使用触发函数运行的函数设置触发器?
EN

Web Applications用户
提问于 2022-05-19 16:03:38
回答 2查看 65关注 0票数 2

我希望我的函数freezeSunday能在周日下午1点的时候运行。由于您似乎无法触发一个函数在一个精确的时间(仅在一个范围内随机选择的时间)运行,所以我编写了以下代码。

代码语言:javascript
运行
复制
function createTimeTriggerEveryNMinutes() {
 ScriptApp.newTrigger("freezeSunday")
   .timeBased()
   .everyMinutes(1)
   .create();
}
function freezeSunday() {
  const date = new Date();
  const minute = date.getMinutes();
  if (minute == 0) {
    var spreadsheet = SpreadsheetApp.getActive();
    spreadsheet.getRange('A37:Z69').activate();
    spreadsheet.getRange('A2:Z34').copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
    }
}
function triggerDeleteHandler() {
  var Triggers = ScriptApp.getProjectTriggers();
  for (var i = 0; i < Triggers.length; i++) {
    if (Triggers[i].getHandlerFunction() == "freezeSunday") {
      ScriptApp.deleteTrigger(Triggers[i])
    }
  }
}

第一个函数设置freezeSunday函数每分钟运行一次的触发器。freezeSunday函数仅在分钟为0时执行其操作。否则它什么也做不了。最后一个函数删除“每时每刻”触发器。如果我手动运行第一个函数createTimeTriggerEveryNMinues,所有这些都可以正常工作。freezeSunday函数每分钟运行一次,下午1点执行它的操作。

但是,如果我设置了一个触发器来运行createTimeTriggerEveryNMinutes,而不是手动地运行它,那么事情就不起作用了。freezeSunday函数从未运行,触发器在我的触发器列表中以红色文本显示“禁用”。如果我点击信息图标,上面写着“因未知原因禁用触发器”。

不允许从另一个触发函数为函数设置触发器吗?

EN

回答 2

Web Applications用户

发布于 2022-05-20 04:12:07

替换

代码语言:javascript
运行
复制
spreadsheet.getRange('A37:Z69').activate();
spreadsheet.getRange('A2:Z34').copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);

通过

代码语言:javascript
运行
复制
spreadsheet.getRange('A2:Z34').copyTo(spreadsheet.getRange('A37:Z69'), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);

这是因为时间驱动触发器无法激活范围,因为这是在Google用户界面中完成的。

票数 0
EN

Web Applications用户

发布于 2022-05-22 00:27:13

我想我已经发现了这个问题。在下面的代码中,如果我使用createDoubleTrigger函数为createTimeTriggerEveryNMinutes和triggerDeleteHandler创建触发器,一切都会正常工作。

如果我使用Apps脚本界面中的下拉菜单为createTimeTriggerEveryNMinutes和triggerDeleteHandler创建触发器,那么freezeSunday就不会运行,由createTimeTriggerEveryNMinutes创建的触发器显示为“禁用”。

我认为一般的解决方案是始终以编程方式创建触发器。

function createDoubleTrigger() { ScriptApp.newTrigger("createTimeTriggerEveryNMinutes") .timeBased() .onWeekDay(ScriptApp.WeekDay.SUNDAY) .atHour(12) .nearMinute(40) .everyWeeks(1) .create(); ScriptApp.newTrigger("triggerDeleteHandler") .timeBased() .onWeekDay(ScriptApp.WeekDay.SUNDAY) .atHour(13) .nearMinute(20) .everyWeeks(1) .create(); } function createTimeTriggerEveryNMinutes() { ScriptApp.newTrigger("freezeSunday") .timeBased() .everyMinutes(1) .create(); } function freezeSunday() { const date = new Date(); const minute = date.getMinutes(); if (minute == 0) { var spreadsheet = SpreadsheetApp.getActive(); spreadsheet.getRange('A2:Z34').copyTo(spreadsheet.getRange('A37:Z69'), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false); } } function triggerDeleteHandler() { var Triggers = ScriptApp.getProjectTriggers(); for (var i = 0; i < Triggers.length; i++) { if (Triggers[i].getHandlerFunction() == "freezeSunday") { ScriptApp.deleteTrigger(Triggers[i]) } } }

票数 0
EN
页面原文内容由Web Applications提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://webapps.stackexchange.com/questions/164647

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档