Централизованный скрипт для нескольких таблиц - PullRequest
0 голосов
/ 02 апреля 2020

Я создал скрипт уведомления и хотел бы использовать его для нескольких электронных таблиц (созданных Forms). Я хотел бы иметь централизованный сценарий и ссылаться на него в нескольких электронных таблицах, чтобы упростить обслуживание.

Я пытался использовать SpreadsheetApp.openById(), как показано ниже, но похоже, что эта функция отключена из соображений безопасности и больше не поддерживается.

function append()
{
  SpreadsheetApp.openById("1xdePF..........................");
}

Есть идеи, как использовать один и тот же сценарий для нескольких таблиц?

Ответы [ 2 ]

1 голос
/ 03 апреля 2020

В документации указано, что openById открывает электронную таблицу с указанным идентификатором.

Этот метод нельзя использовать для открытия сценария.

Чтобы открыть скрипт приложения, от go до https://script.google.com/home/my и часы на выбранном вами сценарии.

Для связанных сценариев вы открываете документ, к которому привязан сценарий и go до Tools->Script Editor

0 голосов
/ 03 апреля 2020

Предисловие

Этот ответ является дополнительным к ответу ziganotschka, поскольку вы действительно не можете получить доступ к скрипту, привязанному к документу, открыв указанный документ с помощью openById(). Вместо этого ответ охватывает другие проблемы, которые у вас были, и предлагает дополнительные способы решения вашей задачи.

Проблема

При попытке использовать openById() вы получаете сообщение об ошибке следующей структуры:

Исключение: отсутствует документ [do c id here] (возможно, он был удален или у вас нет прав на чтение?)

Вы упомянули в комментариях, что идентификатор равен 58 символам (я думаю, что это 57) и получен из "свойств", что объясняет ошибку - нет таблицы с таким идентификатором, потому что идентификатор файла и идентификатор скрипта вы извлекли не одно и то же. Если вам когда-нибудь понадобится программно извлечь current id (здесь предполагается, что он вызывается из сценария, привязанного к электронной таблице, но другие службы имеют аналогичные методы), вы можете вызвать getActiveSpreadsheet() -> getId().

Решения

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

в виде библиотеки

Любой сценарий с сохраненной версией может быть библиотекой, которая может быть используется другими сценариями путем добавления его идентификатора в список, доступный из меню Resources->Libraries.

как веб-приложение

Любой сценарий, имеющий doGet, * Функцию 1053 * (или обе) можно развернуть как веб-приложение, по сути, открыв для нее net. Поскольку вы сказали, что электронные таблицы "создаются" с помощью форм, и создали сценарий "уведомления", я предполагаю, что вы заинтересованы в событии FormSubmit. При развертывании в качестве веб-приложения вы получаете url (не забудьте выбрать соответствующее разрешение ).

После этого остается только вопрос убедиться, что:

  1. каждая форма имеет устанавливаемый триггер onFormSubmit (вы можете установить его через [см. ссылки на документы] ScriptApp.newTrigger('callback name').forForm('form ref').onFormSubmit()).
  2. Обратный вызов для триггер вызывает URL-адрес веб-приложения через UrlFetchApp.fetch() с необходимыми данными (такими как идентификатор электронной таблицы или любая другая информация) как запрос (при использовании doGet) или запрос body (при использовании doPost).
  3. Необходимые данные будут доступны в объекте события, построенном при попадании в doGet или doPost [примечание, чтобы избежать распространенного заблуждения: вы не можете отлаживать объекты событий в редакторе , это может быть сделано только вживую].

Ссылка

  1. getActiveSpreadsheet() документы
  2. getId() документы
  3. getFileById() документы
  4. автономные сценарии руководство
  5. связанные сценарии руководство
  6. Библиотеки путеводитель
  7. Событие отправки формы ссылка
  8. new Trigger() документы
  9. UrlFetchApp.fetch() документы
  10. doGet / doPost объект события документы
...