Как передать объект JS в функцию сервера, используя google.script.run в Google Apps Script? - PullRequest
3 голосов
/ 06 февраля 2020

Я хочу передать объект в функцию сервера с помощью Google Apps Script. Но у меня проблема с этим:

<?= config.bob ?>
<button type="button" onclick="google.script.run.sayHiObject(<?= config ?>)">
  Run Bob
</button>

Когда я нажимаю кнопку с надписью Запустить Боба , я ожидаю увидеть сообщение с предупреждением:

Привет, Боб!

Но вместо этого он говорит:

Привет, undefined!

Это на странице написано:

Допустимыми параметрами являются JavaScript примитивы, такие как Number, Boolean, String или null, , а также JavaScript объекты и массивы, которые являются состоит из примитивов, объектов и массивов. [Выделение мое]

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

Что я делаю не так?

Рис. 1. Демонстрация. Запустите Алису и Запустите Charl ie, успешно передайте строки в качестве аргументов. Но Run Bob не может передать объект в качестве аргумента.

enter image description here

Code.gs
var TITLE = 'Say hi to:';
var HTML_FILENAME = 'index';
var ui = SpreadsheetApp.getUi();

function handleEdit(e) {
  var template = HtmlService.createTemplateFromFile(HTML_FILENAME);
  template.alice = 'Alice';
  template.config = { bob: 'Bob', charlie: 'Charlie' };
  var htmlOutput = template.evaluate();
  ui.showModalDialog(htmlOutput, TITLE);
}

function sayHi(name) {
  var msg = 'Hi, ' + name + '!';
  ui.alert(msg);
}

function sayHiString(name) {
  sayHi(name);
}

function sayHiObject(config) {
  sayHi(config.name);
}
index. html
<!DOCTYPE html>
  <html>
    <body>
      <?= alice ?>
      <button type="button" onclick="google.script.run.sayHiString(<?= alice ?>)">
        Run Alice
      </button>

      <?= config.bob ?>
      <button type="button" onclick="google.script.run.sayHiObject(<?= config ?>)">
        Run Bob
      </button>

      <?= config.charlie ?>
      <button type="button" onclick="google.script.run.sayHiString(<?= config.charlie ?>)">
        Run Charlie
      </button>
    </body>
  </html>

Ответы [ 2 ]

3 голосов
/ 06 февраля 2020

Как насчет этого ответа? Пожалуйста, подумайте об этом как об одном из нескольких возможных ответов.

Когда template.config = { bob: 'Bob', charlie: 'Charlie' , name: "sample"}; используется как <?= config ?>, <?= config ?> становится [object Object]. При этом возникает такая проблема. С другой стороны, <?= config.charlie ?> становится 'Charlie', что является строкой. По этому скрипт работает. Поэтому, пожалуйста, используйте строковый тип в качестве значения.

Для работы вашего скрипта, как насчет следующей модификации?

Модифицированный скрипт:

От:

<button type="button" onclick="google.script.run.sayHiObject(<?= config ?>)">

Кому:

<button type="button" onclick="google.script.run.sayHiObject(JSON.parse(<?= JSON.stringify(config) ?>))">

А также, в вашем скрипте { bob: 'Bob', charlie: 'Charlie' } нет name Так, например, также, пожалуйста, измените следующим образом.

С:

template.config = { bob: 'Bob', charlie: 'Charlie' };

Кому:

template.config = { bob: 'Bob', charlie: 'Charlie', name: 'sample' };

Ссылка:

Если я неправильно понял ваш вопрос, и это не то направление, в котором вы хотите, я приношу свои извинения.

0 голосов
/ 06 февраля 2020

Привет, попробуйте изменить config на config.bob

в <button type="button" onclick="google.script.run.sayHiObject(<?= config ?>)">

как это

в <button type="button" onclick="google.script.run.sayHiObject(<?= config.bob ?>)">

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