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

Client successHandler gets null, but server logs show results

本文关键字:服务器 日志 显示 结果 successHandler null 客户端      更新时间:2023-09-26

我正试图在Google Sheet侧边栏内的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时,它会显示编辑器列表。。。数据似乎在传输过程中"丢失"了。

您正在传递一个Google Apps Script User对象数组,由于只有简单的对象可以返回到客户端*,因此结果为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对象和数组。