Google Apps Script Library — Сам себе триггер в библиотеке (короткая версия)

Google Apps Script Library — Сам себе триггер в библиотеке (короткая версия)

Michael Smirnov

Правильный канал о Таблицах (Google Sheets): @google_sheets

Чат канала: @google_spreadsheets_chat


Здравствуйте, товарищи!


Я тут написал статью с примерами и деталями. Получилось несколько запутанно, по-моему. Сейчас постараюсь изложить кратко основные моменты.


Младшие научные сотрудники нашего института на конференции по триггерам, 1993

Триггер для библиотечной функции

Вручную нельзя, но программно можно повесить триггер на библиотечную функцию:

ScriptApp.newTrigger('myLib.myFunction')
  .timeBased()
  .after(1)
  .create();


Подробнее про это в документации.

Под каким именем импортировали библиотеку

Объект ScriptApp – это объект внешнего проекта, который был запущен, который импортирует библиотеку. Подробнее про это в документации.


Поэтому нам достаточно посмотреть настройки проекта в манифесте appssciprt.json, ту часть, в которой перечислены библиотеки. Содержимое файла получим с помощью функции ScriptApp.getResource():

// This library's Script Id
const SCRIPTID_ = '1qYE4E5tQ7FwrgANl6CRZ5nXK896GFX1TVWsnzP1C9Z3-y0qzmma9PGHt';
// The name used the project that imported this library
const LIBSYMBOL_ = JSON.parse(ScriptApp.getResource('appsscript').getDataAsString())
  .dependencies
  .libraries
  .find((lib) => lib.libraryId === SCRIPTID_)
  .userSymbol;


На функцию ScriptApp.getResource() документации нет. Структура appsscipt.json описана в документации, а пример можете посмотреть в любом своём проекте.


Создаём триггер из библиотеки

Имея название библиотеки, под которым она используется в проекте, создать триггер на функцию библиотеки (функция не должна быть скрыта) изнутри самой библиотеки можно так:

ScriptApp.newTrigger(`${LIBSYMBOL_}.myFunction`)
  .timeBased()
  .after(1)
  .create();


Самоудаление триггера

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

function myFunction(e) {
  // Find the trigger that fired this function in the list of all triggers
  const thisTimeBasedTrigger = ScriptApp.getProjectTriggers()
    .find((trigger) => trigger.getUniqueId() === e.triggerUid);

  // If the trigger was found
  if (thisTimeBasedTrigger != null) {
    // Delete the trigger
    ScriptApp.deleteTrigger(thisTimeBasedTrigger)
  }

  // Actual work
  Logger.log('Working...');
}


Это может пригодиться, чтобы снять триггер по какому-нибудь условию или, если у вас действительно одноразовый триггер (то есть такой, что только единственный раз по времени отработает, а потом будет без толку в списке висеть), то пусть сам себя удаляет.


На этом всё. Спасибо за внимание.


Ссылки

Google Apps Script Library

Триггеры

Google Apps Script


Правильный канал о Таблицах (Google Sheets): @google_sheets

Чат канала: @google_spreadsheets_chat

Report Page