Вызовите функцию редактора Google Editor из редактора сценариев. - PullRequest
0 голосов
/ 19 декабря 2018

У меня есть бэкэнд-сервис и некоторые пользователи с данными в своих Google Sheets.Я хочу, чтобы мой сервис получал и изменял данные на этих листах от имени их владельцев.Итак, я написал решение, состоящее из двух частей:

Код редактора скриптов, содержащий функции doGet и doPost Библиотека, импортированная в этот скрипт.Эта библиотека фактически делает всю тяжелую работу.Упрощенная версия скрипта:

function doGet(req) {
  // Let Mylib handle this
  return Mylib.handleGET(req);
}
function doPost(req) {
  // Let Mylib handle this
  return Mylib.handlePOST(req);
}

Пользователь предоставляет миру свою электронную таблицу через «Опубликовать» -> «Развернуть как веб-приложение ...» и предоставляет результирующий URL-адрес веб-приложения моей службе.

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

Любые идеи, как это еще можно реализовать?Или, может быть, есть лучший способ?

1 Ответ

0 голосов
/ 20 декабря 2018

Протестировав различные варианты, я решил пойти по пути eval:

var libUrl = 'https://example.com/my-lib-url.js';
// Load My Library from server
function loadLibrary(url: string) {
  // This line is needed only to auto detect Auth scope required for the
  // fetched library. Without this we'd have to provide the required
  // scope in the appscript.json manifest file.
  SpreadsheetApp.getActiveSpreadsheet();

  const key = 'my-lib-contents';
  const cache = CacheService.getScriptCache();
  let lib = cache.get(key);
  if (lib == null) {
    console.log('Fetching library...');
    lib = UrlFetchApp.fetch(url).getContentText();
    cache.put(key, lib, 3600); // cache for 60 minutes
  }
  eval(lib);
}

function doGet(req: any) {
  if (!Mylib.handleGET) loadLibrary(libUrl);
  return result(AccountsManager.handleGET(req));
}

function doPost(req: any) {
  if (!Mylib.handlePOST) loadLibrary(libUrl);
  return result(AccountsManager.handlePOST(req));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...