在Google Apps脚本中从服务器端(.gs)传递到客户端(html)时,已知类型的变量将变为“未定义”。

时间:2019-07-02 16:33:45

标签: javascript html google-apps-script web-applications

在google apps脚本中,我有一个带有成功回调函数的html文件,该函数调用服务器端函数,该函数从有问题的电子表格中获取一些数据,然后应将存储在变量中的数据返回到html脚本功能成功。

我已经成功完成了此操作。这就是为什么我如此困惑的原因,由于某种原因,我从服务器端返回的变量一旦返回到客户端函数便变为“未定义”。

我认为这是某种类型错误,因此我一直在尝试将变量(一个非常小的数组,最多包含三个元素)和/或该数组的元素转换为已知类型(字符串,整数),然后将其放入新变量中,并创建一个包含新的已知类型元素的新数组。还使用“ 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显示“未定义”。

我包括了.gs代码的一部分,在该部分中,我要获取要从变量传递的数据,该变量要从带有字符串的datavalidation选项的单元格传递到客户端。我以为这可能正在创建一些奇怪的变量类型或未知的东西,但是正如我所说,我已经用“ typeof”检查了类型,并且flavors数组中的项目确实是字符串。

2 个答案:

答案 0 :(得分:0)

可以传递的内容有一些限制。请阅读此Parameters & Return Values

我做了这个例子,并且有效:

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功能将数据加载到页面上。

答案 1 :(得分:0)

问题:

  • 服务器端函数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;//=========================
}