web-dev-qa-db-ja.com

Google Apps Scriptの未処理の例外

プライベートスプレッドシートデータにアクセスできるパブリックWebアプリを作成しました。 intry..catchで例外をキャッチしてログに記録できますが、

  1. ブラウザwindow.onerrorなどの未処理の例外をすべてキャッチすることは可能ですか?
  2. どこかで未処理の例外のログを表示できますか?
  3. 「サービスが何度も呼び出された」などの例外によって、アプリが実行されないこともあるため、ここでは間違いなく例外を処理できません。そのような種類の例外を持つログはありますか?

これらは非常に単純な質問なので、質問するのは少し混乱していますが、数時間の調査の後、答えを見つけることができませんでした。

前もって感謝します。

7
tenbits

これらは現在対処されている問題です。現在、Appsスクリプトの早期アクセスプログラムには、これらのケースを処理する2つの新しい追加機能があります。 1つは、stackdriverロギングとgoogle.script.run.withLogger()の追加とのネイティブ統合です。

まず最初に、EAPを申請する必要があります。

https://developers.google.com/apps-script/guides/apps-script-eap

Stackdriver Logging:

Stackdriverにログを記録するために、consoleオブジェクトがサーバー側に追加されました。

code.gs

_console.log('This will log to stackdriver')  
_

consoleのすべてのメソッドのドキュメントをご覧ください。

https://developers.google.com/apps-script/guides/logging#stackdriver_logging

ドキュメントの例:

_function measuringExecutionTime() {
  // A simple INFO log message, using sprintf() formatting.
  console.info('Timing the %s function (%d arguments)', 'myFunction', 1);

  // Log a JSON object at a DEBUG level. The log is labeled
  // with the message string in the log viewer, and the JSON content
  // is displayed in the expanded log structure under "structPayload".
  var parameters = {
      isValid: true,
      content: 'some string',
      timestamp: new Date()
  };
  console.log({message: 'Function Input', initialData: parameters});

  var label = 'myFunction() time';  // Labels the timing log entry.
  console.time(label);              // Starts the timer.
  try {
    myFunction(parameters);         // Function to time.
  } catch (e) {
    // Logs an ERROR message.
    console.error('myFunction() yielded an error: ' + e);
  }
  console.timeEnd(label);     
  }
_

さらに、スクリプトプロパティで_Log Exceptions_を確認することもできます。これにより、スクリプトでエラーが発生するたびにstackdriverエントリが生成されます。

Webアプリでのエラー回復

Webアプリで障害から回復するには、_google.script.run_オブジェクトにあるwithFailureHandler()メソッドにアクセスできます。これにより、スクリプトが例外にヒットした場合にコールバックを登録できます。

完全なドキュメントは次の場所にあります。

https://developers.google.com/apps-script/guides/html/reference/run

_try...catch_を使用してサーバー側のチェックを行っている場合、例外が発生する可能性がありますが、正常に処理されます。この場合、withFailureHandler()は実行されず、onSuccessHandler()はエラーを処理するのに最適な場所ではありません。 EAPには、_google.script.run_へのwithLoggerメソッドがあります。現時点では、google.script.run.withLogger()のドキュメントはありません。 devtoolsを掘り下げて見つけました。 withLogger()を使用すると、stackdriverエントリが作成されるたびにコールバックとして関数を登録できます。これは、スクリプトプロパティで_log exceptions_がチェックされている場合に特に役立ちます。この意味で、それはwithFailureHandler()に少し似ていますが、サーバー側のconsoleオブジェクトを介して追加したスタックドライバーエントリによってトリガーできます。

index.html

_<script>
  google.script.run
        .withSuccessHandler(function(){console.log('OK')})
        .withFailureHandler(function(e){console.error(e)})
        .withLogger(function(e){console.warn("The following log was generated:"+e)})
        .serverFunctionCall();
</script>
_

code.gs

_function serverFunctionCall(){
   console.log("This log will generate a callback");
   return true;

}
_
7
Spencer Easton