(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 とほとんど同じです。
Workflow の環境設定ですが、特に今回は設定するものはありません。左側の覚書だけ書いておきました。
次のキーワードの設定ですが、これも an と異なるのはキーワードとアイコンだけです。 ただし、end_time が入ったのでその説明も追加しています。
次の Run script も同様ですが、Ruby ではなく /usr/bin/osascript (JS) にしています。
作成したスクリプトはこんな感じになりました。構文解析部分は 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) } }
最後にワークフローを連結します。
使用例
早速使ってみます。「ac キーワード 日付 開始時間 終了時間」とすることでタスクを入れられます。日付を省略すると今日になります。時間がない場合には終日イベントになります。
今回は、日付を省略したので今日の14:00 から 15:30 までのイベントが登録されました。
カレンダーアプリ → Google カレンダー → Notion API → Notion という連携になるので少し遅延がありますが、こちらも Notion にタスクが登録されました。
おわりに
先の日付のイベント登録は忘れるといけないので、今回の「ac」を使ったカレンダーへも登録することにします。ただ、今現在のポモドーロイベントなどはカレンダー登録することもないので、前回の「an」を使うなどして使い分けようと思います。