如何获取对象类型

Joh*_*ohn 7 javascript typeerror google-sheets google-apps-script

在我的 Google Apps Script App 中,我看到以下错误:

脚本已完成但返回的值不是受支持的返回类型

如何找出我返回的值的类型?我试过:

typeof(obj)
Run Code Online (Sandbox Code Playgroud)

但我得到的只是它是一个对象。

此错误仅在缓存为空且数据是从电子表格加载时发生。例如,用户点击页面,得到错误,刷新现在加载页面,因为缓存在第一次点击时被填充。现在用户可以继续使用该页面,直到缓存失效,然后下一次命中将再次导致此错误。

在我阅读并遵循此文档后,今天开始发生此错误。以前我的脚本在模板中加载数据,我现在重构为异步加载使用:

google.script.run
Run Code Online (Sandbox Code Playgroud)

我查看了我的页面中发生的事情,以了解为什么从缓存读取时它会起作用,我唯一能看到的不同之处是缓存中的数据是从 JSON 字符串中解析出来的。当缓存为空时,我必须对对象进行字符串化以保存到缓存中,因此我不是返回我的原始对象,而是解析我刚刚创建的字符串并返回它,现在没有错误。

我不确定错误来自哪里,是 Apps Script 还是 Caja?

解析 JSON 字符串以返回也不是理想的解决方案,这个字符串化/解析对删除错误的原始对象做了什么?

当我使用内置调试器检查对象(在字符串化/解析过程之前和之后)时,值和类型似乎都与我所能检查的最佳状态相同。

这是 Apps 脚本中的错误吗?难道我做错了什么?消除此错误的最佳解决方案是什么?

Mog*_*dad 7

我们可以扩展 JavaScript 对象,让它们告诉我们它们的对象类型,如如何在 JavaScript 中获取对象类型的名称?. 但是,这不适用于 Google Apps Script 对象。

这是我整理的一个 hack,它似乎适用于 GAS 对象。我没有尝试过每一个,但一些主要对象确实有效。

function getObjType(obj) {
  var type = typeof(obj);
  if (type === "object") {
    try {
      // Try a dummy method, catch the error
      type = obj.getObjTypeXYZZY();
    } catch (error) {
      // Should be a TypeError - parse the object type from error message
      type = error.message.split(" object ")[1].replace('.','');
    }
  }
  return type;
}
Run Code Online (Sandbox Code Playgroud)

这是一个测试程序:

function test_getObjType() {
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  Logger.log("Spreadsheet: " + getObjType(spreadsheet));
  var sheet = spreadsheet.getActiveSheet();
  Logger.log("Sheet: " + getObjType(sheet));
  var range = sheet.getActiveCell();
  Logger.log("Range: " + getObjType(range));
  var string = "Hello";
  Logger.log("String: " + getObjType(string));
};
Run Code Online (Sandbox Code Playgroud)

结果:

[13-12-18 23:23:47:379 EST] Spreadsheet: Spreadsheet
[13-12-18 23:23:47:609 EST] Sheet: Sheet
[13-12-18 23:23:47:626 EST] Range: Range
[13-12-18 23:23:47:626 EST] String: string
Run Code Online (Sandbox Code Playgroud)

  • 自 2021 年 2 月 22 日起,getObjType() 似乎不再起作用。从“catch”返回的错误消息字符串如下所示。`5:58:02 PM 信息电子表格:obj.getObjTypeXYZZY 不是函数` `5:58:02 PM 信息表:obj.getObjTypeXYZZY 不是函数` `5:58:02 PM 信息范围:obj.getObjTypeXYZZY 是不是函数``5:58:02 PM 信息字符串:字符串` (2认同)