在Google Apps脚本中调试自定义功能

时间:2013-11-29 14:51:04

标签: google-apps-script google-sheets google-docs custom-function

我正在尝试在Apps脚本中为Google电子表格创建我的第一个自定义函数,但我很难使用调试器。

我正在使用Google文档中的custom function demo code,我在自定义函数drivingDistance(origin, destination)中设置了一个断点,该函数在我的电子表格的单元格中使用。我遇到的问题是,调试器将传递给函数的参数显示为undefined。执行期间创建的任何其他变量的内容都会正确显示(只要它们不依赖于输入参数)。

有趣的是,尽管输入参数显示为未定义,但函数的计算成功,因此这似乎是一个调试器问题。不幸的是,这个问题阻止我成功学习创建和调试自己的代码(因为我将不得不使用复杂的输入参数)。

我感觉问题与Apps脚本的服务器端执行有关,因此我尝试使用Logger类记录输入参数,并且我还尝试将这些变量复制到新的局部变量中。但我想出的只有undefined

另一个奇怪的提示是typeof个参数返回String。但是获取它们的长度会引发错误并尝试将它们与另一个字符串连接起来会返回字符串“undefined”(请参阅​​我的屏幕转储)。

enter image description here

我正在寻找有关这里发生的事情的见解。

2 个答案:

答案 0 :(得分:36)

调试器可能不是骗你的 - 如果你在调试器中启动该函数,它将没有传递给它的参数。不用担心,您只需要确保获得用于调试的值。请查看How can I test a trigger function in GAS?,其中演示了可应用于自定义函数的技术。

您需要提供(或从电子表格中检索)参数值,而不是定义要传递给函数的事件。

function test_drivingDistance() {
  // Define a set of test values
  var testSet = [[ 'Washington, DC', 'Seattle, WA' ],
                 [ 'Ottawa, ON', 'Orlando, FL'],
                 [ 'Paris, France', 'Dakar, Senegal']];

  // Run multiple tests
  for (var test in testSet) {
    Logger.log('Test ' + test + ' = ' + drivingDistance(testSet[test][0],testSet[test][1]));
  }

  // Get parameters from sheet
  var TestFromSheet = drivingDistance(ss.getRange('A1').getValue(),ss.getRange('A2').getValue());
}

你明白了。您仍然可以在函数内设置断点,或使用debugger暂停执行。


编辑 - 检查参数

从电子表格调用时自定义函数接收的参数是什么?

由于调试器在从Sheets调用时无法用于检查自定义函数,并且自定义函数的安全限制阻止了日志记录,因此您可以对此进行调试。一般来说,理解一般的论证可能就足够了。虽然javascript函数可能具有命名参数,但所有参数都作为类似于Array的对象传递,称为arguments。此自定义函数将返回一个报告收到的参数的数组。从电子表格调用时,每个参数都将出现在自己的单元格中,从您输入函数的单元格开始:

function testArguments(  ) {
  var argArray = [];
  for (var arg in arguments) {
    argArray.push("arguments[" + arg + "] = " + JSON.stringify(arguments[arg]))
  }

  return argArray;
}

Screenshot

在javascript中,没有像int或float这样的类型 - 只有Number。这些参数将在没有引号的情况下显示,看起来像数字。日期作为Date对象到达,但以这种方式打印时显示为Date-y字符串。字符串有引号。

自定义函数永远不会将范围作为参数接收;当您在电子表格中提供范围参数时,其内容将被收集到一维或二维数组中,并且数组是参数。

答案 1 :(得分:0)

您可以使用此技巧来查看要发送到自定义函数中的参数的结构:

function TEST(input) {
  return (JSON.stringify(input));
}

结果将显示在您的工作表中,如下所示:

enter image description here