Как получить все триггеры формы (не только для текущего скрипта)? - PullRequest
2 голосов
/ 29 апреля 2019

Я сделал следующее:

  1. Создана форма Google (например, идентификатор формы = ABC)
  2. Создан Google Sheet (назовем его sheet1)

В редакторе сценариев Sheet1 установил триггер для моей формы с кодом, подобным следующему:

var form = FormApp.openById("ABC");
ScriptApp.newTrigger("testFunctionSheet1").forForm(form).onFormSubmit().create();

Когда я вызываю следующее, я вижу, что мой триггер был установлен правильно:

ScriptApp.getUserTriggers(form);

Все отлично. Я могу выполнить код всякий раз, когда отправляется форма Google.

Проблема в том, что позже я продолжаю и создаю новый Google Sheet (назовем его sheet2), который имеет похожий код:

ScriptApp.newTrigger("testFunctionSheet2").forForm(form).onFormSubmit().create();

Однако, чтобы быть в безопасности, я пытаюсь удалить все предыдущие триггеры из всех моих старых сценариев (т. Е. Sheet1). Тем не менее, когда я бегу:

ScriptApp.getUserTriggers(form);

... он возвращает один результат (testFunctionSheet2) вместо того, чтобы возвращать testFunctionSheet1 и testFunctionSheet2. Оказывается, он возвращает только триггеры, которые выполняются текущим скриптом!

Это проблематично, потому что это может означать, что у меня случайно есть много скриптов, которые все выполняются при отправке формы. Если бы я никогда не записывал, какие сценарии выполняются для каких форм, я бы не знал, что именно запускается из каждой отправки. Некоторые из этих сценариев могут либо делать то же самое (что в лучшем случае является пустой тратой циклов ЦП, либо в худшем случае мешать друг другу), либо они могут делать совершенно разные вещи и потенциально конфликтовать друг с другом.

Мне нужен простой способ найти все триггеры сценария, которые будут выполнены при отправке формы. Что-то вроде того, если бы функция на самом деле вела себя так, как я ожидал ...

т.е. ScriptApp.getUserTriggers(form) должно вернуть что-то вроде:

  • sheet1: testFunctionSheet1
  • sheet2: testFunctionSheet2

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

Есть ли способ узнать, какие триггеры будут выполняться во всех моих сценариях при отправке формы?


Обновление : документация для getUserTriggers() разъясняет, что никогда не будет возвращать триггеры для разных сценариев:

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

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

Ответы [ 3 ]

3 голосов
/ 29 апреля 2019

Кажется, нет способа сделать это, но есть некоторые обходные пути, которые могут сделать вещи немного более организованными:

  1. Вместо установки триггера формы на листе, установите его в форму. Если вы попадаете в эту привычку, вы можете легко определить, установлены ли сценарии, поскольку первое место, которое вы проверяете, находится в сценарии формы. Просто запустите команду get all triggers, как вы попробовали выше, и она заработает.

  2. Вместо установки триггера формы в форме, задайте форму для отправки ее ответов на лист и используйте метод onFormSubmit () в SpreadsheetTriggerBuilder . Чтобы выяснить, какой триггер связан с формой, становится так же просто, как открыть форму, затем перейти к ее месту назначения, а затем посмотреть, есть ли у этого сценария триггер для формы.

  3. Скрыть имена сценариев триггера в каком-либо свойстве формы, которое вы не планируете показывать пользователю (например, customClosedFormMessage ). Установите для него что-то вроде This script has an active trigger associated with sheet1.. Вы можете создать вспомогательную функцию, которая перед установкой триггера гарантирует, что текст там не существует (например, если вы хотите ограничить 1 триггер на форму).

2 голосов
/ 29 апреля 2019

Перейти к https://script.google.com/home/triggers?trigger_type=3&document_id=ABC

Это должно дать список всех триггеров от form с идентификатором ABC. Вы можете очистить фильтры там и добавить новые фильтры.

1 голос
/ 29 апреля 2019

Как уже упоминалось в этом OP, в документации сказано, что скрипт не может получить триггеры, созданные другими скриптами.

Если вы единственный, кто создает триггеры из ваших скриптовых проектов, перейдите на https://script.google.com> Триггеры, там вы найдете список всех триггеров, созданных вашей учетной записью.

Я еще не пробовал, но я думаю, что одна альтернатива - включить API скриптов Google Apps для проектов, которые создают триггеры, и добавить функцию, которая будет вызываться через API скриптов Google Apps, чтобы «регистрировать» где-то триггеры. созданный этим проектом.

Что касается "войти куда-нибудь", возможно, более простой способ - отправить журнал по электронной почте "активному пользователю".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...