(後日追加) ここで説明している Notion workflow はこちらで配布しています。 github.com
はじめに
これまでに 2つの Alfred workflow を作ってきました。1つ目は Alfred から直接 Notion のタスクを登録するものです。カレンダーに入れないでいいような当日のちょっとしたタスクが「an ちょっとしたタスク」で登録できます。
2つ目は Alfred からカレンダーを登録することで、Notion タスクを間接的に登録するものです。カレンダーのリマインダが使えると同時に Notion のタスクも入ります。「ac 少し先のタスク MM/DD HH1:MM1 HH2:MM2」などとするだけです。日付、時間は省略可能にしてあります。
一方、これまでタスクを作るまでもない細かいタスクは「雑務・振り返り」というページに書き込んでいました。このページは繰り返し設定で朝自動的に作成されるのですが、いちいち開いて書き込むのが面倒でした。そこで今回は、Alfred からこのページに箇条書きを自動で追加する Workflow を作りたいと思います。
Workflow の設定
すでに上のページで詳しい解説はしているので、概形だけ紹介します。Workflow の名前は「Add Reflection」にしました。
Workflow の設定はこんな感じです。
Workflow の環境設定にはこれまでの「DATABASE_ID」「MY_NOTION_TOKEN」の他に「TITLE」を追加しました。私の場合には、振り返りページのタイトルの接頭子である「雑務・振り返り」を登録してあります。
Keyword の設定もこれまで通りです。
Run Script の設定も「an」と同じです。スクリプト自体は次の節でブロックごとに紹介します。
スクリプトの中身
前準備
require と環境設定の準備です。TITLE の読み込みだけ増えています。
require "net/http" require "uri" require "json" require "date" MY_NOTION_TOKEN=ENV["MY_NOTION_TOKEN"] DATABASE_ID=ENV["DATABASE_ID"] TITLE=ENV["TITLE"]
ページの取得部分
ページをフィルタで取得する部分です。今後似たようなものを作るときに再利用できるように「query_notion」というクエリ専用のメソッドを作りました。uri と payload を変えることで、ブロックの取り出しなどにも使えると思います。
# query 専用のメソッド def query_notion(uri, payload) request = Net::HTTP::Post.new(uri) request.content_type = "application/json" request["Authorization"] = "Bearer #{MY_NOTION_TOKEN}" request["Notion-Version"] = "2021-05-13" request.body = JSON.dump(payload) # デバッグ用動いたら消す # STDERR.print request.body response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http| http.request(request) end code = response.code unless code == "200" # エラーの時だけエラーを表示する STDERR.print "Error!\n#{response.body}\n" end JSON.parse(response.body)["results"] end
query_notion にページを取得用の uri を渡すことで、ページ一覧を取得します。
# ページの取得 def get_notion_pages(payload) query_notion URI.parse("https://api.notion.com/v1/databases/#{DATABASE_ID}/query"), payload end
ブロックの追加部分
同じように patch 専用のメソッドを作っています。こちらも uri と payload を受け取って patch を Notion に送ります。
# patch 専用のメソッド def patch_notion(uri, payload) request = Net::HTTP::Patch.new(uri) request.content_type = "application/json" request["Authorization"] = "Bearer #{MY_NOTION_TOKEN}" request["Notion-Version"] = "2021-05-13" request.body = JSON.dump(payload) # デバッグ用動いたら消す # STDERR.print request.body response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http| http.request(request) end code = response.code unless code == "200" # エラーの時だけエラーを表示する STDERR.print "Error!\n#{response.body}\n" end end
block 要素を追加する API 用の URI を patch_notion に渡してブロックを追加します。
# block 要素を追加するメソッド def append_block_children(id, payload) patch_notion URI.parse("https://api.notion.com/v1/blocks/#{id}/children"), payload end
メインプログラム
ここからメインプログラムです。まず、振り返りページの ID を取得します。payload にフィルタを設定しているだけです。starts_with で環境変数 TITLE で始まるものを抽出しています。帰ってきた結果の最初のものの id を取得します。ページがなかったら、この後の処理はエラーになりますが、繰り返しタスクで自動的に作られていることが確実なので、エラー処理はしていません。
### ここから main # page_id を取得 pages = get_notion_pages({ filter: { and: [ { property: "タスク名", text: { starts_with: TITLE, }, }, { property: "日付", date: { equals: Date.today, }, }, ], }, }) id = pages.first["id"]
取得したページ自体もブロックなので、ブロックに子供を追加します。まだページの内容が存在しないときにはページコンテンツも自動的に作成されます。箇条書きなので、「bulleted_list_item」を追加しています。この辺りは自由に変更すればいいと思います。
# 箇条書きを追加 append_block_children(id, { children: [ { object: "block", type: "bulleted_list_item", bulleted_list_item: { text: [ { type: "text", text: { content: "{query}", }, annotaions: { bold: false, italic: false, strikethrough: false, underline: false, code: false, colod: "default", }, plain_text: "{query}", } ], } } ] })
テスト
動作するかどうかテストしてみます。振り返りページはまだコンテンツがありません。
早速 Alfred から登録してみます。
無事登録されました。もう一度実行するとその下に追加されました。
おわりに
これまで振り返りページを書き忘れることが多かったのですが、Alfred から書けるので、こまめに記録ができそうです。