客户端successHandler获取null,但服务器日志显示结果

时间:2016-07-25 12:13:07

标签: javascript google-apps-script google-sheets google-docs

我正在尝试在Google工作表边栏内的HTML iframe中列出Google电子表格的所有编辑器。正如您在下面的代码中看到的,我在Logger中显示结果;它在那里工作,向我显示编辑列表。但是当我使用google.script.run将结果传递给HTML文件时,它似乎在路上“迷路”。我没有收到任何错误,只是侧栏中的“空”列表。

我在.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时,它显示编辑器列表很好......似乎数据在途中“丢失”。

1 个答案:

答案 0 :(得分:2)

您传递了一系列Google Apps脚本User objects,因为只有简单的对象可以返回到客户端 * ,结果为null

解决此问题的一种方法是使用getEmail()将每个用户的地址作为字符串,并返回其中的数组:

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的文档说返回值的规则(对successHandlers)与服务器端函数的参数相同,具体为:

  

合法参数是JavaScript原语,如Number,Boolean,String或null,以及由基元,对象和数组组成的JavaScript对象和数组。