Jps*_*psy 33 google-docs google-sheets google-apps-script custom-function
我正在尝试在Apps脚本中为Google电子表格创建我的第一个自定义函数,并且我很难使用调试器.
我正在研究Google文档中的自定义函数演示代码,我在自定义函数drivingDistance(origin, destination)中设置了一个断点,该函数在我的电子表格的单元格中使用.我遇到的问题是,调试器显示传递给函数的参数undefined.但是,执行期间创建的任何其他变量的内容都会正确显示(只要它们不依赖于输入参数).
有趣的是,虽然输入参数显示为未定义,但函数的计算成功,因此这似乎是一个调试器问题.不幸的是,这个问题阻止我成功学习创建和调试自己的代码(因为我将不得不使用复杂的输入参数).
我感觉问题与Apps脚本的服务器端执行有关,因此我尝试使用Logger类记录输入参数,并且我还尝试将这些变量复制到新的局部变量中.但我想出的只是undefined.
另一个奇怪的提示是,typeof参数返回String.但是获取它们的长度会引发错误并尝试将它们与另一个字符串连接起来会返回字符串"undefined"(请参阅我的屏幕转储).

我正在寻找有关这里发生的事情的见解.
Mog*_*dad 39
调试器可能不会骗你 - 如果你在调试器中启动该函数,它将没有传递给它的参数.不用担心,您只需要确保获得用于调试的值.看看如何在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());
}
Run Code Online (Sandbox Code Playgroud)
你明白了.您仍然可以在函数内设置断点,或者用于debugger暂停执行.
从电子表格调用时,自定义函数接收的参数是什么?
由于调试器在从Sheets调用时无法用于检查自定义函数,并且自定义函数的安全限制阻止了日志记录,因此您可以对调试此操作进行限制.一般来说,理解一般的论证可能就足够了.虽然javascript函数可能具有命名参数,但所有参数都作为类似于Array的对象传递,称为arguments.此自定义函数将返回一个报告收到的参数的数组.从电子表格调用时,每个参数都将出现在自己的单元格中,从您输入函数的单元格开始:
function testArguments( ) {
var argArray = [];
for (var arg in arguments) {
argArray.push("arguments[" + arg + "] = " + JSON.stringify(arguments[arg]))
}
return argArray;
}
Run Code Online (Sandbox Code Playgroud)

在javascript中,没有像int或float这样的类型 - 只是Number.这些参数将在没有引号的情况下显示,看起来像数字.日期作为Date对象到达,但以这种方式打印时显示为Date-y字符串.字符串有引号.
自定义函数永远不会将范围作为参数接收; 当您在电子表格中提供范围参数时,其内容将被收集到一维或二维数组中,并且数组是参数.
您可以使用此 hack 来查看发送到自定义函数中的参数的结构:
function TEST(input) {
return (JSON.stringify(input));
}
Run Code Online (Sandbox Code Playgroud)
结果将显示在您的工作表中,如下所示:
| 归档时间: |
|
| 查看次数: |
14601 次 |
| 最近记录: |