Объект на стороне сервера теряется при передаче клиентскому коду - PullRequest
0 голосов
/ 30 мая 2018

Это не то же самое, что Значения свойств объекта теряются на стороне сервера при передаче объекта через google.script.run

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

Если я запускаю приведенный ниже код, используя Run> Test as add-on ..., он показывает мое меню два раза

  1. Как пользовательское меню с именем "Sidebar", рядом сМеню справки
  2. В качестве дополнительного меню в меню «Дополнения»> «Мой проект»
  • Когда я нажимаю боковую панель> Открыть, нажимая кнопки боковой панели getMail()возвращает undefined
  • Когда я нажимаю «Надстройка»> «Мой проект»> «Открыть», при нажатии кнопок боковой панели getMail(), как и ожидалось, возвращается активный адрес электронной почты пользователя.

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

Чего мне не хватает?

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

Электронная таблица для использования в качестве библиотеки

Code.gs

function onOpen(e) {
  var ui = SpreadsheetApp.getUi();
  var menu = ui.createMenu('Sidebar');
  menu
    .addItem('Open', 'showSidebar')
    .addToUi();
}

function showSidebar() {
  var ui = HtmlService.createHtmlOutputFromFile('Sidebar')
    .setSandboxMode(HtmlService.SandboxMode.IFRAME)
    .setTitle('A Sidebar');
  SpreadsheetApp.getUi().showSidebar(ui);

}

function getEmail() {
  return Session.getActiveUser().getEmail();
}

Sidebar.html

<!DOCTYPE html>
<html>

<head>
  <base target="_top">
  <script>
    function updateButton(email, button) {
      console.log(email);
      button.value = 'Clicked by ' + email;
    }
  </script>
</head>

<body>
  <input type="button" value="Not Clicked" onclick="google.script.run
          .withSuccessHandler(updateButton)
          .withUserObject(this)
          .getEmail()" />
  <input type="button" value="Not Clicked" onclick="google.script.run
          .withSuccessHandler(updateButton)
          .withUserObject(this)
          .getEmail()" />
</body>

</html>

ПримерДругие функции, используемые для замены getMail ()

function getCellValue(){
  return SpreadsheetApp.getActiveCell().getValue();
}

function getGreeting(){
  return 'Hello world';
}

Электронная таблица для использования в качестве клиента библиотеки

  1. Добавление библиотеки в проект
  2. Добавьте приведенный ниже код

    для функции onOpen (e) {aLib.onOpen (e);}

    function showSidebar () {aLib.showSidebar ();}

    function getEmail () {aLib.getEmail ();}

Тестировать как дополнение ...

  1. Нажмите Run> Test as add-on
  2. Добавить "Таблицу, чтобы бытьиспользуется как клиент библиотеки »как документ, который будет использоваться для тестирования в качестве дополнения
  3. Запустите документ

1 Ответ

0 голосов
/ 30 мая 2018

Согласно https://developers.google.com/apps-script/guides/html/communication#private_functions google.script не может получить доступ к функциям библиотеки, но похоже, что он также не может получить доступ к объектам библиотеки.

Решение состоит в том, чтобы использовать глобальные переменные

Электронная таблица для использования в качестве библиотеки

Code.gs

/* For tests only, assign the server side function
 * to be called from the sidebar to a global variable 
 */
var email = getEmail(); 

/**
 * Reference: https://stackoverflow.com/q/50595103/1595451
 *
 */
function onOpen(e) {
  var ui = SpreadsheetApp.getUi();
  var menu = ui.createMenu('Sidebar');
  menu
    .addItem('Open', 'showSidebar')
    .addToUi();
}

function showSidebar() {
  var ui = HtmlService.createHtmlOutputFromFile('Sidebar')
    .setSandboxMode(HtmlService.SandboxMode.IFRAME)
    .setTitle('A Sidebar');
  SpreadsheetApp.getUi().showSidebar(ui);

}

function getEmail() {
  return Session.getActiveUser().getEmail();
}

Электронная таблица для использования в качестве клиента библиотеки

Code.gs

var email = aLib.email;

function onOpen(e) {
  aLib.onOpen(e);
}

function showSidebar(){
  aLib.showSidebar();
}

function getEmail(){
  /* Instead of calling the library function we call the library global variable */
  return email; 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...