番外編: Alfred によるカレンダー登録(ancコマンド、その2): NotionRubyMapping 解説 (67)

はじめに

NotionRubyMapping 67回目は昨日に引き続き、時間を含むタスクを Notion とカレンダーに一括で登録する Workflow を紹介します。anc というコマンドの後に記述する内容によって、時間を様々に登録できます。昨日は、Notion 側を解説したので、今日は残ったカレンダー側を解説します。今回は NotionRubyMapping は使わないのですが、ご勘弁を。

  1. anc タスク名 → 今日の日付でタスクを登録
  2. anc タスク名 4/29 → 4月29日にタスクを登録
  3. anc タスク名 4/29 10:00 → 4月29日 10:00 にタスクを登録
  4. anc タスク名 4/29 10:00 12:00 → 4月29日 10:00 から 12:00 にタスクを登録
  5. anc タスク名 10:00 → 今日の 10:00 にタスク登録
  6. anc タスク名 10:00 12:00 → 今日の 10:00 から 12:00 にタスクを登録

Notion 側の処理

長くなりそうなので、今日は残りのカレンダー側の処理だけ解説します。

Workflows

機能作成したキーワードはこちらです。特に何も変更はありませんが、一応再掲しておきます。

Keyword

次の Run Script は昨日と同じですが、今回は /usr/bin/osascript (JavaScript) を選びます。

osascript

一画面に収まりきらないので、こちらにソースを掲載しておきます。スクリプトはそれほど難しいことはしていないと思います。

ObjC.import("stdlib");

function run(argv) {
  query = "{query}"
  let Calendar = Application("Calendar")
  let cal = $.getenv("NOTION_CALENDAR")

  let notionCal = Calendar.calendars[cal]
  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 を作成
  event = {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)
    }
    event["startDate"] = startTime
    event["endDate"] = endTime
    let newEvent = Calendar.Event(event)
    notionCal.events.push(newEvent)
  } else {
    let date = new Date(dateStr)
    event["startDate"] = date
    event["endDate"] = date
    event["alldayEvent"] = true
    let newEvent = Calendar.Event(event)
    notionCal.events.push(newEvent)
  }
}

おわりに

今回は、カレンダー側の処理を追加しました。これによって anc により Notion タスクと同時にカレンダーにもイベントが作成されるようになります。