ぼっちSlackを使い始めておよそ1年。Slackのチャットログ自動保存をようやく実現できました。それまでは手作業で保存していました。ダルかった……。
方法はSlackチャットをGASスクリプトで1日1回読み出し、メールでZapierに送り、ZapierからNotionのデータベースに保存。Notion APIが公開されたおかげでやっと実現できました。
この記事では自動保存を実現するのに必要だった手順を書いておきます。同じくSlackチャットをNotionにバックアップしたい方の参考になれば幸いです。(もっといい方法があったら教えてください)
GASスクリプトでSlackチャットを保存する
これは外部サイトのほうが詳しいのでこちらの記事をどうぞ。
上記スクリプト使用時の注意点
- channels.listとchannels.historyは現在は使用できないので、channelsをconversationsに書き換える
- conversations.historyはgroups.historyを兼ねているので、groups.history部分の処理は不要
- レガシーAPIは使用できないので、Appを作り、必要な権限(scopes)を適切に設定
- 権限設定の際は、Bot scopesとUser scopesを混同しないよう注意
- 使うトークンに対応したほうを設定しよう
attachmentsの内容の抜き出し方
プログラミングの知識が古い私にとって、かなり苦労したのがここでした。
結論としてはmsg.attachments[0].キーで表示できます。わかりづらいよお!
なので前述のスクリプトのこの辺りを、
if (msg.attachments) {
var attachments = JSON.stringify(msg.attachments);
body += 'attachments:' + _this.unescapeMessageText(attachments) + "\n";
}
私の場合は暫定で以下のように書き換えています。
if (msg.attachments) {
var attachments = JSON.stringify(msg.attachments);
body += _this.unescapeMessageText(msg.attachments[0].service_name) +_this.unescapeMessageText(msg.attachments[0].author_name) + _this.unescapeMessageText(msg.attachments[0].title) + ' : ' + _this.unescapeMessageText(msg.attachments[0].text) + "\n" + _this.unescapeMessageText(msg.attachments[0].original_url) + "\n";
}
attachmentsのキーのうちservice_name、author_name、title、text、original_urlが私の環境ではよく使われるキーなので、それらだけ展開してメールに残しています。でないとJSONが全文メールで送られてくるんだもん……。textとfallbackで2倍の文章量になってたりします。ちょっとそれは。
必要なキーは環境によって違うと思うので、最初のうちは前述のスクリプトでJSONを直接書き込んで必要なキーを調べてみましょう。
メールでZapierに送り、Notionでデータベースに保存
ここからはZapierでZap(タスク)を作ります。
作成したZapを共有しているので、よかったらご利用ください。設定の一部を省略できます。
Trigger
まずはトリガーとなる内容を作成します。
今回はメールを受信することをトリガーにします。
Choose app & Event
appはEmail by Zapier、Trigger EventはNew Inbound Emailを選択して「Continue」を押しましょう。
Set up trigger
トリガー専用のメールアドレスを作成します。このメールアドレスに送信したメールの本文をNotionのデータベースに保存するよう設定します。自分以外に知られないように注意しましょう。
私はgeneralチャンネルを想定してgeneralと入力しました。何でもOKです。
Copyを押すとメールアドレスがクリップボードにコピーされます。
Test trigger
先ほど設定したメールアドレスに、なんでもいいのでメールを送ってみましょう。
「We found a request!」と表示されればメールが受信できています。画面に送ったメールが読み出されているはずなので、スクロールバーを動かしてみましょう。
数回試しても上記の表示にならない場合は、もう一度メールを送ってみましょう。たまにうまく受信できない場合があるようです。
済んだら「Continue」を押しましょう。
Action
トリガーの内容が起きたときに行う行動を設定します。
今回はNotionのデータベースに保存します。
Choose app & Event
Notionを選択し、Action EventはCreate Database Itemを設定します。
入力したら「Continue」を押しましょう。
Choose account
ここでNotionのアカウントを接続します。画面の指示に従って入力するだけです。
Set up action
Databaseには希望のNotionデータベースを選択します。表示されない場合はデータベースを含むページをZapierにシェアしましょう。私の環境ではこのような感じになっています。
必要事項を入力します。
Nameはデータベースに保存するアイテムの名前です。私はSubject(メール件名)にしました。
Dateは私はRaw Dateでメールの送信日を直接入力しました。
Tagsはつける必要があるなら選択します。私の場合はgeneralチャンネルを保存する場合はgeneralというタグをつけているので、そう設定しました。データベースに登録されているタグが選べるので、タグをつけたい方は事前にNotionデータベースにタグを登録しておきましょう。
Contentはデータベースの本文です。私はBody Plain(メール本文のプレーンテキスト)だけにしましたが、他に入れたいものがある方は一覧から選択できます。実際のデータの例とともに選べるので、わかりやすいですね。
Test action
ここまで入力した内容でデータベースにアイテムが追加されるか試してみましょう。
成功すると以下のような表示になります。
Notion側でも追加されていることを確認しましょう。
上手くいっていたらTurn Zap Onを押せるようになります。Onにするとメールが届くたびにNotionデータベースに保存されるようになります。
ここまでの手順が一部省略できるZapを共有しています。どうぞご利用ください。
チャンネルごとに違うタグをつけたい場合
私はチャンネルごとに違うタグをつけたかったので、どうするか悩んだ末、Zapをコピーしてメールアドレスをチャンネルごとに分け、タグをそれぞれ設定しました。
そしてGASスクリプトのほうでは以下のような場合分けをして、チャンネル名によってメール送信先が変わるようにしました。ついでにメール件名もチャンネル名と日付だけにしました。(チャンネルはもっとありますが割愛)
if(ch.name == "general"){ MAIL_TO = 'generalのZapierメール送信先'; }
if(ch.name == "rss-feed"){ MAIL_TO = 'rss-feedのZapierメール送信先'; }
// send mail
title = ch.name + " " + _this.formatDate(new Date());
他に良い方法があれば知りたいです。
試してみた他のサービス
他のサービスも試してみました。2021年7月現在では以下のような感じでした。
Integromat
専用のメールアドレスに受信する設定が見つけられず、メールボックスを監視させて読み出す形になりました。
メールを既読にできたりする反面、Gmailの場合は週に1回ほど認証が必要で、完全放置とはいかないのが不便でした。
今調べてみたら、IMAPを使えば上手くいくかも? Integromatは設定はわかりづらいですが様々なことができますし、課金プランが安価なのが魅力です。
IFTTT
Zapier同様、メールを送って反映することができるのですが、
- データベースに追加することができない(ページとして追加は可能)
- 専用のメールアドレスではなく共用メールアドレス。メール件名にタグをつけることで対応
という実装でした。タグが万が一他の人とかぶったときが心配ですね。パスワード生成ソフトでランダム文字列にすればそうそう被らないと思いますが……。
Notion APIを使って自力でスクリプトを書くという手も
プログラミングが得意な人なら、Notion APIを使って自力で書くこともできそうですね。その場合は無料で実現できるかもしれません。(NotionのAPIアクセスが有料となる場合は別)
ちょっと挑戦してみたいですね。GAS以外でも、Herokuなどでもできそうですよね。
まとめ
SlackのチャットログをNotionのデータベースに自動保存できるようになったので、方法をご紹介しました。
Zapierは非常に設定しやすくてわかりやすかったですが、より良い方法が見つかったらいろいろ試していきたいと思っています。