Google App Scriptを使ってBigQueryからサービス利用状況を取得してSlackに通知する

はじめに

Google App Script(GAS)を使ってBigQueryからサービス利用状況を取得してSlackに通知するメモです。

ゴール

Slackにこんな感じで毎日1回通知するのが今日のゴールです。

スクリーンショット 2015-12-22 13.00.34.png

スクリプト

Google Driveから 新規 > その他 > Google App Script を選択してファイルを新規作成します。

function createAPIUsageReport() {
  saveConfig();
  runQuery();
}

function saveConfig() {
  PropertiesService.getScriptProperties().setProperty("token", "Slack Web APIのToken");
  PropertiesService.getScriptProperties().setProperty("projectId", "GCPのプロジェクトID");
}

function postMessage(message) {
  var prop = PropertiesService.getScriptProperties().getProperties();
  var slackApp = SlackApp.create(prop.token);
  var channelId = slackApp.channelsList().channels[0].id;
  slackApp.postMessage(channelId, message, {
    username : "hoge",
    icon_url : "アイコンのURL"
  });
}

function runQuery() {
  var prop = PropertiesService.getScriptProperties().getProperties();
  var projectId = prop.projectId;
  var request = {
    query: 'SELECT TOP(word, 300) AS word, COUNT(*) AS word_count FROM publicdata:samples.shakespeare WHERE LENGTH(word) > 10;'
  };
  var queryResults = BigQuery.Jobs.query(request, projectId);
  var result = JSON.stringify(parseSimpleResults(queryResults));
  var message = dateFormat.format(new Date(), 'yyyy/MM/dd') + ' サービス利用状況\n' + result;
  postMessage(message);
}

定時実行設定

トリガー設定から定時実行の設定ができます。「日タイマー」の場合は「午前0時〜1時」とあり、その間に実行されるのでしょうか... 試してみます。

スクリーンショット 2015-12-22 13.43.46.png

まとめ

Apps Script BigQuery

上記サイトのサンプルコードでスプレッドシート出力も簡単にできました。今後はグラフ化とかやってみたいです..

参考

queryResultsのパース、JSの日付フォーマットは以下を参考にしました。

javascriptで日付フォーマッタ

Google App Script. JSON from BigQuery.Jobs.query response

function parseSimpleResults(results) {
  var names = results.schema.fields.map(function(field){ return field.name; });
  return results.rows.map(function(row) {
    var obj = {};
    for( var i = 0, len = names.length; i < len; ++i ) {
      obj[names[i]] = row.f[i].v;
    }
    return obj;
  });
}

dateFormat = {
  fmt : {
    "yyyy": function(date) { return date.getFullYear() + ''; },
    "MM": function(date) { return ('0' + (date.getMonth() + 1)).slice(-2); },
    "dd": function(date) { return ('0' + date.getDate()).slice(-2); },
    "hh": function(date) { return ('0' + date.getHours()).slice(-2); },
    "mm": function(date) { return ('0' + date.getMinutes()).slice(-2); },
    "ss": function(date) { return ('0' + date.getSeconds()).slice(-2); }
  },
  format:function dateFormat (date, format) {
    var result = format;
    for (var key in this.fmt)
      result = result.replace(key, this.fmt[key](date));
    return result;
  }
};

Slack API

Apps Script BigQuery Service

TipMe

TipMe with IndieSquare