icsToNotion の作成: NotionRubyMapping 解説 (34)

はじめに

いつもの基本的な使い方を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 ファイルを引数に渡します。結果は以下のようになりました。

icsToNotion の結果

おわりに

今日は応用編で ics データから Notion に一括登録するスクリプトを紹介しました。3年前の自分のコードにだいぶ助けられました。