如何在另一个文档上创建新的时钟触发器
How to create a new clock trigger on another document
我有 30 多个用户,每个用户都有自己的电子表格。每个用户的绑定脚本都引用一个自定义库脚本,我用它来保持我的代码集中并易于更新。
我正在尝试使用应用程序脚本来创建在特定时间 运行 特定功能的触发器。但是,我不知道如何指定时钟触发器安装在哪个脚本文件上。
这是我首先尝试的:
createTimeTrigger("sendTimesheetsToHeads",1440);
function createTimeTrigger(functionToRun,minutesToWait) {
ScriptApp.newTrigger(functionToRun)
.timeBased()
.at(new Date(new Date().getTime()+minutesToWait*60*1000))
.create();
}
以上代码在库文件中,但由于用户正在 运行 调用代码,它会将触发器安装在用户的容器绑定脚本文件中,而不是库文件中。当触发器 运行s 时,它失败了,因为触发器使用了用户没有直接引用的库中的函数。
我需要能够像手动那样以编程方式在独立库脚本文件上安装触发器。因此,在查看应用程序脚本文档 (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: Cannot find function timeBased in object DocumentTriggerBuilder."
然后我尝试调换顺序:
function createTimeTrigger(functionToRun,minutesToWait) {
ScriptApp.newTrigger(functionToRun)
.timeBased()
.at(new Date(new Date().getTime()+minutesToWait*60*1000))
.forDocument(<library script id here>)
.create();
}
并收到此错误:"TypeError: Cannot find function forDocument in object ClockTriggerBuilder." forDocument() 和 timeBased() 函数似乎在触发器生成器中不兼容?
是否可以使用应用程序脚本执行我要求的操作?
请再次查看 TriggerBuilder reference - 您的函数 createTimeTrigger()
应该创建 两个 触发器,一个带有 timeBased()
和其他 forDocument()
。这两种方法在调用时,return 不同的 class 实例 - ClockTriggerBuilder
和 DocumentTriggerBuilder
(因此,第一个问题的答案是 - 是的,它们不兼容.
包装函数
第一种方法假定您有权访问用户文档的应用程序脚本项目,或者可以以其他方式将 wrapperInDoc()
函数添加到文档(此解决方案保留以备不时之需):
- 用户到运行你的库脚本
yourLib.createTimeTrigger()
;
- time-based 触发器 将安装在 用户文档;
- time-based 触发器触发库中的 函数 ;
您的库函数应该为 运行 wrapper 函数 创建一个触发器,其名称对于所有引用 目标函数 [=75 的用户文档都是通用的=] 在你的图书馆。像这样:
Library-scoped样本
function createTimeTrigger(functionToRun,minutesToWait) {
ScriptApp.newTrigger('wrapperInDoc').timeBased().at(yourCond).create();
}
function wrapperInLib() {
sendTimesheetsToHeads(); //function calls go here;
}
Document-scoped样本
function wrapperInDoc() {
yourLib.wrapperInLib();
}
Self-calling图书馆
如评论中所述,您想要:
- 用户到运行你的库脚本
yourLib.createTimeTrigger()
;
createTimeTrigger()
在 yourLib
; 上安装 time-based 触发器
- time-based 触发器触发库中的 函数 ;
Container-bound样本
function testLib() {
var r = PG.createTimeTrigger(); //PG is how I named lib in my project;
//do anything else;
}
图书馆样本
我设置了从 "now" 到触发的任意偏移量 1 分钟,只需根据需要创建触发器即可。此外,请确保您的脚本作为 WebApp 发布,并且 任何人,甚至在其上设置了匿名 访问权限(当您将其用作库时应该没问题)。您应该使用部署 Url 进行获取(带有 /exec
的部署)。
/**
* Runs on a get request;
* @param {Object} e event object;
* @returns {Content} text output to conform to being a web app;
*/
function doGet(e) {
createTrigger();
return ContentService.createTextOutput('success!');
}
/**
* Self-run library project;
*/
function createTimeTrigger() {
UrlFetchApp.fetch('yourLibraryUrl');
}
/**
* Create trigger on self;
*/
function createTrigger() {
var tr = ScriptApp.newTrigger('doSomething');
tr.timeBased().at(new Date(new Date().valueOf()+60000)).create();
}
/**
* Actual trigger callback;
*/
function doSomething() {
//do something;
}
我有 30 多个用户,每个用户都有自己的电子表格。每个用户的绑定脚本都引用一个自定义库脚本,我用它来保持我的代码集中并易于更新。
我正在尝试使用应用程序脚本来创建在特定时间 运行 特定功能的触发器。但是,我不知道如何指定时钟触发器安装在哪个脚本文件上。
这是我首先尝试的:
createTimeTrigger("sendTimesheetsToHeads",1440);
function createTimeTrigger(functionToRun,minutesToWait) {
ScriptApp.newTrigger(functionToRun)
.timeBased()
.at(new Date(new Date().getTime()+minutesToWait*60*1000))
.create();
}
以上代码在库文件中,但由于用户正在 运行 调用代码,它会将触发器安装在用户的容器绑定脚本文件中,而不是库文件中。当触发器 运行s 时,它失败了,因为触发器使用了用户没有直接引用的库中的函数。
我需要能够像手动那样以编程方式在独立库脚本文件上安装触发器。因此,在查看应用程序脚本文档 (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: Cannot find function timeBased in object DocumentTriggerBuilder."
然后我尝试调换顺序:
function createTimeTrigger(functionToRun,minutesToWait) {
ScriptApp.newTrigger(functionToRun)
.timeBased()
.at(new Date(new Date().getTime()+minutesToWait*60*1000))
.forDocument(<library script id here>)
.create();
}
并收到此错误:"TypeError: Cannot find function forDocument in object ClockTriggerBuilder." forDocument() 和 timeBased() 函数似乎在触发器生成器中不兼容?
是否可以使用应用程序脚本执行我要求的操作?
请再次查看 TriggerBuilder reference - 您的函数 createTimeTrigger()
应该创建 两个 触发器,一个带有 timeBased()
和其他 forDocument()
。这两种方法在调用时,return 不同的 class 实例 - ClockTriggerBuilder
和 DocumentTriggerBuilder
(因此,第一个问题的答案是 - 是的,它们不兼容.
包装函数
第一种方法假定您有权访问用户文档的应用程序脚本项目,或者可以以其他方式将 wrapperInDoc()
函数添加到文档(此解决方案保留以备不时之需):
- 用户到运行你的库脚本
yourLib.createTimeTrigger()
; - time-based 触发器 将安装在 用户文档;
- time-based 触发器触发库中的 函数 ;
您的库函数应该为 运行 wrapper 函数 创建一个触发器,其名称对于所有引用 目标函数 [=75 的用户文档都是通用的=] 在你的图书馆。像这样:
Library-scoped样本
function createTimeTrigger(functionToRun,minutesToWait) {
ScriptApp.newTrigger('wrapperInDoc').timeBased().at(yourCond).create();
}
function wrapperInLib() {
sendTimesheetsToHeads(); //function calls go here;
}
Document-scoped样本
function wrapperInDoc() {
yourLib.wrapperInLib();
}
Self-calling图书馆
如评论中所述,您想要:
- 用户到运行你的库脚本
yourLib.createTimeTrigger()
; createTimeTrigger()
在yourLib
; 上安装 time-based 触发器
- time-based 触发器触发库中的 函数 ;
Container-bound样本
function testLib() {
var r = PG.createTimeTrigger(); //PG is how I named lib in my project;
//do anything else;
}
图书馆样本
我设置了从 "now" 到触发的任意偏移量 1 分钟,只需根据需要创建触发器即可。此外,请确保您的脚本作为 WebApp 发布,并且 任何人,甚至在其上设置了匿名 访问权限(当您将其用作库时应该没问题)。您应该使用部署 Url 进行获取(带有 /exec
的部署)。
/**
* Runs on a get request;
* @param {Object} e event object;
* @returns {Content} text output to conform to being a web app;
*/
function doGet(e) {
createTrigger();
return ContentService.createTextOutput('success!');
}
/**
* Self-run library project;
*/
function createTimeTrigger() {
UrlFetchApp.fetch('yourLibraryUrl');
}
/**
* Create trigger on self;
*/
function createTrigger() {
var tr = ScriptApp.newTrigger('doSomething');
tr.timeBased().at(new Date(new Date().valueOf()+60000)).create();
}
/**
* Actual trigger callback;
*/
function doSomething() {
//do something;
}