page icon

Slack で受けた依頼を Notion に追加する

はじめに

こんにちは。フェズ でフロントエンジニアをしている荒川です。
 
フェズではエンジニアに限らず生産性向上が意識されていて、細かい業務改善が行われています。
その中で荒川が自動化した例を紹介します。
 

背景

フェズの開発部では、ドキュメント・タスク・議事録などを Notion で管理しています。
開発部以外にも制作部やバックオフィスなどに Notion の文化が広がりつつあります。
 
そんな中、制作部の方からこんな依頼がありました。
 
制作部は元々、口頭や DM 等で制作物の依頼を受けることがあったようです。
受けた依頼は個々人が自分のタスクとして Notion に登録して管理していたようです。
 
上記のフローは以下の問題があります。
  • 口頭でやりとりした場合、忘れてしまう
  • 個々人のタスクとして Notion 登録しないとチームメンバーに情報共有されない
  • 登録を忘れてタスクが漏れることがある。
 
これらの問題を Slack のワークフローと AWS Lambda を使って自動化します。
 

できあがるもの

自動化を通して、依頼のフローがどのように変わるのかを紹介します。
まず、制作物の依頼を出したい人は、 Slack のワークフローを起動します。
ワークフローは入力欄左の雷マークから起動します。
 
ワークフローの項目に回答します。
ワークフローに回答すると、依頼内容がチャンネルに投稿されます。
チャンネルに投稿された数秒後に Notion のタスク一覧にタスクが投稿されています。
 

設定方法

Slack ワークフローの作成

公式のページを参考に Slack でワークフローを作ります。
トップページから「ワークフロービルダー」を開きます
ワークフローを作成します。
名前をつけます。今回は「制作依頼」としました。
 
 
ワークフローを開始する方法は「ショートカット」を選択します。
依頼を出すことのできるチャンネルを選びます。
このチャンネルには制作依頼を出す人、制作依頼を受ける人が参加しているイメージです。
今回は「#test_業務改善」を選びました。
 
短い名前を設定します。
この名前は前述の雷マークから起動するときのメニュー名になります。
今回は「制作依頼テスト」としました。
「次へ」を押すとワークフローステップの追加画面に移動します。
フォームに入力してもらう形で依頼を出せるようにしたいので「フォームを送信する」を追加します。
 
「タイトル」にはフォームの名前を入力します。
今回はワークフロー名と同じように「制作依頼」としました。
 
ここから、各質問を追加します。
制作依頼では以下の質問を用意しました。
  • タイトル
  • What: 何をしたいのか
  • Why: なぜしたいのか、その背景
  • Who: 誰向けか
  • When: いつ頃ほしいのか
 
提出された回答は、ワークフローを実行したチャンネルに返すようにします。
この返されたメッセージをトリガーにして Notion へのタスクの登録が行われます。

Slack App の作成

ワークフローを完了させたメッセージをトリガーに Lambda 関数を実行します。
これらは Slack App を使って設定します。
なお、以前は Outgoing Webhooks という簡単に設定できる機能があったのですが、現在は非推奨となっています。(参考)
 
まずは Slack Apps のページを開きます。
「Create New App」を押します。
Slack App の作り方は 「From scratch」 を選択します。
次の画面で Slack App の名前を入力します。
今回は「Post to Notion」としました。
「Pick a workspace to develop your app in:」は先ほどワークフローを登録したワークスペースを選びます。
Create App をすると、 App Summary が表示されます。
Lambda 関数を作成後に Slack App を設定するので、この画面は残しておきます。

Lambda 関数の作成

Slack App からイベントを受け取り、 Notion にタスクを投稿する Lambda 関数を作成します。
Lambda 関数を作成するまでの AWS の設定は割愛します。
 
まずは Lambda 関数を作成します。
関数の名前は notion に投稿するものと分かるような名前をつけます。
今回は「post-notion-from-slack」という名前にしました。
 
Notion が公式に出している SDK が Javascript であることもあり、今回は Javascript を使って Lambda 関数をコーディングします。
ランタイムには「Node.js 14.x」を指定します。
関数の作成が終わると、index.js が表示されます。
 
 
index.js を Slack App からの実行を受け取れるように書き換えます。(詳しくは Slack API の公式ドキュメントを参照してください)
コードを変更したら「Deploy」ボタンを押して反映させます。
 
後で困らないように「設定」タブを開いてタイムアウトを修正します。
これをやらないと、Notion API を実行する間にタイムアウトして、Lambda 関数が複数回実行される可能性があります。
今回はタイムアウトを10秒に設定しました。

Lambda 関数に API Gateway を追加する

上で作った関数を Slack App から実行できるように API 化します。
AWS の API Gateway を使うと簡単に API化できるので、設定していきます。
 
