Alfred4 からタスクを登録(カレンダー経由): Notion 解説(26)

(6/21追記) 昨日のプログラムだとMM/DD の形式の時に日付が設定されないことに気づきましたので、スクリプトを修正しました。

はじめに

今朝、Alfred4 から直接 Notion API を叩いて、タスク登録する記事を書きました(Alfred4 からタスクを登録 : Notion 解説(25) - hkob’s blog)。ここで、日付や時間も設定できるようにしたのですが、先の予定を入れるならカレンダーにも登録したいと思いました。そもそもカレンダーにイベントが登録できれば、Notion タスクが作成されるので、Alfred4 からカレンダーに登録する機能が作れればいいわけです。ということで、こちらも作ってみます。

仕様策定

こちらは、Add Notion Task (以下 an と略します) とほぼ同じ書式にしました。ただし、カレンダーイベントなので、終了時間も設定できるようにしました。もし終了時間が設定されていない場合には、終了時間は開始時間の1時間後に自動的に設定します。今回、キーワードは「Add Calendar task」の省略形で「ac」にしてみました。

今回は API を叩くのではなく、macOS 自体のカレンダーに直接 Event を登録します。このため、今回は Ruby ではなく AppleScript で作成します。現在は、Javascript で AppleScript が書けるようになったので、それほど大変ではありませんでした。

Add Calendar Task

Usage:
    ac task-name
        Input a today task as 'task-name' to Calendar
    ac task-name hh:mm
        Input a today 'task-name' task at 'hh:mm' to Calendar
    ac task-name MM/DD
        Input a 'task-name' task at 'MM/DD' to Calendar
    ac task-name YYYY/MM/DD
        Input a 'task-name' task at 'YYYY/MM/DD' to Calendar
    ac task-name MM/DD hh:mm
        Input a 'task-name' task at 'MM/DD hh:mm - hh+1:mm' to Calendar
    ac task-name MM/DD h1:m1 h2:m2
        Input a 'task-name' task at 'MM/DD h1:m1 - h2:m2' to Calendar
    ac task-name YYYY/MM/DD hh:mm
        Input a 'task-name' task at 'YYYY/MM/DD hh:mm - hh+1:mm' to Calendar
    ac task-name YYYY/MM/DD h1:m1 h2:m2
        Input a 'task-name' task at 'YYYY/MM/DD h1:m1 - h2:m2' to Calendar

Workflow の作成

an と同じ部分は省略します。まず、Workflow の名前などの設定です。an とほとんど同じです。

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

Workflow の環境設定ですが、特に今回は設定するものはありません。左側の覚書だけ書いておきました。

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

次のキーワードの設定ですが、これも an と異なるのはキーワードとアイコンだけです。 ただし、end_time が入ったのでその説明も追加しています。

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

次の Run script も同様ですが、Ruby ではなく /usr/bin/osascript (JS) にしています。

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

作成したスクリプトはこんな感じになりました。構文解析部分は Ruby と同じことをやっています。終了時間も入ったため少し処理が増えています。時間が設定されていない場合には、「alldayEvent」にすることで終日イベントにしています。

function run(argv) {
  let query = argv[0];
  let Calendar = Application("Calendar")
  let notionCal = Calendar.calendars["Notion"]
  var endTimeStr = null
  var startTimeStr = null

  // query を分割
  let words = query.split(" ")
  // 最後のパラメータが時間かどうか
  var timeStr = words.slice(-1)[0]
  if (timeStr && timeStr.match("[0-9]+:[0-9]+")) {
    endTimeStr = words.pop()
  }
  // 時間が設定されていたら開始時間もあるかどうか調べる
  if (endTimeStr) {
    timeStr = words.slice(-1)[0]
    if (timeStr && timeStr.match("[0-9]+:[0-9]+")) {
      startTimeStr = words.pop()
    } else {
      startTimeStr = endTimeStr
      endTimeStr = null
    }
  }
  var dateStr = words.slice(-1)[0]
  // 日付が設定されていなければ今日にする
  if (dateStr.match("^[0-9]+/[0-9]+$")) {
    dateStr = new Date().getFullYear() + "/" + words.pop()
  } else if (dateStr.match("^[0-9]+/[0-9]+/[0-9]+/$")) {
    dateStr = words.pop()
  } else {
    let timeNow = new Date()
    dateStr = timeNow.getFullYear() + "/" + (timeNow.getMonth() + 1) + "/" + timeNow.getDate()
  }
  // 日付・時間を除いた文字列から summary を作成
  let summary = words.join(" ")
  if (startTimeStr) {
    // 開始時間が設定されていたら時間を含めた日付を設定
    let startTime = new Date(dateStr + " " + startTimeStr)
    var endTime
    if (endTimeStr) {
      // 終了時間が設定されていたら時間を含めた日付を設定
      endTime = new Date(dateStr + " " + endTimeStr)
    } else {
      // 終了時間が設定されていなかったら開始時間の1時間後を設定
      endTime = new Date(dateStr + " " + startTimeStr)
      endTIme.setHours(endTime.getHours()+1)
    }
    let newEvent = Calendar.Event({summary: summary, startDate: startTime, endDate: endTime})
    notionCal.events.push(newEvent)
  } else {
    let date = new Date(dateStr)
    let newEvent = Calendar.Event({summary: summary, startDate: date, endDate: date, alldayEvent: true})
    notionCal.events.push(newEvent)
  }
}

最後にワークフローを連結します。

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

使用例

早速使ってみます。「ac キーワード 日付 開始時間 終了時間」とすることでタスクを入れられます。日付を省略すると今日になります。時間がない場合には終日イベントになります。

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

今回は、日付を省略したので今日の14:00 から 15:30 までのイベントが登録されました。

f:id:hkob:20210620145847p:plain
登録されたカレンダーイベント

カレンダーアプリ → Google カレンダー → Notion API → Notion という連携になるので少し遅延がありますが、こちらも Notion にタスクが登録されました。

f:id:hkob:20210620150100p:plain
登録された Notion タスク

おわりに

先の日付のイベント登録は忘れるといけないので、今回の「ac」を使ったカレンダーへも登録することにします。ただ、今現在のポモドーロイベントなどはカレンダー登録することもないので、前回の「an」を使うなどして使い分けようと思います。


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