google.script.run.withSuccessHandler пропускает функцию onSuccess - PullRequest
0 голосов
/ 30 мая 2018

Я пытаюсь заполнить элемент select в моем HTML-файле данными из электронной таблицы, к которой привязан скрипт.

Пока у меня есть код ниже для newDeal.html.Пустой элемент select (id = "contactname") - это тот, который мне нужно заполнить данными, возвращаемыми функцией arr_customers ():

    <!DOCTYPE html>
<html>
  <head>
    <base target="_top">
    <link rel="stylesheet" href="https://ssl.gstatic.com/docs/script/css/add-ons1.css">
  </head>
  <body onload="onload()">
    <p>Contact name:</p>
    <select id="contactname" autocorrect="on" autocomplete="on">
    </select>
  </body>
  <script>
         var vals;
         function placeCustomers(values) {
            var select = document.getElementById("contactname");
            for(var i = 0; i < values.length; i++) {
                Logger.log(i);
                var opt = values[i];
                var el = document.createElement('option');
                el.textContent = opt;
                el.value = opt;
                select.appendChild(el);
            }
          }
          function onload() {
            placeCustomers(vals);
          }
          function onSuccess(values) {
            vals = values;
          }
          google.script.run.withSuccessHandler(onSuccess).arr_customers();
  </script>
</html>

На стороне сервера у меня есть функция arr_customers, котораявозвращает выбранные элементы из листа «Список клиентов».Функция отлично работает при запуске в одиночку и возвращает массив с именами (например: ['Bruno', 'Neymar']):

function arr_customers() {
      var tbl = SpreadsheetApp.openById('my-spreadsheet-id').getSheetByName('Customers List').getDataRange().getValues();
      var return_array = [];
      for (var i = 1; i < tbl.length; i++) {
        if (tbl[i][6] == 'C') { // condition needed for customer to go to list    
            return_array.push(tbl[i][1]);
        }
      }
      return return_array;
    }

И наконец, код для пользовательского меню, чтобы открытьмодальное диалоговое окно:

function uiBuilder() {
  var ui = SpreadsheetApp.getUi();
  ui.createMenu('Project')
    .addItem('Create new project...', 'newProject')
   .addToUi();
}
function newProject() {
  var html = HtmlService.createHtmlOutputFromFile('newDeal');
  SpreadsheetApp.getUi().showModalDialog(html, 'New Project');
}

Проблема в том, что функция onSuccess не работает после того, как arr_customer вернул значение.Я использовал несколько журналов, чтобы обнаружить это.Я даже прокомментировал весь ненужный код и попытался запустить его через пользовательский интерфейс Spreadhseets с одной строкой «Logger.log ('test')" в функции onSuccess, и в журнале ничего не появилось.

Кто-нибудь знает, почему это происходит?Я видел документацию Google, там написано withSuccessHandler:

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

Может быть, я что-то упускаю, если кто-то знает,Пожалуйста, поделитесь:)

1 Ответ

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

решено

Вот окончательный код для newDeal.html, который работал:

<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
    <link rel="stylesheet" href="https://ssl.gstatic.com/docs/script/css/add-ons1.css">
    <style>
      body {
        padding-left: 10px;
      }
    </style>
  </head>
  <body onload='updateCustomers()'>
    <p>Nome do Contato:</p>
    <select id="slContato" name="Contato" autocorrect="on" autocomplete="on">
    </select>
  </body>
  <script>
          function placeCustomers(values) {
            var select = document.getElementById("slContato");
            for(var i = 0; i < values.length; i++) {
                var opt = values[i];
                var el = document.createElement("OPTION");
                el.textContent = opt;
                el.value = opt;
                select.appendChild(el);
            }
          }

          function updateCustomers() {
            google.script.run.withSuccessHandler(placeCustomers).arr_clientes();
          }
  </script>
</html>

Кажется, почему-то это была проблема с Logger.log().После того, как я удалил все строки журнала из кода HTML, все заработало!

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