はじめに
いつもの基本的な使い方を1回休んで、この時期のための応用編です。まだ紹介していない機能もありますが、大体はやっていることがわかるのではと思います。
今日、来年度の授業スケジュールが校務支援システムに流し込まれました。これによって、自分の授業のスケジュールが ics ファイルとして、システムからダウンロードできます。
BEGIN:VCALENDAR VERSION:2.0 PRODID:-//東京都立産業技術高等専門学校//校務支援システム//JP BEGIN:VEVENT DTSTART;TZID=Asia/Tokyo:20240408T124500 DTEND;TZID=Asia/Tokyo:20240408T160000 SUMMARY:情報工学実験実習I(24) END:VEVENT BEGIN:VEVENT DTSTART;TZID=Asia/Tokyo:20240408T084000 DTEND;TZID=Asia/Tokyo:20240408T101000 SUMMARY:データベース(44) END:VEVENT BEGIN:VEVENT DTSTART;TZID=Asia/Tokyo:20240410T102500 DTEND;TZID=Asia/Tokyo:20240410T115500 SUMMARY:プログラミングI(24) END:VEVENT BEGIN:VEVENT DTSTART;TZID=Asia/Tokyo:20240410T084000 DTEND;TZID=Asia/Tokyo:20240410T101000 SUMMARY:マルチメディア処理(専攻科) END:VEVENT
Notion Calendar が導入されるまでは、Google Calendar と Notion のタスクを同期する GAS を動かしていたので、Google Calendar にこれを登録するだけですみました。あとは GAS が自動的に Notion のタスクを自動生成してくれていました。どちらにしても Google Calendar は Microsoft 365 への同期もあるため登録はするのですが、やはり Notion の方にもタスクとして入れておきたいです。
何かいいことをやっている人はいないかと、ics と Notion で検索したら 3 年前の自分に出会いました。
カレンダーデータのデータベースへの一括登録方法 (ics → Excel → Notion): Notion 解説(14) - hkob’s blog
当時は Notion API などという便利なものはないので、ics → TSV → Excel → Notion という涙ぐましい努力をしていました。この ics2tsv.rb に当時は存在していなかった Notion API を組み合わせれば便利なツールになりそうです。ということで、icsToNnotion.rb を作成することにします。と言っても、print している部分を append_child_page の呼び出しに変えるだけなので、コード修正は数分で終わりました。
スクリプト
下のスクリプトは終了時間を入れていなかったので、DTEND も対応しました。まだ説明していない create_child_page
エンドポイントを使って、データベースにページを追加しています。詳細はまた後日解説します。
#! /usr/bin/env ruby require "notion_ruby_mapping" include NotionRubyMapping NotionRubyMapping.configure { |c| c.token = ENV["NOTION_API_KEY"] } db = Database.find "1fd72fc2a18247e2a9d347b67e5f9cf0" if ARGV.length == 0 print "Usage: icsToNotion.rb ics-file" exit else summary = nil start_date = nil end_date = nil summary_hash = Hash.new 0 open(ARGV.first, "rt") do |f| while (line = f.gets) case line when /^BEGIN:VEVENT.*/ start_date = nil end_date = nil summary = nil when /^DTSTART.*(\d{4})(\d{2})(\d{2})T(\d{2})(\d{2})/ start_date = "#{$1}-#{$2}-#{$3}T#{$4}:#{$5}+0900" when /^DTEND.*(\d{4})(\d{2})(\d{2})T(\d{2})(\d{2})/ end_date = "#{$1}-#{$2}-#{$3}T#{$4}:#{$5}+0900" when /^SUMMARY:(.*)/ summary = $1 summary_hash[$1] += 1 when /^END:VEVENT/ num = summary_hash[summary] db.create_child_page do |page| page.properties["Task name"] << "#{summary} [#{num}]" page.properties["Start date"].start_date = start_date page.properties["Start date"].end_date = end_date end print "#{summary} [#{num}]\t#{start_date} #{end_date}\n" end end end end
このスクリプトに実行属性を付与します。
chmod +x ~/bin/irbToNotion.rb
~/bin にはパスが通っているので、以下のようにして ics ファイルを引数に渡します。結果は以下のようになりました。
おわりに
今日は応用編で ics データから Notion に一括登録するスクリプトを紹介しました。3年前の自分のコードにだいぶ助けられました。