Google Apps Script — Сам себе триггер в библиотеке
Статья Михаила Смирнова, написанная для канала t.me/google_sheets
Чат канала: t.me/google_spreadsheets_chat
Другие статьи Миши, написанные для нашего канала: t.me/google_sheets/1203
Здравствуйте, товарищи!
Я тут написал статью с примерами и деталями. Получилось несколько запутанно, по-моему. Сейчас постараюсь изложить кратко основные моменты.

Триггер для библиотечной функции
Вручную нельзя, но программно можно повесить триггер на библиотечную функцию:
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
- Про библиотеки
- Очень важно про то, какие части проекта, который использует библиотеку, видны в библиотеке
Триггеры
- Simple triggers и installable triggers
- newTrigger() и TriggerBuilder – создаём триггер программно
- Содержимое событий триггеров
Google Apps Script
- Про указание функций, до которых надо добираться через точку
- И вообще про используемый в скриптах движок V8
- Недокументированная функция ScripApp.getResource(): на Stackoverflow и от Максима Стоянова
- Про структуру appsscipt.json
Статья Михаила Смирнова, написанная для канала t.me/google_sheets
Чат канала: t.me/google_spreadsheets_chat
Другие статьи Миши, написанные для нашего канала: t.me/google_sheets/1203