42

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

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

有趣的是,虽然输入参数显示为未定义,但函数的计算成功了,所以这似乎是调试器的问题。不幸的是,这个问题使我无法成功地学习创建和调试自己的代码(因为我将不得不使用复杂的输入参数)。

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

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

调试器截图

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

4

2 回答 2

50

调试器可能不会对您撒谎——如果您在调试器中启动该函数,它将没有传递给它的参数。不过不用担心,您只需要确保获得用于调试的值。看看如何在 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暂停执行。


编辑 - 检查参数

从电子表格调用时,自定义函数接收哪些参数?

你可以做些什么来调试它是有限的,因为当从表格调用时,调试器不能用于检查你的自定义函数,并且自定义函数的安全限制会阻止日志记录。了解一般的论点传递可能就足够了。虽然 javascript 函数可能具有命名参数,但所有参数都作为类似数组的对象传递,称为arguments. 此自定义函数将返回一个报告接收到的参数的数组。从电子表格调用时,每个参数将出现在其自己的单元格中,从您输入函数的单元格开始:

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

  return argArray;
}

截屏

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

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

于 2013-11-29T14:59:52.537 回答
8

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

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

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

在此处输入图像描述

于 2019-02-15T03:20:28.173 回答