如何获取对象类型

时间:2013-12-18 17:24:21

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

在我的Google Apps脚本应用中,我看到以下错误:

  

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

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

typeof(obj)

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

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

在我阅读并关注this document后,此错误今天开始发生。以前我的脚本是在模板中加载数据,我现在已经重构为使用以下方式异步加载:

google.script.run

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

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

解析JSON字符串以便返回也不是理想的解决方案,这个字符串化/解析对我的原始对象执行什么操作以消除错误?

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

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

2 个答案:

答案 0 :(得分:4)

我们可以扩展JavaScript对象,让它们告诉我们它们的对象类型,如How do I get the name of an object's type in JavaScript?所示。但是,这不适用于Google Apps脚本对象。

这是我把它放在一起似乎适用于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;
}

这是一个测试程序:

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));
};

结果:

[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

答案 1 :(得分:0)

我知道这是一篇非常古老的文章,但希望让所有人(按照Google的建议在这里找到自己)知道该解决方案不再有效。

我在同一个问题上苦苦挣扎,并尝试了建议的解决方案。看起来Google再次决定更改其产品的功能,而无需告知任何人或更新文档。

该错误消息不再包含对象类型,因此与其获取“ TypeError:在对象中找不到函数foobar”,我们得到“ TypeError:在对象中<插入toString()的输出到此处>>函数foobar”。< / p>

错误消息很可能总是使用toString()方法,并且由于Google从toString()方法中删除了对象类型,所以他们也打破了这种获取对象类型的方法。

我只需要找出对象是数组还是字符串,就可以找到解决办法。

function getObjType(obj) {
  
  // If the object is an array, this will return the stored value,
  // if the object is a string, this will return only one letter of the string
  var type = obj[0];
  if (type.length == 1) {
    return 'string';
  }
  try {
    type = obj.foobar();
  } catch (error) {
    
    // TypeError no longer contains object type, just return 'array'
    Logger.log(error);
    return 'array';
  }
}