客户端 successHandler 为空,但服务器日志显示结果
Client successHandler gets null, but server logs show results
我试图在 Google Sheet 侧边栏内的 HTML iframe 中列出 Google 电子表格的所有编辑者。正如您在下面的代码中看到的,我在 Logger 中显示了结果;它在那里工作,向我展示了编辑列表。但是当我使用 google.script.run
将结果传递给 HTML 文件时,它似乎在途中 "get lost"。我没有收到任何错误,只有侧边栏中的 'null' 列表。
我在 .gs 中有以下代码:
function myFunction() {
var html = HtmlService.createHtmlOutputFromFile('form1');
SpreadsheetApp.getUi() // Or DocumentApp or FormApp.
.showSidebar(html);
}
function editores() {
var editors = SpreadsheetApp.getActiveSpreadsheet().getEditors();
for (var i = 0; i < editors.length; i++) {
var editor = editors[i];
Logger.log(editor)
}
return editors;
}
而 HTML 中的这段代码:
<!DOCTYPE html>
<html>
<head>
<base target="_top">
<script>
function listEditors(editors) {
for (var i = 0; i < editors.length; i++) {
var eltag = document.getElementById('edit').innerHTML;
var edit = editors[i];
document.getElementById('edit').innerHTML = eltag+'<br/>'+edit;
}
}
google.script.run.withSuccessHandler(listEditors).editores();
</script>
</head>
<body>
<p id='edit'></p>
</body>
</html>
当我执行 myFunction()
时,它会打开显示 "null" 列表的边栏。但是当我在脚本控制台中打开 Logger 时,它显示编辑器列表很好......似乎数据是 "lost" 正在通过。
您正在传递一组 Google Apps 脚本 User objects,因为只有简单的对象可以 returned 到客户端*,结果为null
.
解决此问题的一种方法是使用 getEmail()
将每个用户的地址作为字符串获取,并 return 一个数组:
function editores() {
var editors = SpreadsheetApp.getActiveSpreadsheet().getEditors();
var editorStrArray = [];
for (var i = 0; i < editors.length; i++) {
var editor = editors[i];
Logger.log(editor);
editorStrArray.push(editor.getEmail())
}
return editorStrArray;
}
*google.script.run
的文档说 return 值(对 successHandlers)的规则与服务器端函数的参数相同,具体来说:
Legal parameters are JavaScript primitives like a Number, Boolean, String, or null, as well as JavaScript objects and arrays that are composed of primitives, objects, and arrays.
我试图在 Google Sheet 侧边栏内的 HTML iframe 中列出 Google 电子表格的所有编辑者。正如您在下面的代码中看到的,我在 Logger 中显示了结果;它在那里工作,向我展示了编辑列表。但是当我使用 google.script.run
将结果传递给 HTML 文件时,它似乎在途中 "get lost"。我没有收到任何错误,只有侧边栏中的 'null' 列表。
我在 .gs 中有以下代码:
function myFunction() {
var html = HtmlService.createHtmlOutputFromFile('form1');
SpreadsheetApp.getUi() // Or DocumentApp or FormApp.
.showSidebar(html);
}
function editores() {
var editors = SpreadsheetApp.getActiveSpreadsheet().getEditors();
for (var i = 0; i < editors.length; i++) {
var editor = editors[i];
Logger.log(editor)
}
return editors;
}
而 HTML 中的这段代码:
<!DOCTYPE html>
<html>
<head>
<base target="_top">
<script>
function listEditors(editors) {
for (var i = 0; i < editors.length; i++) {
var eltag = document.getElementById('edit').innerHTML;
var edit = editors[i];
document.getElementById('edit').innerHTML = eltag+'<br/>'+edit;
}
}
google.script.run.withSuccessHandler(listEditors).editores();
</script>
</head>
<body>
<p id='edit'></p>
</body>
</html>
当我执行 myFunction()
时,它会打开显示 "null" 列表的边栏。但是当我在脚本控制台中打开 Logger 时,它显示编辑器列表很好......似乎数据是 "lost" 正在通过。
您正在传递一组 Google Apps 脚本 User objects,因为只有简单的对象可以 returned 到客户端*,结果为null
.
解决此问题的一种方法是使用 getEmail()
将每个用户的地址作为字符串获取,并 return 一个数组:
function editores() {
var editors = SpreadsheetApp.getActiveSpreadsheet().getEditors();
var editorStrArray = [];
for (var i = 0; i < editors.length; i++) {
var editor = editors[i];
Logger.log(editor);
editorStrArray.push(editor.getEmail())
}
return editorStrArray;
}
*google.script.run
的文档说 return 值(对 successHandlers)的规则与服务器端函数的参数相同,具体来说:
Legal parameters are JavaScript primitives like a Number, Boolean, String, or null, as well as JavaScript objects and arrays that are composed of primitives, objects, and arrays.