目的
Slackのメッセージの履歴をスプレッドシートに書き出すGoogleAppScriptです。
90日分だけもSlackのメッセージを書き出したいため作成しました。
GASの時間が6分を超えるほどメッセージが多い場合はタイムアウトするため取り出せません。
スレッドや90日より前のメッセージは取り出せません。
全体の流れ
1.SlackとGASを連携するためSlack API Token を作成します。
2.SkackアプリのAPI連携で必要なスコープを設定します。
※今回Slackのユーザー一覧取得のGASと
Skaclのメッセージの履歴取得のGASのスコープ(権限)となります。
3.SlackをGASで利用できるよう許可します。
4.トークンを取得します。
※1~4までは下記の手順をご参照ください。
https://qiita.com/80syokumotsu/items/041e99e99d8ecaa3c42b
5.SlackのチャンネルIDを取得します。
PCでSlackアプリを開き希望のチャンネルを選択します。
右上のチャンネル名をクリックし画面をスクロールしてチャンネルIDを取得します。
6.スプレッドシートを作成します。
Googleドライブ ⇒ 新規 ⇒ Googleスプレッドシート ⇒ 空白のスプレッドシート
7.シートを追加し、シート名を小文字で「slack」にします。
8.GAS(GoogleAppScript)を作成するため
slackシートを開き 右上の「拡張機能」⇒「App Script」の順にクリックします。
9.Tokenを登録するGASを作成します。
ファイル右横の+ ⇒スクリプト を選択
コードを追加し保存する
function SetScriptProperty() {
PropertiesService.getScriptProperties().setProperty('slack_token', 'ここにAPIトークンを入力してください');
}
10.slackのユーザー一覧を取得するGASを作成します。
ファイル右横の+ ⇒スクリプト を選択
11. 下記のコードを記入します。
const slack_app_token = PropertiesService.getScriptProperties().getProperty("slack_token");
function getSlackUser() {
const options = {
"method" : "get",
"contentType": "application/x-www-form-urlencoded",
"payload" : {
"token": slack_app_token
}
};
const url = "https://slack.com/api/users.list";
const response = UrlFetchApp.fetch(url, options);
const members = JSON.parse(response).members;
let arr = [];
for (const member of members) {
//削除済、botユーザー、Slackbotを除く
if (!member.deleted && !member.is_bot && member.id !== "USLACKBOT") {
let member_id = member.id;
let chid = getChannelID_(member_id);
let dispname = member.profile.display_name; //表示名
let real_name = member.real_name; //氏名(※表示名ではない)
console.log(dispname);
arr.push([member_id,chid,dispname,real_name]);
}
//let channelID = getChannelID_(id);
}
//スプレッドシートに書き込み
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('slack');
sheet.getRange(1,1,1,1).setValue("Member_ID");
sheet.getRange(1,2,1,1).setValue("Channel_ID");
sheet.getRange(1,3,1,1).setValue("表示名");
sheet.getRange(1,4,1,1).setValue("氏名");
sheet.getRange(2, 1, sheet.getMaxRows()-1, 2).clearContent();
sheet.getRange(2, 1, arr.length, arr[0].length).setValues(arr);
}
function getChannelID_(member_id) {
const options = {
"method" : "post",
"contentType": "application/x-www-form-urlencoded",
"payload" : {
"token": slack_app_token,
"users": member_id
}
}
//必要scope = im:write
const url = 'https://slack.com/api/conversations.open';
const response = UrlFetchApp.fetch(url, options);
const obj = JSON.parse(response);
console.log(obj);
return obj.channel.id;
}
13.シート1 を開き、A1のセルに手順5 で取得したチャンネルIDを入力します。
14.スプレッドシートの「sheet1」にSlackのメッセージを取得するGASを作成します。
ファイル右横の+ ⇒スクリプト を選択
15. 下記のコードを記入し実行します。
const slack_token = PropertiesService.getScriptProperties().getProperty("slack_token");
const sheet = SpreadsheetApp.getActiveSheet();
var channelID = sheet.getRange("A1").getValue();
Logger.log(channelID);
function SlackGetMessage() {
var fetchUrl = 'https://slack.com/api/conversations.history?' + 'channel=' + channelID + '&limit=1000';
const options = {
"headers": { 'Authorization': 'Bearer ' + slack_token }
};
var res = UrlFetchApp.fetch(fetchUrl,options);
res = JSON.parse(res);
var messages = [];
var latestMessage = '';
do {
var newMessages = res.messages
.filter(function (v) {
return !('thread_ts' in v) || v.ts === v.thread_ts;
}).map(function (v) {
return [
v.client_msg_id,
v.type,
v.text,
v.user,
v.ts,
v.reply_count || 0,
v.reply_users_count || 0,
];
});
messages = messages.concat(newMessages);
latestMessage = 'latest=' + res.messages[res.messages.length-1].ts;
} while (res.has_more);
SpreadsheetApp
.getActiveSheet()
.getRange('A2:G' + (messages.length+1))
.setValues(messages.reverse());
//E 列 Linux時間を日本時間に変更
var n =2; //
for (var i=0; i< messages.length; i++) {
var date = messages[i][4];
date = new Date(date * 1000);
date =Utilities.formatDate(date, 'Asia/Tokyo', 'yyyy/MM/dd/ HH:mm:ss');
Logger.log(date);
sheet.getRange(n, 5).setValue(date);
n=n+1;
}
}
17.Slackメッセージの履歴が「sheet1」に書き出されます
18.Slackメッセージのやり取りのユーザー名がIDでだれか分からないので、VlookUpなどでsheet1とSlackシートのユーザー名を紐づけます。
19.シート名を任意の名前に変更します。
別のチャンネルのメッセージを取得したい場合はシートを追加しA1 にSlack チャンネルIDを入力して 手順 15 のGASを実行してください