Add Notion Task and Calendar Workflow : hkob の雑記録 (150)

はじめに

hkob の雑記録の第150回目は、Notion task と Calendar を同時に登録する Add Notion Task and Calendar Workflow を解説します。

これまでの Add Notion Task and Calendar Workflow

Add Notion Task and Calendar Workflow はタスクとカレンダーを同時に作成するワークフローです。Workflow は以下のようになっています。後段の部分はこれまでと同様に Prefab に置き換えました。「anc タスク名 日時に関する記述」とすると日時に関するタスクとカレンダーイベントが同時に設定されます。

Add Notion Task and Calendar Workflow

最初の anc はこれまでと同様にキーワードです。ただし、今回は引数が必ず存在します。

Keyword Input

Run Script の Ruby 側は以下のようになっています。今回はスクリプトが長くて入り切っていません。下のテキストで見てください。

Run Script (Ruby)

スクリプトは以下のようになっています。以下の形の日付形式に対応しています。

  1. anc タスク名 5/30
  2. anc タスク名 5/30 10:00
  3. anc タスク名 5/30 10:00 11:00
  4. anc タスク名 10:00
  5. anc タスク名 10:00 11:00
require "date"
require "notion_ruby_mapping"
include NotionRubyMapping
NotionRubyMapping.configure { |c| c.token = ENV["NOTION_API_KEY"] }
MY_TZ = ENV["MY_TZ"]

date = nil
end_time = nil
start_time = nil
words = ARGV[0].split " "

end_time = (words.pop + MY_TZ) if words[-1] =~ /\d+:\d+/
if end_time
  start_time = (words.pop + MY_TZ) if words[-1] =~ /\d+:\d+/
  unless start_time
    start_time = end_time
    end_time = nil
  end
end

begin
  date = Date.parse words[-1]
  # If the above Date.parse was success, the last parameter will remove.
  words.pop
rescue
end
date ||= Date.today

datetime = {start: [date, start_time].compact.join(" ")}
datetime[:end] = [date, end_time].join(" ") if end_time
summary = words.join " "
db = Database.find ENV["TASK_DB_ID"]
page = db.create_child_page do |p, pp|
  sd = pp["Date"]
  sd.start_date = DateTime.parse("#{date} #{start_time}")
  sd.end_date = DateTime.parse("#{date} #{end_time}") if end_time
  pp["Task name"].text_objects << summary
  pp["Assignee"].people = ENV["USER_ID"]
end
print page["url"].gsub("https://", "notion://")

他の Workflow 同様に replace をなくすために最後に gsub を追加しましています。また、Run Script はもう一つ osascript (JavaScript) 版も用意しています。

Run Script (osascript)

こちらも画面に入り切っていないので、スクリプトを記載します。こちらは AppleScript でカレンダーにイベントを追加しています。

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)
  }
}

Workflow の改修

最終的にワークフローは Replace が外れただけで、大きな変更はありません。

改修後の Add Notion Task and Calendar Workflow

おわりに

Add Notion Task and Calendar Workflow は日付を指定したタスクとカレンダーイベントを同時に作成するワークフローです。日々発生するカレンダーイベントは全てこれで作成しています。

hkob.notion.site