Как создать новый триггер часов на другом документе - PullRequest
2 голосов
/ 29 мая 2019

У меня более 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:Не удается найти функцию timeBased в объекте 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: Невозможно найти функцию forDocument в объекте ClockTriggerBuilder. "Похоже, что функции forDocument () и timeBased () несовместимы в построителе триггеров?

Можно ли сделать то, что я спрашиваю, с помощью скрипта приложений?

1 Ответ

0 голосов
/ 29 мая 2019

Пожалуйста, взгляните на ссылку TriggerBuilder еще раз - ваша функция createTimeTrigger() должна создать два триггера , один с timeBased(), а другой с forDocument(). Оба метода при вызове возвращают разные экземпляры классов - ClockTriggerBuilder и DocumentTriggerBuilder соответственно (поэтому ответ на ваш первый вопрос - да, они несовместимы .

Функция обертки

Первый подход предполагает, что у вас есть доступ к проекту сценария приложений пользовательского документа или вы можете добавить к документу функцию wrapperInDoc() (это решение сохраняется на тот случай, если это кому-то нужно):

  1. пользователь для запуска скрипта библиотеки yourLib.createTimeTrigger();
  2. основанный на времени триггер для установки на пользовательский документ ;
  3. основанный на времени триггер для запуска функции в библиотеке ;

Ваша библиотечная функция должна создать триггер для запуска функции оболочки с именем, общим для всех пользовательских документов, которые ссылаются на целевую функцию в вашей библиотеке. Вот так:

Образец в библиотечной области

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

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

Образец с документами

function wrapperInDoc() {
  yourLib.wrapperInLib();
}

Самозвонящая библиотека

Как уточняется в комментариях, вы хотите:

  1. пользователь для запуска скрипта библиотеки yourLib.createTimeTrigger();
  2. createTimeTrigger() для установки основанного на времени триггера на yourLib;
  3. основанный на времени триггер для запуска функции в библиотеке ;

Образец в контейнерах

function testLib() {
 var r = PG.createTimeTrigger(); //PG is how I named lib in my project;
 //do anything else;
}

Образец библиотеки

Я установил произвольное смещение в 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;
}
...