Google Apps Script Library — Сам себе триггер в библиотеке (короткая версия)
Michael SmirnovПравильный канал о Таблицах (Google Sheets): @google_sheets
Чат канала: @google_spreadsheets_chat
Здравствуйте, товарищи!
Я тут написал статью с примерами и деталями. Получилось несколько запутанно, по-моему. Сейчас постараюсь изложить кратко основные моменты.
Триггер для библиотечной функции
Вручную нельзя, но программно можно повесить триггер на библиотечную функцию:
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
Правильный канал о Таблицах (Google Sheets): @google_sheets
Чат канала: @google_spreadsheets_chat