调试 Google 表格自定义函数

Debugging a Google Sheets Custom Function

本文关键字:自定义函数 表格 Google 调试      更新时间:2023-09-26

我在谷歌表格中定义了以下自定义函数:

/**
 * 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调用,则仅在我从脚本编辑器运行时记录它们。

如何查看哪些值被传递给我的函数函数?

若要查看传递的内容,请使用"print"样式调试,方法是从函数返回字符串。例如:

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;