如何在另一个文档上创建新的时钟触发器

时间:2019-05-29 15:17:52

标签: google-apps-script document eventtrigger

我有30多个用户,每个用户都有自己的电子表格。每个用户的绑定脚本都引用了一个自定义库脚本,该脚本可用于使我的代码集中并易于更新。

我正在尝试使用应用脚本来创建在特定时间运行特定功能的触发器。但是,我不知道如何指定安装时钟触发器的脚本文件。

这是我首先尝试的方法:

createTimeTrigger("sendTimesheetsToHeads",1440);

function createTimeTrigger(functionToRun,minutesToWait) {
  ScriptApp.newTrigger(functionToRun)
  .timeBased()
  .at(new Date(new Date().getTime()+minutesToWait*60*1000))
  .create();
}

上面的代码位于库文件中,但是由于用户正在运行该代码,因此它将触发器安装在用户的容器绑定脚本文件上,而不是库文件上。触发器运行时失败,因为触发器使用了用户没有直接引用的库中的函数。

我需要能够以编程方式在独立的库脚本文件上安装触发器,就像我可以手动执行的一样。因此,在查看了应用程序脚本文档(https://developers.google.com/apps-script/reference/script/trigger-builder#forDocument(String))之后,我找到了触发器构建器的forDocument()函数,并尝试了以下方法:

createTimeTrigger("sendTimesheetsToHeads",1440);

function createTimeTrigger(functionToRun,minutesToWait) {
  ScriptApp.newTrigger(functionToRun)
  .forDocument(<library script id here>)
  .timeBased()
  .at(new Date(new Date().getTime()+minutesToWait*60*1000))
  .create();
}

但是上面的代码产生以下错误:“ TypeError:在对象DocumentTriggerBuilder中找不到函数timeBase。”

因此,我尝试切换顺序:

function createTimeTrigger(functionToRun,minutesToWait) {
  ScriptApp.newTrigger(functionToRun)
  .timeBased()
  .at(new Date(new Date().getTime()+minutesToWait*60*1000))
  .forDocument(<library script id here>)
  .create();
}

并收到此错误:“ TypeError:在对象ClockTriggerBuilder中找不到文档的函数”。看起来触发器构造器中的forDocument()和timeBased()函数不兼容吗?

是否可以使用我的应用脚本来完成我所要求的?

1 个答案:

答案 0 :(得分:0)

请再看一下TriggerBuilder reference-您的函数createTimeTrigger()应该创建两个触发器,一个使用timeBased(),另一个使用{{1 }}。这两种方法在被调用时分别返回不同的类实例-forDocument()ClockTriggerBuilder(因此,第一个问题的答案是-是,它们不兼容

包装器功能

第一种方法假设您有权访问用户文档的apps脚本项目,或者可以向文档中添加DocumentTriggerBuilder函数(该解决方案将保留,以防有人需要):

  1. 用户以运行您的库脚本wrapperInDoc();
  2. 要安装在用户文档上的基于时间的触发器
  3. 基于时间的 触发器在库中触发功能;

您的库函数应该创建一个触发器以运行包装器函数,该触发器的名称对于在库中引用 target函数的所有用户文档都是通用的。像这样:

图书馆范围的样本

yourLib.createTimeTrigger()

文档范围的示例

function createTimeTrigger(functionToRun,minutesToWait) {
  ScriptApp.newTrigger('wrapperInDoc').timeBased().at(yourCond).create();
}

function wrapperInLib() {
  sendTimesheetsToHeads(); //function calls go here;
}

自调用库

正如评论中所阐明的,您想要:

  1. 用户以运行您的库脚本function wrapperInDoc() { yourLib.wrapperInLib(); } ;
  2. yourLib.createTimeTrigger()createTimeTrigger()上安装基于时间的触发器
  3. 基于时间的 触发器在库中触发功能;

容器绑定的样本

yourLib

图书馆样品

我设置了从“现在”到触发器的1分钟任意偏移量,只需根据需要创建触发器即可。另外,请确保您的脚本以WebApp的形式发布,并且对所有人设置了访问权限,即使是匿名访问(在将其用作库时也可以)。您应该使用部署网址(用于function testLib() { var r = PG.createTimeTrigger(); //PG is how I named lib in my project; //do anything else; } 的获取)。

/exec