はじめに
hkob の雑記録の第90回目は、以前作成した icsToNotion に依存関係の設定を追加します。
校務支援システム側の修正
例年、校務支援システムから期間を決めてその間にある授業を一括出力する仕組みを利用していました。この作業はかなりシステムに負荷をかけるので、授業ごとに ics ファイルを出力する仕組みに変更してみました。その科目の半期分のカレンダーデータが ics として出力されます。科目ごとに出力できるようにした結果、教員は自分の時間割から ics を出力できるだけでなく、学生も自分の時間割から ics を出力できるようになりました。

試しにデータベースの授業のカレンダーを取得すると、以下のような内容の ics ファイルが取得できます。3行のヘッダの後に1つのイベントごとに5行のデータが含まれます。今回、授業ごとに出力するようにしたことから、何回目の授業なのかを[数値]の形で付加するようにしました。
% head -13 Downloads/データベース_授業スケジュール.ics BEGIN:VCALENDAR VERSION:2.0 PRODID:-//東京都立産業技術高等専門学校//校務支援システム//JP BEGIN:VEVENT DTSTART;TZID=Asia/Tokyo:20250407T084000 DTEND;TZID=Asia/Tokyo:20250407T101000 SUMMARY:データベース(44)[1] END:VEVENT BEGIN:VEVENT DTSTART;TZID=Asia/Tokyo:20250414T084000 DTEND;TZID=Asia/Tokyo:20250414T101000 SUMMARY:データベース(44)[2] END:VEVENT
依存関係の追加
icsToNotion については、icsToNotion の作成: NotionRubyMapping 解説 (34) - hkob’s blog に記事にしています。2024年3月28日なのでちょうど1年前くらいですね。今年は、作成後に GUI で設定しなおしていた依存関係を icsToNotion で設定してしまうことにします。
#! /usr/bin/env ruby require "notion_ruby_mapping" include NotionRubyMapping NotionRubyMapping.configure { |c| c.token = ENV["NOTION_API_KEY"] } db = Database.find "1fd72fc2a18247e2a9d347b67e5f9cf0" user_id = "2200a9116a9644bbbd386bfb1e01b9f6" if ARGV.length == 0 print "Usage: icsToNotion.rb ics-file" exit else summary = nil start_date = nil end_date = nil previous = {} 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}:00+0900" when /^DTEND.*(\d{4})(\d{2})(\d{2})T(\d{2})(\d{2})/ end_date = "#{$1}-#{$2}-#{$3}T#{$4}:#{$5}:00+0900" when /^SUMMARY:(.*)/ summary = $1 summary_sub = summary.split("[").first when /^END:VEVENT/ page = db.build_child_page pp = page.properties pp["Start date"].start_date = start_date pp["Start date"].end_date = end_date pp["Assignee"].people = user_id pp["Task name"] << summary blocked_by_id = previous[summary_sub] pp["blocked by"].relation = blocked_by_id if blocked_by_id page.save previous[summary_sub] = page.id print "#{summary}\t#{start_date} #{end_date}\n" end end end end
やっていることは [ の前の文字列をキーにして、ページ ID を保存するようにしています。キーで検索し、ページ ID が保存されていたら、その ID を blocked by プロパティに登録するようにしただけです。
実行結果
実際に実行してみました。今年は授業ごとなのでわかりやすいですね。
> icsToNotion.rb ~/Downloads/データベース_授業スケジュール.ics データベース(44)[1] 2025-04-07T08:40:00+0900 2025-04-07T10:10:00+0900 データベース(44)[2] 2025-04-14T08:40:00+0900 2025-04-14T10:10:00+0900 データベース(44)[3] 2025-04-21T08:40:00+0900 2025-04-21T10:10:00+0900 データベース(44)[4] 2025-04-28T08:40:00+0900 2025-04-28T10:10:00+0900 データベース(44)[5] 2025-05-12T08:40:00+0900 2025-05-12T10:10:00+0900 データベース(44)[6] 2025-05-26T08:40:00+0900 2025-05-26T10:10:00+0900 データベース(44)[7] 2025-06-02T08:40:00+0900 2025-06-02T10:10:00+0900 データベース(44)[8] 2025-06-16T08:40:00+0900 2025-06-16T10:10:00+0900 データベース(44)[9] 2025-06-23T08:40:00+0900 2025-06-23T10:10:00+0900 データベース(44)[10] 2025-06-30T08:40:00+0900 2025-06-30T10:10:00+0900 データベース(44)[11] 2025-07-07T08:40:00+0900 2025-07-07T10:10:00+0900 データベース(44)[12] 2025-07-14T08:40:00+0900 2025-07-14T10:10:00+0900 データベース(44)[13] 2025-07-21T08:40:00+0900 2025-07-21T10:10:00+0900 データベース(44)[14] 2025-07-28T08:40:00+0900 2025-07-28T10:10:00+0900 データベース(44)[15] 2025-08-04T08:40:00+0900 2025-08-04T10:10:00+0900
タイムラインで見るとちゃんと依存関係が設定されていることがわかります。

当然、ics なのでダブルクリックすれば、そのままカレンダーに登録されます。

Notion Calendar を見ると、Notion のデータベースと Google Calendar の両方が表示されていることがわかります。

おわりに
とりあえず、1科目だけテストで入れてみました。特に問題なく入っているようなので、明日職場で前期分の全ての授業を取り込んでみます。