乱立するGoogleスプレッドシートから逃げるように、Mackerelのサービスメトリクスに投稿して監視してみた

# みんな大好きGoogleスプレッドシート

みなさん、Googleスプレッドシートは好きですか？

私たち「[あなたのマイスター](https://yourmystar.jp/)」では無事、大量のGoogleスプレッドシートが増産されています！w

マスタ系のデータやテストケースとかは関係ないのですが、**KPI系の数値はグラフで見たい**ってこともよくあって、スプレッドシートのグラフを活用しています。

しかし、定期的に入れ替わる測定項目や、大元のシートに変更があったりして混乱が起きることが・・・

はい、日常ですよね。

「[あなたのマイスター](https://yourmystar.jp/)」ではシステムのモニタリングをMackerelで行なっています。

毎日そこは目に触れてるので、サービスのKPIトラッキングも併せて表示すれば、**エンジニアたちが頻度高く見てくれるようになる！** と少し心踊り、少しずつMackerelに寄せていきたいと思うようになりました。

そして、そんなGoogleスプレッドシートとめちゃくちゃ相性がいいのが、GAS(Google Apps Script)です。

以下にGASを使って、Mackerelのサービスメトリクスにデータを連携する方法を紹介します。

![無題のプレゼンテーション_-_Google_スライド-2.png](https://qiita-image-store.s3.amazonaws.com/0/154018/89f4af76-b887-3ce7-3ff5-b99920d2677f.png)


# Mackerelの設定を確認する

1. オーガニゼーションページを表示する
`https://mackerel.io/orgs/{オーガニゼーション名}`

2. APIキーのタブを選択する
![yourmystar_·_yourmystar.png](https://qiita-image-store.s3.amazonaws.com/0/154018/7e494b5d-dcaa-a285-8026-89a9e8329c98.png)

3. APIキーをコピーしておく

# スプレッドシートを準備する

1. スプレッドシートを新規作成
もちろん、もともと存在するスプレッドシートでも構いません。
例えば以下のようなスプレッドシートを準備したとします。

| a | b | c |
|--:|--:|--:|
| 1 | 10 | 100 |
| 2 | 20 | 200 |
| 3 | 30 | 300 |
| 4 | 40 | 400 |
| 5 | 50 | 500 |
| 6 | 60 | 600 |
| 7 | 70 | 700 |

2. シート名をコピーしておく（あとで使う）
ここでは `watashi-no-sheet` というシート名だったと仮定します。

# Google Apps Scriptを書く

1. スプレッドシートの ツール > スクリプトエディタ を開く
自動でエディタが開きます。
![無題のプロジェクト_と_Viber__818044151622.png](https://qiita-image-store.s3.amazonaws.com/0/154018/e80492fb-8b42-7216-bc3a-bc4a597c11e3.png)


2. コードを書く
下記がサンプルコードです。外部APIにPOSTするところは相手がMackerelじゃなくても応用がきくと思います。例えば、SlackのIncoming WebhookとかにPOSTすれば通知なんかもできると思います。


```code.js
var epoch = Date.now() / 1000; // Mackerel投稿用タイムスタンプ
var mackerelApiKey = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; // MackerelのAPIキー
var mackerelServiceName = "sandbox"; // サービスメトリクスを投稿したいMackerelのサービスネーム
var sheetName = "watashi-no-sheet"; // スプレッドシートのシート名

function main() {
  var ss =SpreadsheetApp.getActiveSpreadsheet()
  var sheet = ss.getSheetByName(sheetName)
  SpreadsheetApp.setActiveSheet(sheet);
  
  // ここは自分の取りたいセルを選べるように、いろんな書き方があると思います
  var row = sheet.getLastRow(); // 最終行を取得
  var a = sheet.getRange(row, 1).getValue(); // 最終行の１列目（先ほどの例の7）
  var b = sheet.getRange(row, 2).getValue(); // 最終行の2列目（先ほどの例の70）
  var c = sheet.getRange(row, 3).getValue(); // 最終行の3列目（先ほどの例の700）

  var payload = [
    {"name" : "testmetrics.a", "time" : epoch, "value" : a},
    {"name" : "testmetrics.b", "time" : epoch, "value" : b},
    {"name" : "testmetrics.c", "time" : epoch, "value" : c}
  ];

  var response = post(mackerelApiKey, mackerelServiceName, payload);

}

function post(apiKey, mackerelServiceName, payload) {
  var headers = {
    "X-Api-Key" : apiKey
  };
  var options = {
    'contentType' : 'application/json',
    'method': 'POST',
    'headers': headers,
    'payload': JSON.stringify(payload),
    'muteHttpExceptions' : true
  };

  var response = UrlFetchApp.fetch('https://api.mackerelio.com/api/v0/services/'+ mackerelServiceName + '/tsdb', options);

  var json = response.getContentText();
  var data = JSON.parse(json);

  return data;
}
```

# Google Apps Scriptを実行する

1. 実行 > 関数を実行 > main を選択する
2. Mackerelのサービスメトリクス表示画面を見ると、すぐにグラフが現れて数字を見ることができます。

![sandbox_·_yourmystar-2.png](https://qiita-image-store.s3.amazonaws.com/0/154018/ec256478-822d-b1e3-045b-57c2ee32a6f0.png)

# Google Apps Scriptのトリガーを設定する

1. トリガーのボタンを選択する
![Qiita投稿選手権-2.png](https://qiita-image-store.s3.amazonaws.com/0/154018/8eec008d-d597-b959-3fef-00b999c0786b.png)


2. 何分ごとに動かすか設定する
![Qiita投稿選手権.png](https://qiita-image-store.s3.amazonaws.com/0/154018/75841666-d631-79ea-9d24-f32585df7d0e.png)

以上で完了です。

あとは、スプレッドシートに好きな数字を入れておいて、GASの定期実行でMackerelのモニタリングが可能になります。

# 参考

http://www.yasuhisay.info/entry/2016/12/06/000000

https://qiita.com/chihiro/items/09c996d41d80f0d30e17

http://pineplanter.moo.jp/non-it-salaryman/2016/05/20/google-apps-script-minute-timer/

なんの苦労もなく、いろんなサービスを連携できるようになったので、本当に便利な世の中になったなあ。
個人的に初めて使うサービスだったので、そこに至った方法を丁寧に残しておきました。