画面上部の「トリガーを追加」を押します。
トリガーは 「API Gateway」 を選びます。
API は「API を作成する」を選びます。
セキュリティは「オープン」を選びます。
作成が終わったら「設定」タブの「トリガー」が開いているはずです。
API の URL を Slack に指定するために、API エンドポイントをコピーします。

Slack App のイベント設定

ワークフローの実行をトリガーに、作成した Lambda 関数を実行するように設定します。
Slack App の画面左の機能リストから「Manage Distribution」を開きます。
「Enable Features & Functionality」 を開き「Event Subscriptions」ページを開きます。
Enable Events を On にします。
On にすると細かい設定画面が出てきます。
Request URL に先ほどコピーした API エンドポイントを貼り付けます。
貼り付けると Lambda 関数へのアクセスが行われます。
数秒待つと入力欄の上に「Verified」と表示されるはずです。
 
表示されない場合は Lambda 関数や API Gateway の設定に問題がある可能性が高いです。
今一度確認してみてください。
次はトリガーの設定をします。
「Event Subscriptions」画面の下に「Subscribe to events on behalf of users」があるので、これを開きます。
Add Workspace Event から 「message.channels」を選択します。
ここまで完了したら、画面右下の「Save Changes」を押します。
 
これでワークフローの実行をトリガーに、作成した Lambda 関数を実行するようにできました。

Notion API キーの取得

Lambda 関数から Notion API を実行できるように、API キーを取得します。
Notion API のドキュメントを参考に進めます。
こちらにアクセスし、+ ボタンから新しい integration を作成します。
 
Name は識別できればいいので、適当な名前をつけます。
今回は「post from slack」にしました。
その他の項目はデフォルトのままで登録します。
登録後に Secrets が表示されます。
この Secrets は後ほど Lambda に登録するので、コピーしておきます。(※1)
Notion でタスク一覧を開きます。このページに対して Lambda 関数からタスクが登録されます。
ページの右上の Share ボタンを押して、 Invite ボタンを押します。
「Select a person」の下に先ほど作成した integration が表示されているので、選択します。
 
URL から対象となるページの Database ID を取得します。
これも Lambda に登録するので、コピーしておきます。(※2)

Lambda に API キー等を登録

Lambda に戻ります。
設定タブから環境変数の登録をします。
「環境変数はありません」と表示されているので「編集」ボタンを押します。
 
先ほどの Notion の設定でコピーした値を環境変数として登録します。
今回は Secrets で取得した値(※1)を「NOTION_KEY」として、対象となるページの Database ID (※2)を「NOTION_DATABASE_ID」として登録します。

Lambda 関数のコードを書く

Lambda 関数を Notion に投稿できるように変更します。
ライブラリを使うので、AWS コンソール上ではなく、ローカルのエディタで編集してアップロードする形で編集します。
 
ローカルの適当な場所に、Lambda 関数名と同じフォルダ名のフォルダを作ります。
 
以下のコマンドを実行して package.json ファイルを作成します。
質問されるので、適宜回答します。全て Enter で飛ばしても動きます。
実行すると、実行したフォルダ内に package.json が作成されているはずです。
 
Notion の公式SDK をインストールします。
 
index.js ファイルを作成します。
 
index.js ファイルは以下のように書き換えます。
 
ここまでで作成したコード一式を zip化します。ファイル名は適当なものにしてください。
同じフォルダに zipファイル が作成されているはずです。
Lambda にコードをアップロードします。
「アップロード元」ボタンから「.zipファイル」を選択します。
「アップロード」ボタンから先ほど作成した zipファイル を選択して保存します。
コードが更新されたら忘れずに「Deploy」をします。

Slack App をワークスペースにインストールする

Slack App に戻り「OAuth & Permissions」を開きます。
Install to Workspace ボタンを押します。
「許可する」を押して Slack App のインストールを完了させます。
 
以上で完了になります。
試しに、ワークフローを実行してみてください。Notion の指定したページに投稿されていることが確認できればうまく動いています。
 

まとめ

少し長くなりましたが、 Slack のワークフローから Notion へのタスク登録を自動化する方法を紹介しました。
 
上記のフローで半年ほど運用していますが、問題に挙げたポイントを含めて以下の効果が出ていると思います。
  • ワークフロー経由で Slack に投稿されているので、依頼する人も依頼された人も思い出すコストが軽減できた。
  • Slack のオープンチャンネルに内容が投稿されるので、他の人が横からアドバイスを入れるなど、チームで対応することができるようになった。
  • 他のタスクと同様に依頼のタスクも定例などで確認されるようになり、対応漏れが起きづらくなった。
  • 依頼する側はワークフローに沿って入力するので、期限を伝えるのを忘れるなどの伝達漏れが軽減できた。
 
会社の規模がどんどん拡大していく中で、ドキュメント管理は重要な課題になってきます。
その一環として Notion や Slack はこれからも使い倒していくつもりです。