Zapierを使ってNotionの期限切れタスクをSlackに通知する

7 min read

はじめに

この記事はZapierを使って、Notion上にある期限切れのタスクを、一定間隔でSlackに通知する方法をまとめたものです。
Youtube動画もありますので是非ご覧ください。

https://youtu.be/dckLOsc1RXY

Notionの準備 トークン

NotionAPIを呼び出すためのトークンを発行し、Notionのデータベースやページに対して共有しておく必要があります。
詳細は こちらの記事 を参照してください。

Notionの準備 データ

今回の手順では、Notionにデフォルトで用意されているタスク管理のデータベースを使用します。

  • Notionにログインしタスク管理に遷移したら プロパティを選択し、プロパティを追加をクリックします。
  • プロパティ名は期日にし、タイプに日付を選択します。
  • 表示設定は全てOnにします。
  • 未着手レーンに任意の名前で2つの期限切れタスクを追加します。
  • 今作成したタスクをクリックしステータスからオプションの設定をクリックします。
  • 完了の文言の末尾にある絵文字を削除しておきます(APIからの検索時に不要なため)

以上でデータの準備は完了です。

Zapierの設定 Trigger

Zapの実行トリガーを設定します。今回は平日10:00に実行する設定としています。

  • Zapierの任意のフォルダでMake a New Zapをクリックします。
  • TriggerにはScheduleを選択します。
  • Trigger Eventには通知させたい任意の間隔を指定します。今回はEvery Dayを指定します。
  • Trgger on weekendsで週末も実行するか指定できるのでnoを、Time of dayでは10amを指定します。なお、実行時間はアカウントのタイムゾーンに依存します。
  • Test Triggerで特にエラーがなければTriggerの設定は完了です。

Zapierの設定 Code by Zapier

Zapierに用意されているNotionのテンプレートにFind Database Item in NotionというActionがありますが、現時点では取得できるのは条件に合致する最初のページとなっています

そのため、今回のように期限が切れた複数のタスク情報を取得したい場合には、NotionのAPIを呼び出す必要があります。
今後さらにZapier上のテンプレートが拡充していくことで、NoCodeの恩恵を受けられることが期待されますが、今回はZapier上でCodeを記述してNotionのデータを取得します。

ZapierはiPaaSとして少ない工数で様々なSaaSと接続できる点が魅力です。ここでCodeを利用することの是非はありますが、非常に柔軟にデータを取得できることからも、選択肢として持っておくと様々なシーンで活用できると思います。

  • ActionのApp Eventcodeと入力しリストに表示されるCode by Zapierを選択します。
  • Action EventではJavascriptかPythonを選択できます。今回はRun Pythonを選択します。
  • Codeは主にInput DataCodeにわかれます。まずInput Dataには以下の変数を記述します。
変数名 備考
NOTION_TOKEN Notionで発行したトークン プレフィックスとして"Bearer"とスペースをつける
NOTION_VERSION NotionAPIのバージョン 2021-08-16
DB_ID APIに指定するDBID 対象ページのURLで確認


指定例

  • CodeではInput Dataを使ってNotionAPIを呼び出しています。取得条件にはステータスが完了以外且つ期日が実行日時よりも前を指定しレスポンスから結果件数を取り出してOutputに設定しています。
import datetime
import json

url = 'https://api.notion.com/v1/databases/{id}/query'.format(id=input_data['DB_ID'])
headers = {
    'Authorization': input_data['NOTION_TOKEN'],
    'Notion-Version': input_data['NOTION_VERSION'],
    'Content-Type': 'application/json'
}
payload = json.dumps({
  "filter": {
    "and": [
      {
        "property": "ステータス",
        "select": {
          "does_not_equal": "完了"
        }
      },
      {
        "property": "期日",
        "date": {
          "before": datetime.datetime.now().strftime('%Y-%m-%d')
        }
      }
    ]
  }
})

response = requests.post(url, headers=headers, data=payload)
response.raise_for_status()

output = {
    'response': response.json(), 
    'totalCount': len(response.json().get('results'))
}
  • Test & Reviewをクリックし、コードに問題がなければ結果として2件のタスクが取得できます。

Zapierの設定 Filter

続いてFilterを設定します。今回のシナリオでは期限切れのタスクがある場合にSlack通知します。
このような条件判定を行う場合、FilterActionを使うことができます。

  • ActionにFilterを選択します。
  • Choose fieldにはPythonで取得したTotal Countを指定します。
  • Choose conditionには(Number)Greater thanを選択します。
  • Enter or select valueには0を入力します。

これで期限切れのタスクが1件以上ある場合にのみ以降の処理が実行されるようになります。

Zapierの設定 Format

続いてFormatを設定します。APIなどから取得してきた複数URLをSlackに通知する場合に使えるTIPSです。
なお、Formatを実行しない場合にどのような通知になるかは、実際に確かめてみてください。

  • ActionにFormatを選択します。
  • Action EventにはUtilitiesを選択します。
  • TransformにはLine-item to Textを選択し、InputにはPythonで取得したResponse Results URLを、Separatorには改行を表す[:newline:]を記述します。
  • Test & Reviewをクリックし、outputのtextで複数URLの間に改行が挿入されて入ればOKです。

Zapierの設定 Slack通知

続いて取得・加工した情報をSlackに通知します。

  • ActionのApp Eventslackと入力しリストに表示されるSlackを選択します。
  • Action EventにはSend Channel Messageを選択します。
  • Slackアカウントを選択します。まだZapierからSlackへのコネクションを設定していない場合はここで設定してください。
  • Channelに通知先チャンネルを、Message Textには以下の値を指定します。
期日を超えたタスクがあります
{Formatステップで加工したOutput Text}
  • Test & ReviewをクリックしてSlackにメッセージが投稿されれば設定はOKです。

動作確認

最後に動作確認のため、Notion上のステータスを変更してみます。

  • Slackに通知されたURLからNotionのタスクを開き、ステータスを未着手から完了に変更します。
  • Zapier側でRun PythonのステップのTest Actionを展開し、Retest & Reviewをクリックします。
  • 実行結果のログでtotalCount1になっているかを確認します。

まとめ

以上、Zapierを使って、Notion上にある期限切れのタスクを一定間隔でSlackに通知する方法のご紹介でした。みなさんの業務効率化に役立てられれば幸いです。よいZapierライフを!

参考

Notion

https://developers.notion.com/docs/getting-started

Zapier

https://zapier.com/help/create/format/get-started-with-formatter
https://zapier.com/help/create/customize/add-conditions-to-zaps-with-filters

Discussion

ログインするとコメントできます