Google Apps Script withSuccessHandler 运行 在函数完全执行之前

Google Apps Script withSuccessHandler is running before function fully executes

我在 Apps 脚本项目中有两个文件。一个是作为 "server" 的 .gs 文件,另一个是包含 JavaScript 的 .html 文件,符合 Google 的 Apps 脚本指南。

在这个项目的前 40 个小时的开发中,一切都进展顺利。在 .html 文件中的两个标记之间,我在任何函数之外都有以下代码行:

google.script.run.withSuccessHandler(setSheetData).getSheetData();

文档:https://developers.google.com/apps-script/guides/html/reference/run#withSuccessHandler(Function)

根据文档,getSheetData() 应首先在 .gs 文件中执行,然后 return 将一个值传递到 .html 文件中存在的 setSheetData。

服务器文件:

  function getSheetData() {
  var ss = SpreadsheetApp.getActive();
  var activeSheet = ss.getActiveSheet();
  var sheetName = activeSheet.getName();
  var sheetVals = activeSheet.getDataRange().getValues();
  return [sheetName, sheetVals];
}

Html 文件:

function setSheetData(data) {
    alert(data);
    sheetName = data[0];
    sheetData = data[1];
    headers = sheetData[0];
    document.getElementById('sheetLook').innerHTML = 'Looking at sheet: ' + sheetName;
}

我怎么知道这是执行速度的问题: 目前 alert() 调用只打印出 null。它所绘制的 sheet 包含 4 行数据。但是,所有其他事情都保持不变,如果我只是查看具有 0-1 行数据的 sheet,它会正确地提醒整个数据值。

在 getSheetData() 内部,如果我添加 Logger.log(sheetVals),它会正确记录整个 sheet 的数据,无论大小如何。问题是 successhandler 正在执行 before 它有时间评估。

可能的原因:

  • 数据第 3-4 行中的非法 return 值
  • 不存在 active sheet。

解决方案:

  • 避免 returning 非法值,如 Date 对象。或者 JSON.stringify() 他们在 return 发送给客户之前。
  • getSheetByName 或数字而不是 activeness.

参考文献: