我有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()函数不兼容吗?
是否可以使用我的应用脚本来完成我所要求的?
答案 0 :(得分:0)
请再看一下TriggerBuilder reference-您的函数createTimeTrigger()
应该创建两个触发器,一个使用timeBased()
,另一个使用{{1 }}。这两种方法在被调用时分别返回不同的类实例-forDocument()
和ClockTriggerBuilder
(因此,第一个问题的答案是-是,它们不兼容。
第一种方法假设您有权访问用户文档的apps脚本项目,或者可以向文档中添加DocumentTriggerBuilder
函数(该解决方案将保留,以防有人需要):
wrapperInDoc()
; 您的库函数应该创建一个触发器以运行包装器函数,该触发器的名称对于在库中引用 target函数的所有用户文档都是通用的。像这样:
图书馆范围的样本
yourLib.createTimeTrigger()
文档范围的示例
function createTimeTrigger(functionToRun,minutesToWait) {
ScriptApp.newTrigger('wrapperInDoc').timeBased().at(yourCond).create();
}
function wrapperInLib() {
sendTimesheetsToHeads(); //function calls go here;
}
正如评论中所阐明的,您想要:
function wrapperInDoc() {
yourLib.wrapperInLib();
}
; yourLib.createTimeTrigger()
在createTimeTrigger()
上安装基于时间的触发器; 容器绑定的样本
yourLib
图书馆样品
我设置了从“现在”到触发器的1分钟任意偏移量,只需根据需要创建触发器即可。另外,请确保您的脚本以WebApp的形式发布,并且对所有人设置了访问权限,即使是匿名访问(在将其用作库时也可以)。您应该使用部署网址(用于function testLib() {
var r = PG.createTimeTrigger(); //PG is how I named lib in my project;
//do anything else;
}
的获取)。
/exec