Javascript ScriptError:脚本已完成,但返回值不是受支持的返回类型
所以我整天都在尝试谷歌应用程序脚本和图表API,但不幸的是,我一无所获 我做了很多事情,包括遵循Mogsdad写得很好的教程。以下是我到目前为止的代码——包括那个教程中的代码,但我一直收到一个错误,说脚本已经完成,但返回的类型与接受的不同,或者类似的东西 Dashboard-Code.gs:Javascript ScriptError:脚本已完成,但返回值不是受支持的返回类型,javascript,charts,google-apps-script,google-sheets,google-visualization,Javascript,Charts,Google Apps Script,Google Sheets,Google Visualization,所以我整天都在尝试谷歌应用程序脚本和图表API,但不幸的是,我一无所获 我做了很多事情,包括遵循Mogsdad写得很好的教程。以下是我到目前为止的代码——包括那个教程中的代码,但我一直收到一个错误,说脚本已经完成,但返回的类型与接受的不同,或者类似的东西 Dashboard-Code.gs: /** * Serves HTML of the application for HTTP GET requests. * From gist.github.com/mogsdad/24518dff34
/**
* Serves HTML of the application for HTTP GET requests.
* From gist.github.com/mogsdad/24518dff348ad14d3929
*
* @param {Object} e event parameter that can contain information
* about any URL parameters provided.
*/
function doGet(e) {
var template = HtmlService.createTemplateFromFile('Index');
// Build and return HTML in IFRAME sandbox mode.
return template.evaluate()
.setTitle('Dashboard demo')
.setSandboxMode(HtmlService.SandboxMode.IFRAME);
}
/**
* Return all data from first spreadsheet as an array. Can be used
* via google.script.run to get data without requiring publication
* of spreadsheet.
* From gist.github.com/mogsdad/24518dff348ad14d3929
*
* Returns null if spreadsheet does not contain more than one row.
*/
function getSpreadsheetData() {
// This does not work, see https://code.google.com/p/google-apps-script-issues/issues/detail?id=5233
// var ss = SpreadsheetApp.getActiveSpreadsheet();
// var data = ss.getSheets()[0].getDataRange().getValues();
var sheetId = '1-EE_WDD6QYi257_utUf_D0v5e9Gf8Lj5tETPqqllvxk'; // Replace with your spreadsheet ID. (Ick.)
var data = SpreadsheetApp.openById(sheetId).getSheets()[0].getDataRange().getValues();
return (data.length > 1) ? data : null;
}
Index.html:
<!-- Use a templated HTML printing scriptlet to import common
stylesheet. -->
<?!= HtmlService.createHtmlOutputFromFile('Stylesheet').getContent(); ?>
<html>
<body>
<h1 id="main-heading">Loading...</h1>
<div id="dashboard-div">
<div id="control-div">
<div id="selector-div">
</div>
<div id="selector1-div">
</div>
</div>
<div id="charts-div">
<div id="table-div">
</div>
</div>
</div>
<div class="hidden" id="error-message">
</div>
</body>
</html>
<!-- Store data passed to template here, so it is available to the
imported JavaScript. -->
<script>
</script>
<!-- Use a templated HTML printing scriptlet to import JavaScript. -->
<?!= HtmlService.createHtmlOutputFromFile('JavaScript').getContent(); ?>
加载。。。
和JavaScript.html(我决定坚持Mogsdad所说的):
load('45',{packages:['corechart']});
google.charts.setOnLoadCallback(drawChart);
//加载可视化API和所需的包。
load('visualization','1.0',{'packages':['controls']});
/**
*在加载对话框时运行初始化。
*/
$(函数(){
//将回调设置为在加载Google Visualization API时运行。
//注意:也可以通过google.load选项完成。
setOnLoadCallback(sendQuery);
//如果需要,在此处为对话框元素分配处理程序函数。
//在此处调用服务器以检索生成所需的任何信息
//如有必要,请打开该对话框。
});
/**
*发出对电子表格数据的异步请求。
*来自gist.github.com/mogsdad/60dcc416ed74fceb5f9
*/
函数sendQuery(){
google.script.run
.withSuccessHandler(drawDashboard)
.withFailureHandler(函数(msg){
//在此处响应故障条件。
$('主标题').text(msg);
$(“#主标题”).addClass(“错误”);
$(“#错误消息”).show();
})
.getSpreadsheetData();
}
/**
*使用响应参数中的数据生成可视化的回调函数。
*来自gist.github.com/mogsdad/60dcc416ed74fceb5f9
*
*@param{Object[][]}两维可视化数据数组
*/
功能面板(响应){
$(“#主标题”).addClass(“隐藏”);
如果(响应==null){
警报('错误:源数据无效')
返回;
}
否则{
//将电子表格内容(数组)转换为数据表对象
var data=google.visualization.arrayToDataTable(响应,false);
var dashboard=newgoogle.visualization.dashboard(document.getElementById('dashboard-div'));
var table=new google.visualization.ChartWrapper({
“图表类型”:“表格”,
“containerId”:“表分区”
});
var categoryPicker=new google.visualization.ControlWrapper({
“controlType”:“CategoryFilter”,
“containerId”:“选择器div”,
“选项”:{
“filterColumnLabel”:“类别”
}
});
var subcategory picker=new google.visualization.ControlWrapper({
“controlType”:“CategoryFilter”,
“containerId”:“selector1 div”,
“选项”:{
“filterColumnLabel”:“类别”
}
});
//设置控件和图表之间的依赖关系
dashboard.bind([categoryPicker,subCategoryPicker],表);
//绘制仪表板的所有可视化组件
仪表盘.绘图(数据);
}
}
我不需要数字过滤器,我所需要的只是一个级联下拉+表格
如果有人给我指点,我将不胜感激。我哪里做错了?我不认为问题出在JS.html文件中——这可能与从Google工作表中获取数据有关。首先,不需要两个图表库,
jsapi
&loader.JS
根据
通过jsapi
loader仍然可用的谷歌图表版本不再持续更新。从现在起,请使用新的gstaticloader.js
接下来,将回调设置为不存在的函数 这里-->
google.charts.setOnLoadCallback(drawChart)代码>
建议安装类似于以下内容
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script src="https://www.gstatic.com/charts/loader.js"></script>
<script>
// Load the Visualization API and desired package(s).
google.charts.load('45', {
callback: sendQuery,
packages: ['controls', 'corechart']
});
/**
* Issue asynchronous request for spreadsheet data.
* From gist.github.com/mogsdad/60dcc4116ed74fceb5f9
*/
function sendQuery() {
google.script.run
.withSuccessHandler(drawDashboard)
.withFailureHandler(function(msg) {
// Respond to failure conditions here.
$('#main-heading').text(msg);
$('#main-heading').addClass("error");
$('#error-message').show();
})
.getSpreadsheetData();
}
/**
* Callback function to generate visualization using data in response parameter.
* From gist.github.com/mogsdad/60dcc4116ed74fceb5f9
*
* @param {Object[][]} Two-Dim array of visualization data
*/
function drawDashboard(response) {
$('#main-heading').addClass("hidden");
if (response == null) {
alert('Error: Invalid source data.')
return;
}
else {
// Transmogrify spreadsheet contents (array) to a DataTable object
var data = google.visualization.arrayToDataTable(response,false);
var dashboard = new google.visualization.Dashboard(document.getElementById('dashboard-div'));
var table = new google.visualization.ChartWrapper({
'chartType': 'Table',
'containerId': 'table-div'
});
var categoryPicker = new google.visualization.ControlWrapper({
'controlType': 'CategoryFilter',
'containerId': 'selector-div',
'options': {
'filterColumnLabel': 'Category'
}
});
var subCategoryPicker = new google.visualization.ControlWrapper({
'controlType': 'CategoryFilter',
'containerId': 'selector1-div',
'options': {
'filterColumnLabel': 'Category'
}
});
// Set up dependencies between controls and charts
dashboard.bind([categoryPicker,subCategoryPicker], table);
// Draw all visualization components of the dashboard
dashboard.draw(data);
}
}
</script>
。隐藏{
显示:无;
}
加载。。。
Hey@WhiteHat-感谢您的回复。所以我接受了代码并实现了它,但仍然得到了完全相同的错误。想法?你认为错误在于getSpreadsheetData()函数吗?console.log从Dashboard-Code.gs文件中不起作用,在其他任何地方都起作用。你认为我还能做些什么吗?在看到你的编辑之前,我刚刚开始研究这个问题。非常感谢!你让我开心。
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script src="https://www.gstatic.com/charts/loader.js"></script>
<script>
// Load the Visualization API and desired package(s).
google.charts.load('45', {
callback: sendQuery,
packages: ['controls', 'corechart']
});
/**
* Issue asynchronous request for spreadsheet data.
* From gist.github.com/mogsdad/60dcc4116ed74fceb5f9
*/
function sendQuery() {
google.script.run
.withSuccessHandler(drawDashboard)
.withFailureHandler(function(msg) {
// Respond to failure conditions here.
$('#main-heading').text(msg);
$('#main-heading').addClass("error");
$('#error-message').show();
})
.getSpreadsheetData();
}
/**
* Callback function to generate visualization using data in response parameter.
* From gist.github.com/mogsdad/60dcc4116ed74fceb5f9
*
* @param {Object[][]} Two-Dim array of visualization data
*/
function drawDashboard(response) {
$('#main-heading').addClass("hidden");
if (response == null) {
alert('Error: Invalid source data.')
return;
}
else {
// Transmogrify spreadsheet contents (array) to a DataTable object
var data = google.visualization.arrayToDataTable(response,false);
var dashboard = new google.visualization.Dashboard(document.getElementById('dashboard-div'));
var table = new google.visualization.ChartWrapper({
'chartType': 'Table',
'containerId': 'table-div'
});
var categoryPicker = new google.visualization.ControlWrapper({
'controlType': 'CategoryFilter',
'containerId': 'selector-div',
'options': {
'filterColumnLabel': 'Category'
}
});
var subCategoryPicker = new google.visualization.ControlWrapper({
'controlType': 'CategoryFilter',
'containerId': 'selector1-div',
'options': {
'filterColumnLabel': 'Category'
}
});
// Set up dependencies between controls and charts
dashboard.bind([categoryPicker,subCategoryPicker], table);
// Draw all visualization components of the dashboard
dashboard.draw(data);
}
}
</script>