Google App Scriptを使ってBigQueryからサービス利用状況を取得してSlackに通知する
はじめに
Google App Script(GAS)を使ってBigQueryからサービス利用状況を取得してSlackに通知するメモです。
ゴール
Slackにこんな感じで毎日1回通知するのが今日のゴールです。
スクリプト
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時」とあり、その間に実行されるのでしょうか... 試してみます。
まとめ
上記サイトのサンプルコードでスプレッドシート出力も簡単にできました。今後はグラフ化とかやってみたいです..
参考
queryResultsのパース、JSの日付フォーマットは以下を参考にしました。
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; } };