Alfred4 からタスクを登録 : Notion 解説(25)

(後日追加) ここで説明している Notion workflow はこちらで配布しています。 github.com

はじめに

Twitter を眺めていたら、Notion Kyoto のイベントで知り合った Shogo Tahara さんが以下のツイートをしていました。これはいいなと思い、早速私も真似して作りました。

仕様策定

ただ単にタスクを入れるだけだと面白くないので、日付や時間も入れられるようにしてみます。単にタスク名だけ書いたら今日のイベントになりますが、日付や時間を入れたらその日やその時間に入るようにしてみます。今回、キーワードは「Add Notion task」の省略形で「an」にしてみました。

Add Notion Task

Usage:
    an task-name
        Input a today task as 'task-name' to Notion
    an task-name hh:mm
        Input a today 'task-name' task at 'hh:mm' to Notion
    an task-name MM/DD
        Input a 'task-name' task at 'MM/DD' to Notion
    an task-name YYYY/MM/DD
        Input a 'task-name' task at 'YYYY/MM/DD' to Notion
    an task-name MM/DD hh:mm
        Input a 'task-name' task at 'MM/DD hh:mm' to Notion
    an task-name YYYY/MM/DD hh:mm
        Input a 'task-name' task at 'YYYY/MM/DD hh:mm' to Notion

Workflow の作成

Alfred4 の PowerPack を購入していると、Workflow を作成できるようになります。まず、Alfred4 の環境設定を開き、Workflow を選択します。すでに二つほど登録してありますが、新しくワークフローを作成したいので、下にある「+」をクリックします。

f:id:hkob:20210620094056p:plain
Workflow 画面

ポップアップが開くので、「Blank Workflow」を選択します。

f:id:hkob:20210620094321p:plain
Blank Workflow

ワークフローの設定画面が開くので、以下のように設定します。自分の環境に合わせて入れてください。Bundle Id は世界中でユニークである必要があるので、ドメイン名を逆順に並べるようにして作るのが通常です。

f:id:hkob:20210620094451p:plain
Workflow 設定

ワークフローを作成する前に Workflow の環境設定をしておきます。右上の[ x ]の部分をクリックすると設定画面になります。左側は説明画面なので、先ほどの仕様を書いておきます(実は上の仕様はここからコピーしたものです)。また、右側には Workflow の中で使う変数などを設定できます。MY_NOTION_TOKEN と DATABASE_ID は今回環境変数に設定しておくことにしました。こうすると個人ごとの設定を隠したまま Workflow を配布できるようになるためです。実際には、values のところに自分の Token やデータベースの ID を入れます。MY_NOTION_TOKEN や DATABASE_ID については、一番最初に作った API スクリプトの時の記事をみてください。 カレンダーデータのデータベースへの一括登録 (Notion API 編): Notion 解説(18) - hkob’s blog

f:id:hkob:20210620095922p:plain
Workflow 環境設定

それでは Workflow を作成します。まず、入力側のインターフェースを作ります。右ボタンで出てくるポップアップメニューから「Input」→「Keyword」を選択します。

f:id:hkob:20210620094913p:plainf:id:hkob:20210620094910p:plain
Input -> Keyword

仕様で決めた「an」をキーワードに登録します。引数は必須にしています。Title と Subtext は Alfred を表示したときに表示されるものです。アイコンは Notion のものをそのまま使っています。

f:id:hkob:20210620095128p:plain
Keyword 設定

次に Actions から Run script を設定します。

f:id:hkob:20210620095621p:plainf:id:hkob:20210620095618p:plain
Actions -> Run script

スクリプト作成画面にスクリプトを記述します。以前作った ics2notion.rb がほぼそのまま使えるので、今回は Ruby にしました。

f:id:hkob:20210620100412p:plain
Run script

作成したスクリプトはこんな感じになりました。send_notion は、ほぼ 以前作成した ics2notion.rb と同じです。ics2notion とは違い、MY_NOTION_TOKEN や DATABASE_ID は先ほどの Workflow Environments から取得しています。文字列解析部分は、後ろから時間があるかどうか、日付があるかどうかをチェックしているだけです。ics2notion.rb はカレンダー連携のおかげですっかり使い道がなくなりましたが、その時の資産のおかげで今回は楽ができました。

require "net/http"
require "uri"
require "json"
require "date"

MY_NOTION_TOKEN=ENV["MY_NOTION_TOKEN"]
DATABASE_ID=ENV["DATABASE_ID"]
TZ="+09:00"

def send_notion(title, datetime)
  uri = URI.parse("https://api.notion.com/v1/pages")
  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({
    "parent" => {
      "database_id" => "#{DATABASE_ID}"
    },
    "properties" => {
      "タスク名" => {
        "title" => [
          {
            "text" => {
              "content" => "#{title}"
            }
          }
        ]
      },
      "日付" => {
        "type" => "date",
        "date" => {
          "start" => "#{datetime}"
        }
      }
    }
  })

  # デバッグ用動いたら消す
  # STDERR.print request.body

  response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
    http.request(request)
  end

  code = response.code
  # print "#{title}\t#{datetime}...#{code}\n"
  unless code == "200"
    # エラーの時だけエラーを表示する
    STDERR.print "Error!\n#{response.body}\n"
  end
end

date = nil
summary = nil
time = nil
query = ARGV[0]
words = query.split " "
# 時間が存在するか?
time = words.pop if words[-1] =~ /\d+:\d+/
# time が nil でなければ timezone を追加
time += TZ unless time.nil?
begin
  date = Date.parse words[-1]
  # resque されてないなら words から抜いておく
  words.pop
rescue
end
# 日付がなければ今日にする
datetime = [(date || Date.today), time].compact.join " "
summary = words.join " "
send_notion(summary, datetime)

最後にこの二つのワークフローを図のように連結します。Keyword から Ruby のスクリプトにフローが流れる形になります。

f:id:hkob:20210620144717p:plain
ワークフローの連結

使用例

早速使ってみます。「an キーワード」とすることでタスクを入れられます。

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

実行すると Notion にタスクが入っていることが確認できます。

f:id:hkob:20210620101048p:plain
入力されたタスク

終わりに

ただ、タスク入れられるだけだとつまらないので、日付や時間を入れられるようにしました。ただ作ってみたものの、先の予定であればカレンダーにも入れたいので、基本的には今日のイベントだけしか使わないかもしれませんね。

先の予定を入れるなら、Alfred からカレンダー登録→Notion イベント自動作成の方が便利そうです。こちらは次のネタということで。


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