某些Google Apps脚本函数(如Logger.log()和Utility.formatString())接受无限制的参数。
我想包装对Logger.log()或Utility.formatString()的调用,以便在最里面的函数调用中,我可以在结果字符串前面添加时间戳和我自己的文本。通常你只需.apply
当前模块的功能,但在我的测试中,这不能按预期工作。它会导致TypeError: Cannot find default value for object. (line 14, file "Code")
错误function testMyLogger() {
myLogger('Testing %s %s %s', 'one', 2, 'three');
}
function myLogger() {
// do common things like prefix a timestamp to the first arg
var logdate = Utilities.formatDate(new Date(), Session.getTimeZone(), "yyyy-MM-dd HH:mm:ss");
arguments[0]= logdate + " " + arguments[0];
Logger.log.apply(this, arguments);
// At the above line I get error "TypeError: Cannot find default value for object. (line 14, file "Code")"
// but I expected '<timestamp> Testing one 2.0 three' to the log (View > Logs...)
}
来自java /服务器端。
这是我用于测试的代码。问题:
如果这是一个错误,我也会将其存档在问题跟踪器跟踪器
{{1}}
答案 0 :(得分:3)
尝试Logger.log.apply(Logger, arguments);
答案 1 :(得分:2)
绝对不幸的是,这不起作用,但apply
和map
通常不适用于主机对象上的函数(有时在浏览器中也是这样)。然而,这个可怕的丑陋黑客会为你做伎俩。将Logger.log.apply
替换为:
for (var i = 0, arr = []; i < arguments.length; ++i)
arr.push('arguments[' + i + ']');
eval('Logger.log(' + arr.join() + ')');
或者,如果人们更喜欢简洁可读:
eval('Logger.log(' + [].slice.call(arguments, 0)
.map(function(x, y){ return 'arguments[' + y + ']'; }).join() + ')');
<强>更新强>:
或者,我们可以,只需修复错误:)
我夸大了原始错误的严重性:call
和apply
现在实际上对应用程序脚本宿主对象上95%的方法起作用,但是您碰巧碰到其中一个目前正在工作。不幸的是,我无法解释这种模式,因为你知道哪些模式可以在不引用我们的内部代码的情况下工作。幸运的是,我的一位优秀同事诊断出了这个问题并且已经修好了。 Logger.log.apply(Logger, ...)
将在一两个版本中开始工作。请密切关注发行说明。