はじめに
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 タスク名 日時に関する記述」とすると日時に関するタスクとカレンダーイベントが同時に設定されます。

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

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

スクリプトは以下のようになっています。以下の形の日付形式に対応しています。
- anc タスク名 5/30
- anc タスク名 5/30 10:00
- anc タスク名 5/30 10:00 11:00
- anc タスク名 10:00
- 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) 版も用意しています。

こちらも画面に入り切っていないので、スクリプトを記載します。こちらは 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 は日付を指定したタスクとカレンダーイベントを同時に作成するワークフローです。日々発生するカレンダーイベントは全てこれで作成しています。