GoogleスプレッドシートにSlackの履歴を突っ込むスクリプト
お客さんの相談を受けて作成・・・というか改修したコードです。
元のコードはこちらから拝借してます。 元記事と合わせてお読み下さい。
Slackのログをスプレッドシートと連携して技術メモの整理に使っている話
https://qiita.com/kan_dai/items/c0c548cbf716ad392fe7
tokenをSlackから取るのが結構わかりにくかったですね。
新しいアプリを作って、アプリの設定画面 Basic Informationへ。
Add features and functionality項目からPermissionsへ。
ScopesのUserTokenScopesでchannel:history を追加。
OAuth Access TokenをGenerateする。
Install Appで完了。
OAuth Access TokenをスクリプトのTokenにコピペ。
setSlackLogを実行するとスプレッドシートに書き込まれます。
10行目あたりのoldestの行をコメントあうとすれば全部取ってきます。
ただ、長いチャンネルだとどうなるのか未検証。
Slack APIのconversations.historyの項目を確認して、よしなに条件増やしちゃってください。
// Slackからメッセージ取得
function getSlackLog() {
var requestUrl = 'https://slack.com/api/conversations.history?';
var payload = {
// OAuth Access Token
'token': 'xoxp-xxxxxxxxxxxxxxxxxxxxxxxx',
// Channel ID
'channel': 'XXXXXXXXXXXXX',
// 25時間分のメッセージ取得
'oldest': parseInt( new Date() / 1000 ) - (60 * 60 * 25)
}
// パラメータの設定
var param = [];
for (var key in payload) {
param.push(key + '=' + payload[key]);
}
requestUrl += param.join('&');
return UrlFetchApp.fetch(requestUrl);
}
// 取得したSlackのメッセージをスプレッドシートに保存
function setSlackLog() {
// ユーザーの名前置換リスト
var users = [
{"id":"XXXXX","name":"Aさん"},
{"id":"ZZZZZ","name":"Bさん"},
{"id":"YYYYY","name":"Cさん"},
];
// Slackのメッセージを取得して逆順に
var response = JSON.parse(getSlackLog());
console.log(response);
var messages = response.messages.reverse();
// スプレッドシートの情報取得
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheets()[0];
var lastrow = sheet.getLastRow();
// メッセージをシートに書き込む
for ( var i = 0; i < messages.length; i++ ){
// 日付
sheet.getRange(lastrow + i + 1, 1).setValue(convertTimestamp(messages[i].ts));
// ユーザー
var userName = fetchUser(users,messages[i].user)
//sheet.getRange(lastrow + i + 1, 2).setValue(messages[i].user);
sheet.getRange(lastrow + i + 1, 2).setValue(userName);
// 内容
sheet.getRange(lastrow + i + 1, 3).setValue(messages[i].text);
// リンクがあればリンクURL
if (messages[i].attachments) {
sheet.getRange(lastrow + i + 1, 4).setValue(messages[i].attachments[0].title + String.fromCharCode(10) + messages[i].attachments[0].title_link);
}
}
}
// UNIXタイムスタンプを変換
function convertTimestamp(timestamp) {
var date_format = function(num) {
return ( num < 10 ) ? '0' + num : num;
};
var d = new Date(timestamp * 1000);
var 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;
}
// 発言者の名前を見つける
function fetchUser(users,uderId) {
for (var user of users) {
if (user.id === uderId) {
return user.name;
}
}
return "名無しさん";
}