2016-02-19 95 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;