繁体   English   中英

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

[英]Variable of known type becomes “undefined” when passed from server side (.gs) to client-side(html) in Google Apps Script

在Google Apps脚本中,我有一个带有onsuccess回调函数的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数组中的项目确实是字符串。

可传递的内容有一些限制。 请阅读此参数和返回值

我做了这个例子,这个作品:

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的命名范围。

这是我的电子表格的外观:

在此处输入图片说明

这是我的对话框的样子:

在此处输入图片说明

数据通过dom ready功能加载到页面上。

问题:

  • 服务器端函数getBatchFlavs()没有返回值。 return flavors; 仅将值返回给传递给Array#forEach匿名回调函数。

解:

  • google.script.run调用的函数中return一些内容getBatchFlavs()

片段:

function getBatchFlavs() {//<================
  data.forEach(function(row, i) {//<==      |
    if (rule != null) {//            |      |
      var flavors = flavs[0];//      |      |
      Logger.log(flavors); //        |      |
      return flavors;//==============       |
    }//                                     |
  });//                                     |
  return flavors;//=========================
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM