在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数组中的项目确实是字符串。
答案 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的命名范围。
这是我的电子表格的外观:
这是我的对话框的样子:
通过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;//=========================
}