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

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 实例 - ClockTriggerBuilderDocumentTriggerBuilder(因此,第一个问题的答案是 - 是的,它们不兼容.

包装函数

第一种方法假定您有权访问用户文档的应用程序脚本项目,或者可以以其他方式将 wrapperInDoc() 函数添加到文档(此解决方案保留以备不时之需):

  1. 用户到运行你的库脚本yourLib.createTimeTrigger();
  2. time-based 触发器 将安装在 用户文档;
  3. 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图书馆

如评论中所述,您想要:

  1. 用户到运行你的库脚本yourLib.createTimeTrigger();
  2. createTimeTrigger()yourLib;
  3. 上安装 time-based 触发器
  4. 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;
}