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 脚本中的错误吗?难道我做错了什么?消除此错误的最佳解决方案是什么?
我们可以扩展 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)
| 归档时间: |
|
| 查看次数: |
13198 次 |
| 最近记录: |