Как использовать приложения Google script в нескольких документах

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

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

Google Apps script - Как иметь один script В нескольких контейнерах?

Итак, мой вопрос: нет ли способа поделиться script между несколькими документами Google? Должен ли вы действительно создать новый проект script для каждого документа и скопировать и вставить код из другого? Более того, если вы исправите ошибку в одном из них, вам нужно помнить, какие документы используют этот script и открыть редактор script в каждом из них и скопировать и вставить новый код?

Ответ 1

Библиотеки были разработаны специально для этой ситуации... см. здесь .

Ответ 2

Я пришел к решению, которое работает для меня. Это позволяет хранить любое количество скриптов, прикрепленных к какому-либо основному документу (пусть назовем его MyScripts). Нет библиотек, публикация не требуется.

Создайте документ и назовите его MyScripts (или любой другой). Тело документа может быть пустым, или вы можете написать там несколько инструкций. Затем вставьте следующий код в редактор сценариев MyScript:

// adds a menu to the master document UI
// the document
function onOpen() {
  DocumentApp.getUi()
             .createAddonMenu()
             .addItem('Do something', 'doSomething')
             .addItem('Something else', 'somethingElse')
             .addToUi()
}

// returns the target document based on its URL
// may be tweaked in order to use the documentId instead
function findDoc(pros) {
  var pro = DocumentApp.getUi().prompt(pros, 'URL:', ui.ButtonSet.OK);
  var url = pro.getResponseText();
  return DocumentApp.openByUrl(url);
}

function doSomething() {
  var doc = findDoc('Do something');
  if (doc) {
    // do something with the target document
    var len = doc.getBody().getText().length;
    DocumentApp.getUi().alert('The document is ' + len + ' characters long')
  }
}

function somethingElse() {
  var doc = findDoc('Something else');
  if (doc) {
    // do something else
  }
}

Функция onOpen() должна быть onOpen().

findDoc() - настоящий взлом. Он запрашивает у пользователя URL целевого документа, документа, с которым мы хотим работать. Если URL действителен, то findDoc() возвращает соответствующий объект документа.

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

Если вы хотите запустить скрипт для документа, скопируйте его URL, затем откройте MyScripts, выберите соответствующий пункт меню дополнений, вставьте URL и нажмите OK.

Обратите внимание, что вы получите страшное предупреждающее сообщение при первой попытке запустить скрипт таким образом. Просто убедитесь, что ваш doSomething(), ваш somethingElse() и т.д. содержит только безопасный код, прежде чем игнорирование предупреждений и выполнение сценариев.

Ответ 3

Извините, моя репутация была слишком низкой, чтобы добавить комментарий. :( В ответе Джузеппе используйте это для поиска документов - незначительные изменения

function findDoc(pros) {
  var ui =  DocumentApp.getUi();
  var pro = ui.prompt(pros, 'URL:', ui.ButtonSet.OK);
  var url = pro.getResponseText();
  return DocumentApp.openByUrl(url);
}