以前、Apps ScriptからSlackにKPIメッセージを送っていたのですが、別プロジェクトでHipChatででも送りたくなったのでメモを記載しておきます。
はじめに
メッセージを送るにはTokenが入ります。API access Tokenには各種あるのですが、今回はpersonal access tokenを使います。ここのリンクからCreate new tokenで、「Send Message」と「Send Notification」のアクセストークンを作ります。
Send Message API
簡易的なメッセージを送るためのAPIです。指定できるのはメッセージのみで1~1000文字までです。
送信すると以下のようになります。
Apps Scriptのコードは以下となります。Send Message
のほうのTokenを使います。
function sendMessage() {
var room_id_or_name = "bot_test";
var params = {
"contentType" : "application/json",
"method": "post",
'payload' : JSON.stringify({"message": "test"})
};
var responseString = UrlFetchApp.fetch(getMessageRequestURL(room_id_or_name), params).getContentText();
Logger.log(responseString);
}
function getMessageRequestURL(room_id_or_name){
var authToken = "xxx";
var url = "http://api.hipchat.com/v2/room/" + room_id_or_name + "/message";
return url + '?auth_token=' + authToken;
}
Send Room Notification API
リッチなフォーマットのメッセージが送れます。各メッセージのサンプルはSending Messageのリンクにあります。
messageは1-10000文字までです。TokenはNotification用のを使います。
TextのNotification
まずはTextで送ってみます。デフォルトで黄色のcolorがついています。
コードは以下です。
function sendNotification() {
var room_id_or_name = "bot_test";
var params = {
"contentType" : "application/json",
"method": "post",
'payload' : JSON.stringify({"message": "test"})
};
var responseString = UrlFetchApp.fetch(getNotificationUrl(room_id_or_name), params).getContentText();
Logger.log(responseString);
}
function getNotificationUrl(room_id_or_name) {
var authToken = "xxx";
var url = "http://api.hipchat.com/v2/room/" + room_id_or_name + "/notification";
return url + '?auth_token=' + authToken;
}
HTMLのNotification
KPIを送る事を想定して、HTMLのテーブルを使って送ってみます。
以下のような「レポート」シートがGoogleスプレッドシートにあるとします。
結果は以下のようになりました。Slackではテーブルで出せないので、HipChatのほうがいい感じにだせます。
以下のコードで実行できます。tokenとssID(スプレッドシートのID)は適当なものにしてください。
var ssId = 'xxx';
function sendNotification() {
var room_id_or_name = "bot_test";
var params = {
"contentType" : "application/json",
"message_format": "html",
"method": "post",
'payload' : JSON.stringify({"message": getHtmlTable()})
};
var responseString = UrlFetchApp.fetch(getNotificationUrl(room_id_or_name), params).getContentText();
Logger.log(responseString);
}
function getNotificationUrl(room_id_or_name) {
var authToken = "yyy";
var url = "http://api.hipchat.com/v2/room/" + room_id_or_name + "/notification";
return url + '?auth_token=' + authToken;
}
function getHtmlTable() {
var sheetName = 'レポート';
var sheet = SpreadsheetApp.openById(ssId).getSheetByName(sheetName);
var data = sheet.getSheetValues(1, 1, sheet.getMaxRows(), 3)
var kpi_date = sheet.getRange(1, 2).getValue();
var msg = "KPIレポート";
msg += "<table>"
for (var i = 0; i < data.length; i++) {
var row_msg = "";
for (var j = 0; j < data[i].length; j++) {
var value = data[i][j];
if (value == '' && i != 0) continue;
if (Number(value) === value && value % 1 !== 0) {
value = (value * 100).toFixed(2) + "%";
}
if (value instanceof Date) {
value = formatDate(value, "MM月DD日");
}
if (j == 0 || j == 1 || j == 2) { // 2, 3列目
if (typeof value === 'string') {
value = value.replace(/ /g, " ");
}
var output = HtmlService.createHtmlOutput();
output.appendUntrusted(value);
if (i == 0) {
row_msg += '<th>' + output.getContent() + "</th>";
} else {
row_msg += '<td>' + output.getContent() + "</td>";
}
}
}
msg += "<tr>" + row_msg + "</tr>";
}
msg += "</table>"
msg = msg.replace(/<tr><\/tr>/gi, "");
Logger.log(msg);
return msg;
}
function formatDate(date, format) {
if (!format) format = 'YYYY-MM-DD hh:mm:ss.SSS';
format = format.replace(/YYYY/g, date.getFullYear());
format = format.replace(/MM/g, ('0' + (date.getMonth() + 1)).slice(-2));
format = format.replace(/DD/g, ('0' + date.getDate()).slice(-2));
format = format.replace(/hh/g, ('0' + date.getHours()).slice(-2));
format = format.replace(/mm/g, ('0' + date.getMinutes()).slice(-2));
format = format.replace(/ss/g, ('0' + date.getSeconds()).slice(-2));
if (format.match(/S/g)) {
var milliSeconds = ('00' + date.getMilliseconds()).slice(-3);
var length = format.match(/S/g).length;
for (var i = 0; i < length; i++) format = format.replace(/S/, milliSeconds.substring(i, i + 1));
}
return format;
};
なお、ユーザとしてではなくRoom Notification TokensとしてTokenを取得する場合は、ルーム事に、取得する必要があります。設定で以下のようにして取得してください。
まとめ
REST APIをつかえば、Apps ScriptからHipChatにKPIレポートを送る事ができました。
KPIをチームに定期的に共有し、いい感じにプロダクト改善していきましょう!