番外編: Alfred による「次のアクション」設定: NotionRubyMapping 解説 (69)

はじめに

NotionRubyMapping 69回目は GTD における「いつかやる」タスクを「次のアクション」に昇華する処理を Alfred で実現します。これまでは、これを以下のようなボタンで処理していました。ボタンを押すだけで、以下のプロパティを二つ設定します。

  1. スプリントプロパティ: バックログ → 現在のスプリント
  2. プロジェクトプロパティ: 未設定 → 曜日ごとのプロジェクト

しかし、ボタンのプロパティの値は固定の値しか設定できないことが問題になります。そのため、毎朝このボタンプロパティを開き、プロジェクトを変更していました。月曜日にスプリントが更新されるとスプリントも変更する必要があります。個々の作業は簡単なのですが、設定が面倒で結局ドラッグアンドドロップで移動することでプロパティを設定することも少なくありませんでした。今回はこの処理を Alfred で自動化します。

button による実装

データベースIDの準備

すでに TASK_DB_ID は設定済でしたが、今回 SPRINT_DB_ID と PROJECT_DB_ID を用意しました。

追加したデータベースID

Alfred の実装

今回の Workflow は以下のようになります。最後はいつものように Open URL につながっています。遠いので省略しています。

Workflow

最初のブロックは今回初登場の External Torriger です。Identifier は next_action にしてみました。

External Trigger
この結果、以下の URL で外部のアプリから URL Handler で Alfred のこの機能を呼び出すことができます。ここで、test の部分は Alfred に渡される引数になります。

alfred://runtrigger/jp.ac.metro-cit.hkob/next_action/?argument=test

次のブロックはいつもの Ruby script です。

Ruby script

スクリプトは以下のようになりました。日付の曜日から wday を取り出し、project の wday と一致するプロジェクトを抽出します。その後、Sprint status が Current になっている現在の Sprint を抽出します。操作するページの ID は先ほどの External Trigger から渡されるので、ページを取得します。そのページの Sprint と Project の id をそれぞれ登録することで、次のアクションに移動します。私のシステムでは、「いつかやる」タスクが次のアクションに移動した場合、そのままそのタスクを開始することが多いので、「Next Step」チェックボックスもオンにしてしまいます。これによって、Notion のオートメーションが発火し、自動的にタスク開始時間が記録され、タスクのステータスも Inprogress に変わります。

require "date"
require "notion_ruby_mapping"
include NotionRubyMapping
NotionRubyMapping.configure { |c| c.token = ENV["NOTION_API_KEY"] }

url = ARGV.first

page = Page.find url

wday = Date.today.wday
project_db = Database.find(ENV["PROJECT_DB_ID"])
pnp = project_db.properties["wday"]
project = project_db.query_database(pnp.filter_equals wday).first

sprint_db = Database.find(ENV["SPRINT_DB_ID"])
ssp = sprint_db.properties["Sprint status"]
sprint = sprint_db.query_database(ssp.filter_equals "Current").first

pp = page.properties
pp["Sprint"].relation = sprint.id
pp["Project"].relation = project.id
pp["Next Step"].checkbox = true
page.save
print page.url

URL handler を発火させる GAS

問題は Notion からは直接 URL handler を発火させることはできません。なんとかならないかと思ったら、こんな記事を見つけました。思い切りそのまま使わせてもらいました。

note.com

スクリプトは以下のようになります。以前使っていた GAS のスクリプトは doGet は使っていなかったので、そのまま流用しました。

function doGet(e) {
    // リクエストからパラメータを取得
    var url = e.parameter.url;
    // カスタムURLスキームにこれらのパラメータを組み込む
    var customUrlScheme = 'alfred://runtrigger/jp.ac.metro-cit.hkob/next_action/?argument='+encodeURIComponent(url);

    // HTMLとJavaScriptを使用してリダイレクト
    var html = `
        <html>
        <head>
        </head>
        <body>
            <p>Redirecting...</p>
            <a id="url_link">自動的に遷移しない場合こちらをクリック</a>
            <script>
                document.getElementById("url_link").setAttribute("href","${customUrlScheme}")
                window.location.href = "${customUrlScheme}";
            </script>
        </body>
        </html>
    `;
    return HtmlService.createHtmlOutput(html);
}

そのままデプロイして、アプリケーション URL をコピーしました。

Notion Formula によるリンク作成

あとは、この GAS を呼び出す Formula を作成するだけです。

Notion Formula

Formula は以下のようになります。

link("→ Next Action", "https://script.google.com/macros/s/デプロイのID/exec?url=" + id())

結果として「いつかやる」タスクの表示はこんな感じになりました。「→ Next Action」をクリックすると、GAS から直接 Alfred が起動します。これにより Sprint と Project が設定された上で、Next step チェックボックスがオンになります。その結果、今度は Notion automation が発動し、ステータスが Inprogress となり、開始時刻が Start date に記録されます。

いつかやるタスク

おわりに

今回は、「いつかやる」を「次のアクション」に移動し、タスクを自動的に開始する Workflow を紹介しました。