
本記事はSansan Advent Calendar 2024の7日目の記事です。
こんにちは。 技術本部研究開発部の高橋寛治です。
Slackに投稿された読了や対応を求められる通達の対応漏れを防ぐために、自動でNotion上にToDoを追加する仕組みを作りました。 その成り立ちや機能、実装の概要、効果について紹介します。
成り立ち
きっかけは、社内の生産性改善をリードしているメンバーから相談を受けたことです。
Slackの通達チャネルでは、社員に対して読了や対応を求められる投稿が日々行われています。 長期休暇を取ったときや有給明けにSlack通知が多く、情報収集がストレスにつながったり、休暇中にSlackチャネルを開いたりする状況に問題を感じていました。 対応が漏れると、何より依頼主の仕事が進みませんし、確認作業も追加で発生します。
相談を受けた際、自身にも同様の問題意識があったため、改善に取り組むことにしました。 あとは、試行錯誤*1しながら、完成させたという流れです。
機能
Slack Botが任意のチャネルの投稿を取得し、Notionのデータベースのレコードに追加する、という機能を持つSlack Botを開発しました。 チャットとして流れてしまう情報が、ToDoリストとして一覧化されるということです。
次のような定型文がSlack上の任意のチャネルに投稿されます。

投稿イベントを取得し、内容をパースした上でNotionのデータベースに登録します。

Notionのデータベースのボタン機能を用いて完了・未完了を制御することで、ToDo管理が可能となります。 また、投稿のスレッド(詳細情報が記述されている1投稿まで)を取得し、その内容を転記します。
実装と試行錯誤
Slack Botの実装には、PythonフレームワークのSlack Boltを用いました。 社内に閉じた仕組みであるため、ソケットモードで組み込みました。
研究開発部のアプリケーション基盤Circuitの社内向けの仕組み上で動作します。 簡単に紹介すると、コンテナ化したシステムを動作させる基盤です。
小さい検証を繰り返して前に進める
まずは手動で、当初の問題を解決できるか検証した上で、自動化を進めることにしました。
Notionデータベースに手動で登録し、ToDoとして自分たちで使ってみたところ、対応の抜け漏れが生じなかったことから生産的だと判断しました。 次に、Notionデータベースへの登録をSlackのショートカットから行えるようにしました。 入力フォームにパースされた結果がデフォルトで入っており、結果を確認してから登録する仕組みです。 運用してみて、パース結果に問題ないことがわかりました。
Slack投稿の自動登録機能を追加しました。投稿イベントをフックに、Notionデータベースに追加されます。これでToDoの登録に人手が不要となりました。 さらに、該当の投稿のスレッドに詳細情報が記載されます。こちらも取得して、登録することとしました。 また、検証を進める中で、未完了に戻したいという声があり、未完了に戻すボタンを用意しました。
結果として、NotionでToDo管理ができ、質問があればSlack上で行う状態を作れました。
SlackとNotion間でのリッチテキストの処理
Slackのリッチテキスト形式をNotionのリッチテキスト形式に可能な限り変換する処理の実装は大変でした。 Pythonでライブラリが見つけられなかったため、簡易実装することにしました。
次の様な実装イメージです。
def slack_blocks_to_notion_blocks(slack_blocks, slack_client): notion_blocks = [] for block in slack_blocks: if block["type"] != "rich_text": continue for element in block["elements"]: if element["type"] == "rich_text_section": notion_block = notion_blockに変換(element, slack_client) 他のelement typeに対する処理 ・・・ return notion_blocks
工夫や仕様を切った部分をいくつかあげます。
- 絵文字はコードのままにする(Slackのカスタム絵文字はNotionでコードのまま表示される)
- Slackのリッチテキスト内のチャンネルID・ユーザIDは、Slackから表示名を取得してNotion側ではテキスト化する
- 階層化されたリストは対象外とした
- 大きなブロック単位で変換した(SlackのelementをNotionのblock単位とした)
NotionのデータベースでToDoを実現する
Notionのオートメーション機能*2とフィルタの組み合わせにより、同一データベースでユーザごとのToDo管理をできるようにしたのも工夫の1つです。 具体的には、完了ボタンを用意し、オートメーションで「クリックしたユーザ」をプロパティに「追加」とします。 このプロパティを条件にするフィルタが入ったビューを複数用意することで、未完了や完了をユーザごとに1つのデータベースで表示可能となります。
ただし、実装時点でのNotionの仕組み上、データベースを誰でも編集できてしまいます。 データベースの特定プロパティのみの権限付与ができないためです。 ここは、注意喚起の文を目立つように配置し、善意や注意に任せることとしました。
効果
まず、私自身の対応漏れや確認漏れが減りました。 育児休業で不在だった三カ月間分の対応事項も、順次対応していけました。
他にも次の効果を確認・見聞きしています。
- 従業員の対応漏れが減ったとの声
- マネージャによる再周知の工数削減
- 従業員の確認漏れが減ったことによって依頼者(投稿者)が目的とした業務がより早く実現できている
- 他部署や他グループで同様の仕組みを構築し、業務効率化
- 長期休暇後のSlackチャネル確認が早くなり、ストレス軽減
- 毎日確認せず、数日ごとに確認することも容易である
ユニーク閲覧数で毎日50人程度が利用しているため、手応えを感じます。
自分が困っているものは作ってみてもいい
自分が困っているものは作ってみて、使う人が多ければしっかり作り込む、という動きは改めて良いと思いました。 個人目線で課題があり、それが多数にとっての課題であるのかと、検証も進めやすいように思います。
小さなことからアイデアを具体化し、大きな影響へつなげていきたいと、改めて思いました。
執筆者プロフィール
高橋寛治 Sansan株式会社 技術本部 研究開発部 Data Analysisグループ
阿南工業高等専門学校卒業後に、長岡技術科学大学に編入学。 同大学大学院電気電子情報工学専攻修了。 在学中は、自然言語処理の研究に取り組み、解析ツールの開発や機械翻訳に関連する研究を行う。 大学院を卒業後、2017年にSansan株式会社へ入社。 自然言語処理を生かした研究開発に取り組む。
▼執筆者による連載記事はこちら