Aflred から Notion 振り返りページに箇条書きを追加 : Notion 解説(28)

(後日追加) ここで説明している 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」にしました。

f:id:hkob:20210707093448p:plain
Workflow の概形

Workflow の設定はこんな感じです。

f:id:hkob:20210707093708p:plain
Workflow の設定

Workflow の環境設定にはこれまでの「DATABASE_ID」「MY_NOTION_TOKEN」の他に「TITLE」を追加しました。私の場合には、振り返りページのタイトルの接頭子である「雑務・振り返り」を登録してあります。

f:id:hkob:20210707094156p:plain
Workflow の環境設定

Keyword の設定もこれまで通りです。

f:id:hkob:20210707093811p:plain
Keyword の設定

Run Script の設定も「an」と同じです。スクリプト自体は次の節でブロックごとに紹介します。

f:id:hkob:20210707094400p:plain
Run Script の設定

スクリプトの中身

前準備

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}",
          }
        ],
      }
    }
  ]
})

テスト

動作するかどうかテストしてみます。振り返りページはまだコンテンツがありません。

f:id:hkob:20210707095733p:plain
ページの初期状態(コンテンツなし)

早速 Alfred から登録してみます。

f:id:hkob:20210707095855p:plain
Alfred 画面

無事登録されました。もう一度実行するとその下に追加されました。

f:id:hkob:20210707100007p:plain
登録された箇条書き

おわりに

これまで振り返りページを書き忘れることが多かったのですが、Alfred から書けるので、こまめに記録ができそうです。


はてなブログに書いた Notion 記事一覧