icsToNotion に依存関係を追加: hkob の雑記録 (90)

はじめに

hkob の雑記録の第90回目は、以前作成した icsToNotion に依存関係の設定を追加します。

校務支援システム側の修正

例年、校務支援システムから期間を決めてその間にある授業を一括出力する仕組みを利用していました。この作業はかなりシステムに負荷をかけるので、授業ごとに ics ファイルを出力する仕組みに変更してみました。その科目の半期分のカレンダーデータが 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 の両方が表示されていることがわかります。

Notion Calendar

おわりに

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

hkob.notion.site