はじめに
業務でSlackに吐き出しているログからエラーログだけ抽出したいなと思って作成しました。
アプリからSlackに向けてログを出力している前提になりますが、全件取得から検索などにも使えるので参考程度にぜひ。
目次
Slack用App作成
-
SlackAPI(こちらのサイトでCreate an APPをクリック)
APPの作成方法は通常と変わらないので今回は省略します。
スコープは以下の通りに設定してください。(これをしないと動きません。)
-
スコープの設定が必要な理由
今回はconversations.historyというSlackのAPIを使用します。公式で、スコープの指定(Required scopes)が載っているので、こちらを全て追加する必要があります。多い分には問題ないですし、後でスコープの追加・削除が可能です。
Slackから特定のメッセージを取得
以下、参考スクリプトです。
※SlackのチャンネルIDと作成したAPPのトークンが必要になります。
SlackMessage.gs
function Run() {
let channel_id = '{SlackのチャンネルID}';
let oldest = getUnixTime("2022/04/01 00:00:00"); // 取得開始日時
let latest = getUnixTime("2022/05/01 23:59:59"); // 取得終了日時
let limit = 1000; // 公式サイトによると最大1000件までの取得らしい
let url = 'https://slack.com/api/conversations.history' +
'?channel=' + channel_id +
'&latest=' + latest +
'&oldest=' + oldest +
'&limit=' + limit;
let token = '{作成したAPPのトークン}';
const options = {
"headers": { 'Authorization': 'Bearer ' + token }
};
let response = UrlFetchApp.fetch(url,options);
let data = JSON.parse(response);
let messages = data.messages.reverse();
// スプレッドシートの情報取得
let ss = SpreadsheetApp.getActiveSpreadsheet();
let sheet = ss.getSheets()[0];
let lastrow = sheet.getLastRow(); // 最終行取得
// メッセージをシートに書き込む
let line = 0;
for ( let i = 0; i < messages.length; i++ ) {
if (messages[i].text.match('error')) { // errorという文字がつくものを取得している
sheet.getRange(lastrow + line + 1, 1).setValue(convertTimestamp(messages[i].ts)); // 日付
sheet.getRange(lastrow + line + 1, 2).setValue(messages[i].text); // テキスト
line += 1;
}
}
}
function getUnixTime(dateTime) {
let date = new Date(dateTime);
let milsec = date.getTime();
let sec = milsec / 1000;
let time = sec.toString();
return time;
}
function convertTimestamp(timestamp) {
let date_format = function(num) {
return ( num < 10 ) ? '0' + num : num;
};
let d = new Date(timestamp * 1000);
let date = d.getFullYear() + '/';
date += date_format( d.getMonth() + 1 ) + '/';
date += date_format( d.getDate() ) + ' ';
date += date_format( d.getHours() ) + ':' + date_format( d.getMinutes() );
return date;
}
最後に
GASを初めて触ったので、今後も改良していきたいと思います。
丸1日勉強して頑張って作成しました。
conversations.historyは汎用性が高いので便利ですが、今思えばsearch.messagesとかでやったほうが楽だったかもしれません。