在我的Google Apps脚本应用中,我看到以下错误:
脚本已完成,但返回的值不是支持的返回类型
如何找出我要返回的值的类型?我试过了:
typeof(obj)
但我得到的是,它是一个对象。
仅当缓存为空且从电子表格加载数据时才会出现此错误。例如。用户点击页面,获取错误,刷新现在加载页面,因为在第一次点击时填充了缓存。现在,用户可以继续使用该页面,直到缓存失效,然后下一次点击将再次导致此错误。
在我阅读并关注this document后,此错误今天开始发生。以前我的脚本是在模板中加载数据,我现在已经重构为使用以下方式异步加载:
google.script.run
我看了一下我的页面中发生了什么,当它从缓存读取时它是如何工作的,我唯一能看到的不同之处是缓存中的数据是从JSON字符串解析的。当缓存为空时,我必须对对象进行字符串化以便保存到缓存中,因此我不是返回原始对象,而是解析我刚刚创建的字符串并返回它,现在没有错误。
我不确定错误来自哪里,是Apps脚本还是Caja?
解析JSON字符串以便返回也不是理想的解决方案,这个字符串化/解析对我的原始对象执行什么操作以消除错误?
当我使用内置调试器检查对象时(在字符串化/解析过程之前和之后),值和类型似乎都与我能够检查的能力相同。
这是Apps脚本中的错误吗?难道我做错了什么?删除此错误的最佳解决方案是什么?
答案 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';
}
}