この記事は、Ateam Finergy Inc. × Ateam Wellness Inc. のカレンダー | Advent Calendar 2023 - Qiita の15日目の記事になります
本日は、@tommy1038 が担当いたします
はじめに
今年の中頃に、Notionから「Notionプロジェクト」が、発表されました
プロジェクト&タスク | Notion (ノーション)テンプレート は、Notion公式が出してくれており、とても使い勝手が良きです
ですが、プロジェクトとしてタスクを進めていくにあたり避けて通れないのは、言わずもがな「進捗管理」ですよね
なので本記事では Make | Automation Software というノーコードで作業の自動化を構築できるアプリを用いて、進捗管理の助けになる通知の仕組みを作りたいなーと思います
この記事のターゲット
- Notionでプロジェクト管理したい/している人
- Slackでタスクの通知をしてほしい人
- Makeでの自動化を試したい人
結論
先に結論ですが
MakeでNotionプロジェクトの直近1週間以内の未着手タスクを週次でSlackに通知する
を行います。設定のスクショとGIFを下記にまとめてみますので、振り返りなどの際にご覧ください
全体像
各種GIF
では順をおって説明していきます
目次
- 下準備
- NotionとMakeの紐付け
- SlackとMakeの紐付け
- リマインダーの作成
4.1 本日~1週間後までのタスクを抽出する
4.2 未着手のタスクを抽出する
4.3 担当者にメンションできるようにする
4.4 メッセージを1つにまとめる
4.5 タスク数によってメッセージを変える - スケジューラの設定
- Q&A
1. 下準備
下準備として Slack・Notion・Makeのセットアップが必要になりますので、それらができていればOKです
私が0から記載するより下記の記事が画像が多くとても参考になりましたので、そちらをご覧いただけるといいかなと思います
また、NotionとMake、SlackとMakeの紐付けがある程度わかっていれば 次の2つの章は読み飛ばしてもらっても問題ありません
2. NotionとMakeの紐付け
では NotionとMakeの紐付けを行っていきましょう
-
Scenarios
から[+ Create a new scenario]をクリック -
+
ボタンを押すとSearch applications
となるのでNotion
を選択 - データベースのタスクを抽出しようと考えているので [DATABASE/PAGE] の
Search Objects
を選択
Notionを選択 | Search Objects を選択 | Notionの詳細設定 |
---|---|---|
では次に、Notionのコネクションの設定に移ります
-
Connection
のセクションでAdd
をクリックしConnection type
でNotion Internal
を選択する -
Connection name
は自由に入力 -
Internal Integration Token
を入力(※)
Internal Integration Token
という、ちょっとなんだろうというワードが出てきました
こちらは インテグレーション のページからインテグレーションを作成し、そのトークンを入力すれば問題ありません。下記画像の シークレットをコピーして入力してください
基本情報 | シークレット | 機能 |
---|---|---|
(基本情報作成時の [送信ボタン] がわかりづらいですよね)
- 参考: Notion パブリックインテグレーションの認可を実装する - アルパカログ
- PublicとInternalについて記載されています
これで、トークンを入力してコネクションが反映されればOKです
では設定を続けていきます
-
Search Objects
でDatabase Items
を選択 -
Database ID
を入力(※)
Database ID
についてです。プロジェクト&タスク | Notion (ノーション)テンプレート を用いるとタスクテーブルができているはずです
ここで リンクをコピー
すると、URLが得られます(例: https://www.notion.so/{database_id}?v=*****&pvs=*
)
このhttps://www.notion.so/
から?
までの部分がデータベースIDになります
これでデータベースIDを手に入れたので 設定に追加します
この時 Database ID を入力してもFilterで絞り込みをするプロパティを選択できません
下記のように コネクトの追加
で、さきほどのインテグレーションを追加しておく必要があります。設定漏れがちなのでご注意ください
コネクトの追加ができていれば、画像のようにFilterで絞り込むプロパティを選択することができるようになります
これで一度、左下のRun once
をクリックして実行してみましょう
scenarioの画面 | 値の確認 |
---|---|
二つめの画像のように、アプリケーションロゴの右上のアイコンから値を確認できればOKです
ちなみに、scenarioの画面の フロッピーディスク(?)のようなアイコンが保存ボタンになります。scenarioの作成をしている際、保存を忘れて何度か痛い目を見ているので、頻繁に保存ボタンを押すことをおすすめします
3. SlackとMakeの紐付け
続いて SlackとMakeの紐付けを行いましょう
- Notionのアイコンの右側で
Add another module
をクリック -
Search applicaitons
にSlack
と入力し、Slack
を選択 - Slackにメッセージを連携したいので [Messages] から
Create a Message
を選択
モジュールの追加 | Slackを選択 | Create a Messagegeを選択 |
---|---|---|
では次に Slackのコネクションの設定に移ります
-
Connection
のセクションでAdd
をクリックしConnection type
でSlack (bot)
を選択する -
Connection name
は自由に入力 - [Save]をクリックすると、「Integromat が NotificationSample Slack ワークスペースにアクセスする権限をリクエストしています」の画面になるので許可する
Connection type | Connection name | 権限のリクエスト |
---|---|---|
Connection type
は、BotからのメッセージにするためにSlack (bot)
を選択します
権限許可の箇所でIntegromat
と表示されますが、Makeの名前になりますので問題ありません
Makeの前の名称がIntegromatだったようで、「Integromat」のキーワードで調べると もう少し情報が得やすいらしいです
(検証はしておりません)
設定を続けていきましょう
-
Enter a channel ID or name
でSelect from the list
を選択 -
Channel type
を選びます(今回は通知チャンネルとしてpublicで用意しているのでPublic channel
を選択) -
Public channel
をプルダウンで選択(今回は、test-notification
を選択) -
Text
でhoge
と入力して、OKをクリック
これで準備ができたので、疎通確認をしましょう
Run once
で実行して、Slackに6回hoge
が来たらOKです
Slackの詳細設定 | Slack画面 |
---|---|
4. リマインダーの作成
それぞれの紐付けが完了しましたので、やりたいリマインダーを作成していきましょう
4.1 本日~1週間後までのタスクを抽出する
結論としては、Filterの設定は下記の通りです
- 期限(Date)を選択、
Date: On or after
でnow
を入力(now
は「Date and time」から選んでください) - 期限(Date)を選択、
Date: On or before
でaddDays(now; 7)
を入力(addDays(;)
,now
は「Date and time」から通常入力でOKです)
こちらの設定でタスクテーブルに対して 「今日よりも後の日」かつ「今日の7日後よりも前の日」のタスクを絞り込むことができました
4.2 未着手のタスクを抽出する
NotionモジュールとSlackモジュールを繋ぐ線の中で、スパナーのアイコンをクリックします
下記のようにフィルターを設定していきましょう
- Label: 未着手(自由に設定してください)
- Condition:
- {{1.properties_value.
ステータス
.name}} - Text operators: Equal to
- 未着手
- {{1.properties_value.
スパナーをクリック > Set up a filter | フィルターの設定 |
---|---|
この設定で実行すれば、フィルターの箇所に数字が入り フィルターアイコン(ホバーすると虫眼鏡アイコン)をクリックすると詳細を確認することができます
実行後 | 詳細 |
---|---|
こちらの設定で、タスクテーブルに対して 未着手のタスクを絞り込むことができました
4.3 担当者にメンションできるようにする
では次に、担当者にメンションして通知できるようにしていきましょう
Slackでメンションをするためには @Tommy1038
という文字列ではなく、SlackのユーザーIDが必要になります。SlackのユーザーIDは、下記画像のようにメンバーIDをコピー
で取得できます
無事ユーザーIDが取得できたと思いますので、次に進みます
タスクテーブルとは別で、下記のようなユーザーテーブルを作成します。SlackのユーザーIDですが、Notion側ではわかりづらいので SlackID
という名前にしています(なお、今後楽をするために、@
をつけています)
ここで忘れがちなのが ユーザーテーブルに対してもコネクトの設定をしてあげてください
すでにタスクテーブルで行っている下記の設定ですね
これで準備OKです。次の手順で新たなプロパティを定義します
- タスクの新規プロパティから
リレーション
を選択してユーザー
を選択します - 名前を入力し
リレーションを追加
をクリック
リレーションのテーブル選択 | リレーションの詳細設定 |
---|---|
これでタスクのプロパティとして、ユーザーを選択できるようになりました
では次に、SlackID(SlackのユーザーID)を取得しましょう
- タスクの新規プロパティから
ロールアップ
を選択 - リレーションとして
ユーザー
を選択 - プロパティで
SlackID
を選択
ロールアップを選択 | リレーション先の選択 | プロパティの選択 |
---|---|---|
これで、タスクのプロパティとして ユーザーを介してSlackIDを取得することができました。これにより、新たにユーザーが増減した場合でもユーザーテーブルに名前とSlackIDを入力すれば簡単に管理することができます
このやり方でなくても、関数を定義して泥臭くif文を書けば実現はできるのですが、新しいメンバーが追加された時やメンバーが抜けた時などにif文の修理が属人化を招く危険性があるので、別テーブルに切り出す対応を行ってみました
あとは本題の SlackIDを用いてメンションさせるようにしましょう
makeの設定画面 | 実行結果 |
---|---|
今回は「タスク名」と「メンバー」を連携させてみました。メンバーのプロパティでメンションさせるために<>
で囲ってあげてください
こちらの設定で、担当者にメンションを飛ばすことができました
4.4 メッセージを1つにまとめる
4.1-4.3で、実行したいメッセージの大枠はできてきましたが、Slackを見てみるとタスク1つにあたり1つのメッセージとなりちょっと見栄えが良くありません
なので、メッセージを1つにまとめてみましょう
- 下部のToolsから、 Text aggregatorを選択
- 今までSlack側で定義していた処理をコピー&ペースト
- Slack側では、Toolsから渡される
text
を入れればOKです
Text aggregatorを選択 | 集約するテキストの1つ分を設定 | Slackへ流すテキストの設定 |
---|---|---|
これでタスクが1つにまとまるはずです。実行してみましょう
こちらの設定で、メッセージを1つにまとめることができました
4.5 タスク数によってメッセージを変える
では最後に、タスク数による条件分岐を対応しましょう
現状だと、リマインドするタスクがなかった際にエラーになってしまうので
- タスクが0件だった場合は、「リマインドするタスクはありません」的な文章を
- タスクが1件以上あった場合は、「今週のタスクはこちらです」という文章を入れて、タスクを通知できるように
ということをやっていきましょう
まずは、ルーターの準備です。この機能により条件分岐を用意できます
- ルーターを追加
- 既存のSlackのモジュールと接続
- 既存のSlackのモジュールをクローン
- ルーターと接続
ルーターを追加 | 既存のSlackのモジュールと接続 | 既存のSlackモジュールをクローン | 接続 |
---|---|---|---|
次に ルーターの条件分岐を設定しましょう
- タスクあり: ルーターとSlackのモジュールの間のスパナーをクリックしてフィルターを設定
- Label:
タスクが存在していれば
- Condition:
- {{3.text}}
- Basic operators:
Exists
- Label:
- タスクなし: ルーターとSlackのモジュールの間のスパナーをクリックしてフィルターを設定
- Label:
タスクが存在していなければ
- Condition:
- {{3.text}}
- Basic operators:
Does not exist
- Label:
タスクあり | タスクなし | 全体像 |
---|---|---|
これで条件分岐ができました
あとは、メッセージの箇所を修正して完了です。Slackのメッセージモジュールを変更します
タスクあり | タスクなし |
---|---|
これで、Slackのメッセージも それぞれの文章を通知させることができました
タスクあり | タスクなし |
---|---|
5. スケジューラの設定
では最後に、スケジューラを設定していきましょう。下記の画像の箇所で設定できます
デフォルトが15分ごとになっているので、週次月曜日の10時に設定します
- Run scenario:
Days of the week
- Days:
Monday
- Time:
10:00
あとは、SCHEDULINGをONにすればOKです
6. Q&A
設定を行なっていくにあたり、自問自答した問題をQ&A形式で書いてみます
Q. 現状タスク一覧を取得してから、Make側で絞り込んでいますが、非効率ではないですか?
僕もそう思いますね。ですが、Make側で操作できる、filterが下記のようになっておりまして、ステータスで絞り込むことができません
回避策として、Makeで絞り込む方法を紹介しましたが、他のやり方としては、Notion側で新たにステータス2
の項目を作ることです。種類を「セレクト」とすれば、Make側のfilterに出てくるので効率的になるかなと思います
(なお、ステータス2
と名前をしたのは、デフォルトのステータスを残している場合、同名は避けないといけないためです。そちらを消せば、「ステータス」の名前で使えます)
今回は、Notionのテンプレートをそのまま使う方を優先した次第です
Q. 担当者が複数人の場合はどうなりますか?
ここがうまく対応できずでして。。。
Arrayで帰ってきたユーザー情報を、map
してIDだけ取り出せるものの、Make側でその配列に対して<@userId> <@userId2>
みたいできず。
こんなやり方でできました!できそうかも!
みたいなコメントもらえると、とっても嬉しいです。笑
最後に
お疲れ様でした!ちょっと操作にクセがあったり、どこでエラーになった?(権限なのか、シンプルにできないのか)がわかりづらい部分もありましたが、なんとか思い描いていたリマインダーはできたような気がします
Makeをうまく活用しつつ、プロジェクトを成功に導きましょう〜!