используйте значение из поля ввода в диалоговом окне html, чтобы изменить код.gs с помощью скрипта Google Apps - PullRequest
1 голос
/ 29 апреля 2020

У меня есть диалоговое окно, в котором пользователь может выбрать год. Затем я хочу, чтобы сервер обработал выбранное значение в функции doSomethingWithCompetitionYear (theYear).

Посмотрел несколько обсуждений, но не может заставить его работать. Похоже, мне нужно что-то сделать с .withSuccesHandler ().

Code.gs

function fncOpenMyDialog() {
  //Open a dialog
  var htmlDlg = HtmlService.createTemplateFromFile('DropDown_NewCompetitionFile');
  thisYear = new Date();
  htmlDlg.thisYear = thisYear.getFullYear();
  htmlDlg.nextYear = htmlDlg.thisYear + 1;

  htmlDlg = htmlDlg.evaluate()
      .setSandboxMode(HtmlService.SandboxMode.IFRAME)
      .setWidth(200)
      .setHeight(150);
  SpreadsheetApp.getUi()
      .showModalDialog(htmlDlg, 'Make selection');
};

function doSomethingWithCompetitionYear(theYear) {
  var ui = SpreadsheetApp.getUi();
  ui.alert(theYear);  
}

HTML do c

<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
  </head>
  <body>

Year
<select name="Competition_year" id="Competition_year" type="integer">
  <option value=<?= thisYear?>><?= thisYear?></option>
  <option value="nextYear"><?= nextYear?></option>
</select>

<hr/>

<button onmouseup="closeDia()">Submit</button>

<script>
  var theYear = document.getElementById("Competition_year").value;   
  google.script.run.doSomethingWithCompetitionYear();
  window.closeDia = function() {
    google.script.host.close();
  };
</script>


  </body>
</html>

Ответы [ 2 ]

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

Ситуация:

Если я вас правильно понимаю, у вас есть диалоговое окно с двумя вариантами, и вы хотите передать информацию о выбранном параметре (в данном случае 2020 или 2021) в функция на стороне сервера doSomethingWithCompetitionYear(); при нажатии кнопки Submit.

Проблемы:

В этом случае вам не нужен обработчик успеха. Вам просто нужно передать выбранное значение в качестве параметра doSomethingWithCompetitionYear(theYear);.

Кроме того, если вы хотите, чтобы это произошло при нажатии кнопки Submit. Вы должны добавить это к функции closeDia. В противном случае, doSomethingWithCompetitionYear(); будет выполняться перед отправкой.

Наконец, если вы хотите пропустить следующий год (2021), а не строку «nextYear», вам придется использовать scriplets в значении элемента.

Модификация 1. Значение следующего года:

Заменить это:

<option value="nextYear"><?= nextYear?></option>

Для этого:

<option value=<?= nextYear?>><?= nextYear?></option>

Изменение 2. Вызов функции на стороне сервера при нажатии кнопки:

Замените это:

<script>
  var theYear = document.getElementById("Competition_year").value;   
  google.script.run.doSomethingWithCompetitionYear();
  window.closeDia = function() {
    google.script.host.close();
  };
</script>

Для этого:

<script>
  window.closeDia = function() {
    var theYear = document.getElementById("Competition_year").value;   
    google.script.run.doSomethingWithCompetitionYear(theYear); // theYear parameter has to be passed to server-side function
    google.script.host.close();
  };
</script>

Примечание:

  • Если вы хотите использовать информацию, поступающую из doSomethingWithCompetitionYear(theYear); на стороне клиента, вам следует использовать обработчик успеха, который может вызвать функцию на стороне клиента, которая получит эти данные в качестве параметра (на стороне сервера) функция, вызываемая google.script.run, ничего не возвращает сама по себе, ей нужна функция обратного вызова). Было бы что-то вроде этого:
google.script.run.withSuccessHandler(yourClientSideFunction).doSomethingWithCompetitionYear(theYear);

Ссылка:

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

Вот простой пример работы с .withSuccessHandler

Я добавил несколько JQuery, msgdiv, withSuccessHandler () и серверную функцию doSomethingWithCompetitionYear ().

<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
      <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
      <link rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">
      <script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>

  </head>
  <body>

Year
<select name="Competition_year" id="Competition_year" type="integer">
  <option value=<?= thisYear?>><?= thisYear?></option>
  <option value="nextYear"><?= nextYear?></option>
</select>

<hr/>

<button onmouseup="closeDia()">Submit</button>
<div id="msgdiv"></div>
<script>
  var theYear = document.getElementById("Competition_year").value;   
  google.script.run
  .withSuccessHandler(function(msg){
     document.getElementById("msgdiv").innerHTML=msg;
  }))
  .doSomethingWithCompetitionYear();
  window.closeDia = function() {
    google.script.host.close({year:$("#competition_year").val()});
  };
</script>
  </body>
</html>

code.gs:

function doSomethingWithCompetitionYear(obj) {
  return Utilities.formatString('I did something with this year: %s',obj.year);
}
...