如何将调用包含在接受无限参数的Google Apps脚本函数中

时间:2013-04-09 21:39:47

标签: javascript google-apps-script rhino

某些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. 这是这些Apps Script方法中的错误吗?
  2. 是否有解决方法或替代方法来实现我的目标?
  3. 如果这是一个错误,我也会将其存档在问题跟踪器跟踪器

    {{1}}

2 个答案:

答案 0 :(得分:3)

尝试Logger.log.apply(Logger, arguments);

答案 1 :(得分:2)

绝对不幸的是,这不起作用,但applymap通常不适用于主机对象上的函数(有时在浏览器中也是这样)。然而,这个可怕的丑陋黑客会为你做伎俩。将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() + ')');

<强>更新

或者,我们可以,只需修复错误:)

我夸大了原始错误的严重性:callapply现在实际上对应用程序脚本宿主对象上95%的方法起作用,但是您碰巧碰到其中一个目前正在工作。不幸的是,我无法解释这种模式,因为你知道哪些模式可以在不引用我们的内部代码的情况下工作。幸运的是,我的一位优秀同事诊断出了这个问题并且已经修好了。 Logger.log.apply(Logger, ...)将在一两个版本中开始工作。请密切关注发行说明。