2

Logger.log() や Utility.formatString() などの一部の Google Apps Script 関数は、無制限の引数を受け入れます。

Logger.log() または Utility.formatString() への呼び出しをラップして、最も内側の関数呼び出しで、結果の文字列の前にタイムスタンプと独自のテキストを付けることができるようにします。通常は.apply、現在のモジュールの ags を関数に渡すだけですが、私のテストでは期待どおりに動作しません。Java/サーバー側からのものと思われるエラーTypeError: Cannot find default value for object. (line 14, file "Code")が発生します。

テストに使用したコードは次のとおりです。質問:

  1. これはこれらの Apps Script メソッドのバグですか?
  2. 私の目的を達成するための回避策または代替方法はありますか?

バグの場合は、Issue Tracker Tracker にもファイルします

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...)
}
4

2 に答える 2

3

試すLogger.log.apply(Logger, arguments);

于 2013-04-09T21:40:40.763 に答える
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() + ')');

更新

または、バグを修正することもできます:)

元のバグの重大度を大げさに言い過ぎました。現在、apps スクリプト ホスト オブジェクトのメソッドの 95%callapply実際に動作していますが、現在動作していないメソッドの 1 つに遭遇しました。残念ながら、内部コードを参照せずにどのパターンが機能するかを知るために、パターンを説明することはできません。幸いなことに、私の優秀な同僚の 1 人が問題を診断し、既に修正しています。Logger.log.apply(Logger, ...)1つか2つのリリースで動作を開始します。リリースノートに注目してください。

于 2013-04-10T00:52:22.583 に答える