カレンダーデータのデータベースへの一括登録方法 (ics → Excel → Notion): Notion 解説(14)

はじめに

タイトルデータだけのデータベース登録については、箇条書きを使うことで一括登録をする方法を紹介しました。 hkob.hatenablog.com

ただ、うまくテーブルの形を合わせると、Excel からの貼り付けもかなり便利です。今回は、ics というカレンダー形式のタスクデータを、Excel を経由して一括登録する方法を解説します。

背景

本校の校務支援システムでは、授業のスケジュールを Google Calendar などに登録できるように ics 形式で出力してくれます。形式は以下のような形になっています。ここから、授業名を示す SUMMARY と開始日・時刻を示す DTSTART が取り出せれば Ok です。

BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//東京都立産業技術高等専門学校//校務支援システム//JP
BEGIN:VEVENT
DTSTART;TZID=Asia/Tokyo:20210409T102500
DTEND;TZID=Asia/Tokyo:20210409T174500
SUMMARY:卒業研究(53)
END:VEVENT
BEGIN:VEVENT
DTSTART;TZID=Asia/Tokyo:20210412T124500
DTEND;TZID=Asia/Tokyo:20210412T160000
SUMMARY:電気電子工学実験実習I(23)
END:VEVENT
BEGIN:VEVENT
DTSTART;TZID=Asia/Tokyo:20210412T102500
DTEND;TZID=Asia/Tokyo:20210412T115500
SUMMARY:情報処理II(33)
END:VEVENT

このファイルを読み込み、タブ区切りテキストに変換した後、Excel に貼り付け、さらに Notion にペーストすることで一括登録します。以下、手順を説明します。

Notion 側の受け入れ準備

Notion ではタスクというデータベースに流し込みます。先ほどみたように入力するデータは、「タスク名」と「日付」だけになります。そこで、データベース置場に「時間割一括入力」というページを作成し、タスクを Linked Database で用意します。

f:id:hkob:20210401194026p:plain
時間割一括入力ページ

すでに登録されたものが見えても邪魔なので、「Done」にチェックが入ったものは除いています。また、プロジェクトは「l授業」になるので、フィルタを設定しておきます。あらかじめフィルタしてある項目は、流し込んだ場合に自動的に設定されるためです。

f:id:hkob:20210401194258p:plain
設定したフィルタ

ics から tsv への変換

Excel はタブ区切りテキスト(tsv) を貼り付けると自動的にセルに配置してくれるので、ics から tsv に変換するスクリプトを作成すればよいだけです。私は Rubist なので、Ruby で書きました。SUMMARY と DTSTART を取り出して、END の時に書き出しているだけです。一つだけ工夫した点は、同じ授業名が出ないように 2 回目以降は後ろに数字を入れています。これは、同じ文字列が存在する列は、Notion が勝手に Select に変換してしまい、余計な空白列が発生してしまうためです。

#! /usr/bin/env ruby

if ARGV.length == 0
  print "Usage: ics2tsv ics-file"
  exit
else
  datetime = nil
  summary = nil
  summary_hash = Hash.new 0
  print "タスク名\t日付\n"
  open(ARGV.first, "rt") do |f|
    while line = f.gets
      case line
      when /^BEGIN:VEVENT.*/
        start = nil
        summary = nil
      when /^DTSTART.*(\d{4})(\d{2})(\d{2})T(\d{2})(\d{2})/
        datetime = "#{$1}/#{$2}/#{$3} #{$4}:#{$5}"
      when /^SUMMARY:(.*)/
        summary = $1
        summary_hash[$1] += 1
      when /^END:VEVENT/
        num = " #{summary_hash[summary]}"
        print "#{summary}#{num == ' 1' ? '' : num}\t#{datetime}\n"
      end
    end
  end
end

このスクリプトをパスの通った場所に「ics2tsv.rb」として保存します。私は ~/bin/ics2tsv.rb として保存しました。このコマンドが実行できるように実行属性をつけておきます。

chmod +x ~/bin/ics2tsv.rb

あとは、このコマンドを実行し、ペーストボードに出力すれば終了です。

ics2tsv.rb ~/Downloads/小林 弘幸_授業スケジュール.ics | pbcopy

ターミナルでの作業はこれで終了です。

Excel への貼り付け

Excel で新規書類を作成し、先ほど変換したテキストをペーストします。2列のデータになりました。ちょうど貼り付けた領域が選択状態になっているので、「Command + C」でコピーします。

f:id:hkob:20210401195122p:plain
Excel へのペースト

貼り付けた領域がそのままコピー中になります。

f:id:hkob:20210401195257p:plain
領域をそのままコピー

Notion に貼り付け & タスクへの移動

この状態で、Notion に切り替え、貼り付けられたデータを先ほどのテーブルの下の方にそのまま Notion に貼り付けます。

f:id:hkob:20210401195432p:plain
Notion に貼り付け後

貼り付けられたデータを全部選択します。どういうやり方が一番いいのかわかりませんが、私は以下のような感じで全選択をしています。まず1行目を選択します。

f:id:hkob:20210401195803p:plain
1行目を選択

「esc」キーを押して、ダイアログを消します。1行だけが選択された状態になります。

f:id:hkob:20210401195904p:plain
ダイアログを消去

シフトキーを押しながら、カーソルを移動すると選択範囲が広がります。一番下まで選択します。選択後に一番上まで移動し、列の少し左にカーソルを合わせるとこんな画面になります。

f:id:hkob:20210401200119p:plain
Drag to move

これを上に用意したタスクの Linked Database にドラッグします。「+New」の上にドラッグするとタスクに登録されます。

f:id:hkob:20210401200319p:plain
タスクビューにドラッグ

後始末

空になった Untitled のテーブルは削除してください。また、移動用に使った Excel も消してしまって構いません。

おわりに

こんな感じで前期分の授業が一括でタスクに登録できてしまいました。カレンダービューで見るとこんな感じでちゃんと繰り返しの授業が登録されています。今年は授業で気になったことは、タスクページにどんどん記述して記録に残していこうと思います。

f:id:hkob:20210401200843p:plain
カレンダービュー


はてなブログに書いた Notion 記事一覧