客户端 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.