[GAS]スクリプトのエラーを管理画面で確認しよう!という話

# スクリプトのエラーを管理画面で確認しよう!という話

## 前説

Tokyo GASに参加してきたときに

(登壇者)「みんな[https://script.google.com/](https://script.google.com/)使ってる?」
(会場)「なんじゃそら?すごいのか?」
(登壇者)「エラー内容を console.log で管理画面に吐き出しておけるよ?」
(会場)「うぉぉぉぉぉぉぉぉ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!」

となったかどうかはさておいて、個人的にはなった。
だって、今までメールやSlackにエラー内容飛ばして必死になってエラー検知して、エラー再現して、やっとこさ原因突き止めてってやって面倒な作業を省力化できるのだから。
とりあえず、エラー起こったことさえ分かれば後は管理画面見て「はいはい、このエラーね」ってなってれば情報も溜まるしすごい便利。データ溜まるし。

[イベレポ(更新止まってますけど)](https://qiita.com/s_maeda_fukui/items/68c491f29bf8fda0e1ff#_reference-f4940a524fcdb88d596b)

## ドキュメントを見てみる
とりあえず、[公式ドキュメント](https://developers.google.com/apps-script/guides/logging)を見てみる。
難しいが頑張ろう。
普段使っているLogger.logではだめなようだ。
どうも[Stackdriver Logging](https://developers.google.com/apps-script/guides/logging#stackdriver_logging)というやつを使うらしい。

### What's Stackdriver Logging
What's Stackdriver Logging...? Mr. Google Says

>Apps Script also provides partial access to Google Cloud Platform's Stackdriver Logging.

Hahaha.... I see?
ということで、GASでStackingdriver Loggingを使うと、Google Cloud Platformにログを残してくれるよってことらしい。

### Stackdriver Loggingを使ってみよう
Goolgeさんのサンプルコードに初心者級のコメントを付け足してみました。

```javascript
function measuringExecutionTime() {
  // A simple INFO log message, using sprintf() formatting.
  // 懐かしの printf と同じ感じ %s → 'myFn\unction' %d → 1 が入っている。
  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.time(label) とセット
  console.timeEnd(label);      // Stops the timer, logs execution duration.
}
```

### 結果を見てみよう
1. 上記の関数を実行
2. [https://script.google.com/](https://script.google.com/)に行く
3. 該当Projectを検索して見つける
4. 開く > Projectの詳細 > Stackdriverのログ

でログ画面を見ることができる。
![キャプチャ_log.PNG](https://qiita-image-store.s3.amazonaws.com/0/219427/1d3bd906-c857-b237-e66d-76bf5aa19bd7.png)
ほうほう・・・確かに、関数の中で送っているやつがいる。
もっと細かく見たかったら、ポチポチするか、全て展開ボタンで展開していく。
![キャプチャ_details.PNG](https://qiita-image-store.s3.amazonaws.com/0/219427/5b744621-2cbc-d1f5-dc5e-4a085b6bc1aa.png)


## Stackdriver Loggingの私的理解

### console.info( string [, values ]);
私は学生のころC言語だったので、C言語のprintfを思い出した。
シンプルに使えるので、ちょっと残そうと思ったことなんかに使いやすそうである。

### console.log({message: string, initialData: object});
デバッグレベルでJSONデータを渡すときに使うんだ－!的なことがコメントに書かれている。
非エンジニアの私にはあまり使う機会はないかもしれない。

`message: string` ここが、ログ表示のときのラベルになるっぽい。
オブジェクトはサンプルコードでは、

```Javascript
var parameters = {
  isValid: true,
  content: 'some string',
  timestamp: new Date()
};
```

となっている。

### console.error(string);
try-catch文と組み合わせて、エラーを吐いてくれるらしい。
これ、使い方をもっと調べる必要はあるけれど、ものすごく便利。
画面もエラーの場合は stackdriver errorのログに表示されてくれるので、分けて確認することができるらしい。

### console.time(label) / console.timeEnd(label)
セットで使用するとみた。
`console.time(label)` ～ `console.timeEnd(label)` の実行時間を計測してlabelをつけて表示してくれる。
今まで、いちいち時間計測して、あーどこが重いんだろうとかやってたあの時間を一掃できる!!!!
不死鳥関数とあわせて、もう無敵なのだ。苦笑
[[GAS]実行時間6分の壁を越えよう(不死鳥関数編)](https://qiita.com/s_maeda_fukui/items/d194c6408803229fe1b9)

## 後記
まだまだ使っていくうちに、利点も欠点もわかってくると思われる。
諸先輩方、アドバイスお願いします!!

## 参考
[公式ドキュメント](https://developers.google.com/apps-script/guides/logging)