(後日追加) ここで説明している Notion workflow はこちらで配布しています。 github.com
はじめに
Twitter を眺めていたら、Notion Kyoto のイベントで知り合った Shogo Tahara さんが以下のツイートをしていました。これはいいなと思い、早速私も真似して作りました。
Notion API を使ってデータベースにアイテムを登録する Alfred Workflow を作ってみた。
— Shogo Tahara (@shogocat) 2021年6月19日
毎日の食事記録を Notion に残していますが、これで Notion を立ち上げなくてもわずか3秒で食事内容を登録できるようになった🎉 pic.twitter.com/Ea1qxEqwC4
仕様策定
ただ単にタスクを入れるだけだと面白くないので、日付や時間も入れられるようにしてみます。単にタスク名だけ書いたら今日のイベントになりますが、日付や時間を入れたらその日やその時間に入るようにしてみます。今回、キーワードは「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 を選択します。すでに二つほど登録してありますが、新しくワークフローを作成したいので、下にある「+」をクリックします。
ポップアップが開くので、「Blank Workflow」を選択します。
ワークフローの設定画面が開くので、以下のように設定します。自分の環境に合わせて入れてください。Bundle Id は世界中でユニークである必要があるので、ドメイン名を逆順に並べるようにして作るのが通常です。
ワークフローを作成する前に Workflow の環境設定をしておきます。右上の[ ]の部分をクリックすると設定画面になります。左側は説明画面なので、先ほどの仕様を書いておきます(実は上の仕様はここからコピーしたものです)。また、右側には Workflow の中で使う変数などを設定できます。MY_NOTION_TOKEN と DATABASE_ID は今回環境変数に設定しておくことにしました。こうすると個人ごとの設定を隠したまま Workflow を配布できるようになるためです。実際には、values のところに自分の Token やデータベースの ID を入れます。MY_NOTION_TOKEN や DATABASE_ID については、一番最初に作った API スクリプトの時の記事をみてください。 カレンダーデータのデータベースへの一括登録 (Notion API 編): Notion 解説(18) - hkob’s blog
それでは Workflow を作成します。まず、入力側のインターフェースを作ります。右ボタンで出てくるポップアップメニューから「Input」→「Keyword」を選択します。
仕様で決めた「an」をキーワードに登録します。引数は必須にしています。Title と Subtext は Alfred を表示したときに表示されるものです。アイコンは Notion のものをそのまま使っています。
次に Actions から Run script を設定します。
スクリプト作成画面にスクリプトを記述します。以前作った ics2notion.rb がほぼそのまま使えるので、今回は Ruby にしました。
作成したスクリプトはこんな感じになりました。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 のスクリプトにフローが流れる形になります。
使用例
早速使ってみます。「an キーワード」とすることでタスクを入れられます。
実行すると Notion にタスクが入っていることが確認できます。
終わりに
ただ、タスク入れられるだけだとつまらないので、日付や時間を入れられるようにしました。ただ作ってみたものの、先の予定であればカレンダーにも入れたいので、基本的には今日のイベントだけしか使わないかもしれませんね。
先の予定を入れるなら、Alfred からカレンダー登録→Notion イベント自動作成の方が便利そうです。こちらは次のネタということで。