3

在我的谷歌Apps腳本應用我看到下面的錯誤:如何獲得對象類型

The script completed but the returned value is not a supported return type

我怎樣才能找出我返回值的類型?我嘗試過:

typeof(obj) 

但我所知道的只是它是一個對象。

僅當緩存爲空且數據從電子表格加載時纔會出現此錯誤。例如。用戶點擊頁面,獲取錯誤,刷新現在加載頁面,緩存在第一次點擊時填充。現在用戶可以繼續使用該頁面,直到緩存失效,然後下一次命中將再次導致該錯誤。

在我閱讀並遵循this document後,今天開始發生此錯誤。以前我的腳本是在模板中加載數據,我現在已經重構使用異步加載:

google.script.run 

我看了一下什麼是在我的網頁發生,爲什麼它的工作從高速緩存和唯一讀取時我可以看到不同的是緩存中的數據已經從JSON字符串中解析出來。當緩存爲空時,爲了保存到緩存中,我必須對該對象進行字符串化,所以不是返回我的原始對象,而是分析剛剛創建的字符串並返回該字符串,現在沒有錯誤。

我不確定錯誤來自哪裏,是Apps Script還是Caja?

爲了返回解析JSON字符串也不是理想的解決方案,這個字符串化/解析對我的原始對象做了什麼來消除錯誤?

當我使用內置的調試器來檢查對象時(在字符串化/解析過程之前和之後),值和類型似乎都與我的最佳檢查能力相同。

這是Apps Script中的錯誤嗎?難道我做錯了什麼?刪除此錯誤的最佳解決方案是什麼?

回答

2

我們可以擴展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