🧷
SlackのプライベートチャンネルのExport
TL;DR
前者のリンクを参考にSlack Appの設定をして、スプレッドシートのスクリプトエディタに以下のコードをコピペして実行すれば完了です。
var OAuthAccessToken = "{OAuth Access Token}";
var channelID = "{チャンネルID}";
function main() {
var fetchUrl = 'https://slack.com/api/conversations.history?token=' + OAuthAccessToken + '&channel=' + channelID + '&limit=1000';
var res = UrlFetchApp.fetch(fetchUrl);
res = JSON.parse(res);
var messages = [];
do {
var newMessages = [];
res.messages.forEach(function (v) {
if('thread_ts' in v) {
var fetchUrl = 'https://slack.com/api/conversations.replies?token=' + OAuthAccessToken + '&channel=' + channelID + '&ts=' + v.thread_ts;
var reply = UrlFetchApp.fetch(fetchUrl);
reply = JSON.parse(reply);
newMessages = newMessages.concat(reply.messages.reverse());
}
else {
newMessages.push(v);
}
});
newMessages = newMessages.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);
} while (res.has_more);
SpreadsheetApp
.getActiveSheet()
.getRange('A2:G' + (messages.length+1))
.setValues(messages.reverse());
}
背景
あるSlackチャンネルのメッセージのバックアップ(エクスポート)をしたい場面があったんですが、
- そのチャンネルはプライベートチャンネルである
- 弊社のSlackプランであるスタンダードプランではプライベートチャンネルのエクスポートができない
- プライベートチャンネルはパブリックチャンネルに変更できない
という事情で、Slackが用意してくれている方法ではバックアップが不可能でした。
やったこと
もう最初にほとんど全て書いてしまったんですが、ynaitoさんの記事を参考にしてメッセージを取得したところ、スレッドの中身が取得できなかったので、yomoriさんの記事を参考にしてその部分を追加しました。
もうほんとそれだけです。
何か僕がやったことがあるとしたら、conversations.history
は時系列降順でconversations.replies
は昇順で返ってくるので、全体を昇順にするためにreverse()
を噛ませてるくらいのことです。
はい。
Discussion
プログラミングを何も理解していない超初心者なのですが、プライベートチャンネルをエクスポートせざるを得ない状況に追い込まれたので参考にさせていただきました。

何も考えずコピペしたところ、上の画像のように、12行目のforEachで引っかかってしまったのですが、どうやったら解決できるのか教えていただきたいです...!!!
古い情報なのでそのままで動くのか保証はできないのですが、スクリーンショットを拝見したところ、OAuthAccessTokenが書き換えられていない点がとりあえず明らかな原因の一つとしてありそうです。
記事冒頭のリンク先も参照し、ご自身のトークンを取得して書き換えてください。
ご返信本当にありがとうございます!!

上のリンクを参考に、スクリプトのプロパティ > 行を追加からトークンを追加したのですが、それでは動かないのでしょうか?
スクリプトの1行目をトークンに書き換えるべきということですか?
プログラム中で、プロパティに設定した値を読み出すことが必要です。
このあたりが参考になるでしょうか。