2016-02-19 97 views
1

我在谷歌表格中定義瞭如下自定義函數:調試谷歌表自定義功能

/** 
* Finds the maximum value in one column 
* by comparing cells matched in another column, 
* using a comma-delimited lookup in a cell. 
* 
* @param {string} references Comma-delimited string referencing values. 
* @param {array} keys Array of strings to match. 
* @param {array} values Array of values to compare. 
* @return The maximum value of all referenced values. 
* @customfunction 
*/ 
function MAX_LOOKUP(references,keys,values){ 
    if (!references || !keys || !values) return ""; 
    var refs = {}; 
    references.split(/, ?/).forEach(function(key){ refs[key]=1 }); 
    var val,max = -Infinity; 
    for (var i=keys.length;i--;){ 
    if (refs[keys[i]] && (val=values[i])>max) max=val; 
    } 
    return max>-Infinity ? max : ""; 
} 

在電子表格中使用的類似=MAX_LOOKUP(G9,A:A,I:I)始終 - 這會返回一個空字符串。當我在腳本編輯器進行測試,但是,它工作正常:

function test_MAX_LOOKUP(){ 
    var result = MAX_LOOKUP(
    "foo, bar, baz", 
    ["no", "bar", "no", "baz", "foo", "no"], 
    [ 99, 42, 99, 17, 1,  99 ] 
); 
    Logger.log(result); // Is correctly 42 
} 

顯然有我從電子表格和我的測試獲得值之間的差一些,但我如何找出是什麼問題?如果我在函數中設置了斷點,它只會在從腳本編輯器調試時發生。如果我在函數中調用Logger.log調用,則只有在從腳本編輯器運行時才記錄它們。

我怎樣才能看到什麼值被傳遞給我的函數功能?

回答

0

要看看什麼東西被從你的函數返回一個字符串傳遞,使用「打印」風格的調試。例如:

function MAX_LOOKUP(references,keys,values){ 
    return JSON.stringify(references); 
    //return JSON.stringify(keys); 
    //return JSON.stringify(values); 
} 

這是很麻煩的,但你可以一步來回編輯功能來改變所返回的東西,保存腳本之間,然後查看電子表格,看看你的調試答案。 (提示:打開在不同的窗口的電子表格和腳本編輯器,而不是單獨的標籤。)


使用上述技術,我們可以看到,與上述腳本的問題是,一列範圍等A:A返回單值數組,而不是單元格的值。該腳本需要更改爲:

if (refs[keys[i][0]] && (val=values[i][0])>max) max=val;