Переменная известного типа становится неопределенной при передаче со стороны сервера (.gs) на сторону клиента (html) в скрипте Google Apps - PullRequest
0 голосов
/ 02 июля 2019

В скрипте приложений Google у меня есть HTML-файл с функцией обратного вызова onsuccess, которая вызывает функцию на стороне сервера, которая собирает некоторые данные из рассматриваемой электронной таблицы, а затем возвращает данные, хранящиеся в переменной, обратно вфункция html-скрипта onsuccess.

Я уже сделал это раньше успешно.Вот почему я так озадачен, почему по какой-то причине переменная, которую я возвращаю со стороны сервера, становится «неопределенной», как только она возвращается к функции на стороне клиента.

Я предположил, что это какой-то типОшибка, поэтому я поиграл с преобразованием переменной (которая является очень маленьким массивом с максимум тремя элементами) и / или элементами массива в известные типы (string, int), а затем поместил их в новые переменные и сделалновый массив, который содержит новые элементы известного типа.также проверил исходные элементы массива, используя «typeof», и они, как и ожидалось, являются строками, поэтому я стал еще более запутанным, потому что это не похоже на TypeError.

html функция обратного вызова: (отредактировановниз, чтобы показать основы)

google.script.run.withSuccessHandler(

          function (flavors) 
           {            
            console.log(flavors);  // undefined
           }
        ).getBatchFlavs();

code.gs: (отредактировано, чтобы показать основы)

function getBatchFlavs() {

  var ss = SpreadsheetApp.getActive();
  var sheet = ss.getSheetByName("Flavoring");
  var data = sheet.getDataRange().getValues();
  var flavCell = sheet.getRange(1,3);

  data.forEach(function(row,i) {

    var rule = flavCell.getDataValidation();

      if (rule != null) 
        {
          var flavs = rule.getCriteriaValues(); 
          var flavors = flavs[0]; 

          Logger.log(flavors);  // shows exactly what i'm expecting
          Logger.log(typeof flavors);                 

          return flavors;  
        }
  })
}

console.log печатает "undefined".

Я включил часть кода .gs, где я получаю данные для переменной, которую я хочу передать на стороне клиента из ячейки с опциями проверки данных, которые являются строками.я подумал, что, возможно, это создает какой-то странный тип переменной или что-то неизвестное, но, как я уже сказал, я уже проверил тип с помощью "typeof", и элементы в массиве flavors действительно являются строками.

Ответы [ 2 ]

0 голосов
/ 02 июля 2019

Проблема:

  • Нет возвращаемого значения из серверной функции getBatchFlavs(). return flavors; возвращает значение только анонимной функции обратного вызова, переданной в Array#forEach.

Решение:

  • return что-то из функции, вызываемой из google.script.run - getBatchFlavs()

Отрывок:

function getBatchFlavs() {//<================
  data.forEach(function(row, i) {//<==      |
    if (rule != null) {//            |      |
      var flavors = flavs[0];//      |      |
      Logger.log(flavors); //        |      |
      return flavors;//==============       |
    }//                                     |
  });//                                     |
  return flavors;//=========================
}
0 голосов
/ 02 июля 2019

Есть некоторые ограничения в том, что можно передать. Пожалуйста, прочтите это Параметры и возвращаемые значения

Я сделал этот пример, и это работает:

function showmydialog() {
  var html='<html><head><script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.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>';
  html+='<div id="tst"></div>';
  html+='<script>$(function(){google.script.run.withSuccessHandler(function(vA){$("#tst").html(vA.join());}).getMyFlavors();});</script>';
  var ui=HtmlService.createHtmlOutput(html);
  SpreadsheetApp.getUi().showModelessDialog(ui, "Flavors");
}

function getMyFlavors() {
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getSheetByName('Sheet2');
  var rg=sh.getRange('A1');//this has the data validation from the flavors named range
  var rule = rg.getDataValidation();
  if (rule != null) 
  {
    var flavs = rule.getCriteriaValues();      
    //return flavs[0].getValues();  
    return rule.getCriteriaValues()[0].getValues().map(function(r){return r[0];}); //This should flatten out the array.
  }
}

Я создал именованный диапазон под названием flavors.

Вот так выглядит моя таблица:

enter image description here

Вот так выглядит мой диалог:

enter image description here

Данные загружаются на страницу с помощью функции dom ready.

...