2012-11-14 46 views
1

我正在嘗試將一個dumpObject函數添加到Spreadsheet Container綁定的腳本中。typeof在觸發器對象屬性上失敗

理想的情況下,它是可見性通過觸發器傳遞的變量。

我可以在腳本編輯器中整天運行它,但是當設置爲onEdit事件或onEdit Installible觸發器時,它會死亡並且沒有錯誤。

我做了一些試驗和錯誤敬酒消息,並確認正在從觸發執行中dumpObject的代碼。

如果你把下面這段代碼,設置onEdit2作爲可安裝扳機,你可能會看到它。

要查看它作爲觸發器工作,請取消onEdit2的第一行// e。

最好我可以認爲,是來自觸發器的e對象中的東西不是預期的對象?

此測試應該將maxDepth限制爲5,所以我認爲我沒有達到1000深度限制。

UPDATE:問題是在觸發器對象屬性上調用typeof。例如,「typeof運算e.user」報告以下錯誤:類型的JavaScript值無效

感謝, 吉姆

function onEdit2(e) { 
    //e = {fish:{a:"1",b:"2"},range:SpreadsheetApp.getActiveSpreadsheet().getActiveRange(),B:"2"}; 
    Browser.msgBox(typeof e); 
    Browser.msgBox("U:" + Utilities.jsonStringify(e)); 
    e.range.setComment("Edited at: " + new Date().toTimeString()); 

    Browser.msgBox("ShowOBJ:"+dumpObject(e, 5)); 

} 

function dumpObject(obj, maxDepth) { 
    var dump = function(obj, name, depth, tab){ 
    if (depth > maxDepth) { 
    return name + ' - Max depth\n'; 
    } 

    if (typeof obj === 'object') { 
    var child = null; 
    var output = tab + name + '\n'; 
    tab += '\t'; 
    for(var item in obj){ 
     child = obj[item]; 
     if (typeof child === 'object') { 
     output += dump(child, item, depth + 1, tab); 
     } else { 
     output += tab + item + ': ' + child + '\n'; 
     } 
    } 
    } 
    return output; 
    }; 
    return dump(obj, '', 0, ''); 
} 

回答

0

這可能不是一個很好的「答案」,但它的工作原理。

我發現用Object.prototype.toString.call(obj)替換typeof我得到了一些可用的東西。

值得注意的是,電子對象返回[對象對象],但性質(e.user)返回[對象Java對象]

if (Object.prototype.toString.call(obj).indexOf("object") != -1) { 
    var child = null; 
    var output = tab + name + '\n'; 
    tab += '\t'; 
    for(var item in obj){ 
    child = obj[item]; 
    if (Object.prototype.toString.call(child).indexOf("object") != -1) { 
     output += dump(child, item, depth + 1, tab); 
1

你沒有得到你挺從事件對象的期望。如果你在扔:

for(var q in e) { 
    Logger.log(q + " = " + e[q]) 
} 

再查查看 - >登錄腳本編輯器菜單項,你

source = Spreadsheet 
user = <your user> 

所以,檢查docs,你能想出這個作爲一種替代您e.range.setComment("Edited at: " + new Date().toTimeString());

e.source.getActiveSheet().getActiveCell().setComment("Edited at: " + new Date().toTimeString()); 

記:你可以像你(祕密)通過在嘗試捕捉,像這樣包裝一下你的說法得到調試一個錯誤:

try { 
    e.range.setComment("Edited at: " + new Date().toTimeString()); 
    } catch (ex) { 
    Logger.log(ex); 
    } 

然後檢查如上所述的日誌(或傾銷到Browser.msgBox(),如果您願意的話)。

+0

謝謝布萊恩,非常有幫助的調試技巧。 – JimCampbell

相關問題