はじめに
夫婦で使っていたTimeTreeのカレンダーを、Googleカレンダーへ移しました。予定は6年分、約2,800件あります。
TimeTreeには、予定をまとめて書き出す公式の機能が見当たりませんでした。そこで、コミュニティ製のツール timetree-exporter で .ics ファイルに書き出し、Googleカレンダーに取り込みました。作業の大半は Claude Code に任せています。
この記事では、次のことをまとめます。
- timetree-exporter で TimeTree の予定を書き出す手順
- Googleカレンダーへの取り込みでハマったこと(一括取り込みの失敗、ラベルの色、重複)
- 夫婦で共有するための設定
- Claude Code に任せたこと・自分でやったこと
TL;DR
- timetree-exporter(MITライセンス、非公式)で、TimeTreeの予定を
.icsに書き出せる。ログインはメールアドレスとパスワード - 約2,800件を1ファイルで取り込んだら、エラー表示もなく1件も入らなかった。300件ずつに分けたら全件入った
- TimeTreeのラベルの色はGoogleカレンダーに引き継がれない。ラベルごとにカレンダーを分け、カレンダーの色に色コードを指定して再現した
- 同じ予定を別のカレンダーにもう一度取り込むと、移動ではなくコピーになる
- パスワードの入力など、認証情報が絡む操作だけ自分でやり、残りは Claude Code に任せた
環境・前提条件
| 項目 | 内容 |
|---|---|
| OS | macOS |
| Python | 3.14(timetree-exporter は 3.11 以上が必要) |
| timetree-exporter | 1.0.0 |
| 取り込み先 | Googleカレンダー(PCのブラウザ版) |
| 作業 | Claude Code(デスクトップアプリ)+ Claude in Chrome |
timetree-exporter は TimeTree 公式のツールではありません。README には、TimeTree社とは関係のないコミュニティ製のプロジェクトであること、非公式のWeb APIを使っているため予告なく動かなくなる可能性があることが書かれています。利用は自己責任でお願いします。
手順1:timetree-exporter で予定を書き出す
インストール
プロジェクト用のフォルダに仮想環境を作って、pip で入れました。Homebrew(brew install eoleedi/tap/timetree-exporter)でも入れられます。
python3 -m venv .venv
.venv/bin/pip install timetree-exporter
書き出し
.venv/bin/timetree-exporter -o timetree.ics
実行すると、メールアドレスとパスワードを聞かれます。そのあと、TimeTreeのカレンダー一覧が出るので、番号で選びます。
Enter your email address: (メールアドレス)
Enter your password: (パスワード)
1. 夫婦のカレンダー (code: xxxxxxxx)
2. 自分用カレンダー (code: xxxxxxxx)
Which Calendar(s) do you want to export? (Default to 1): 1
...
[INFO] Found 2794 events
[INFO] Found 10 labels
[INFO] A total of 2768/2794 events are added to the calendar
今回は、2,794件のうち2,768件が書き出されました。残りの26件が書き出されなかった理由は、ログには出ていません。
README に載っているログイン方法は、メールアドレスとパスワードだけです。TimeTree に Google や Apple のアカウントでログインしている場合は、先にアプリ側でメールアドレスとパスワードを登録しておく必要があると思います(筆者はメールアドレスでの登録だったので未確認です)。
パスワードは自分で入力した
Claude Code には、ツールのインストールとコマンドの起動までを任せました。パスワードの入力は、Claude Code が開いたターミナルのタブで自分で行いました。Claude Code 側も「パスワードは代わりに入力できない」と言って、そこで手を止めています。
認証情報をAIに渡さずに済む分け方なので、同じような作業をする方にもおすすめです。
手順2:Googleカレンダーに取り込む
取り込み先は新しいカレンダーにする
timetree-exporter の README には、失敗したときに消してやり直せるよう、別のカレンダーに取り込むことが勧められています。Googleカレンダーの取り込みは、何も指定しないとメインのカレンダーに入ります。
取り込みは「設定」→「インポート/エクスポート」で、ファイルと取り込み先のカレンダーを選んで行います。
ハマり1:約2,800件を一度に取り込むと、何も入らなかった
最初、timetree.ics(約860KB、2,768件)をそのまま取り込みました。インポートボタンが一度押せなくなり、数分後に元に戻りました。ところが、カレンダーを開くと予定が1件も入っていません。
Googleのヘルプには、取り込めるファイルの大きさや件数の上限は書かれていませんでした。そこで、64件だけの小さなファイルで試すと、「64 件の予定のうち 64 件をインポートしました」と表示され、全件入りました。
最終的に、300件ずつのファイルに分けて、1つずつ取り込みました。10ファイルとも全件取り込めています。
分けるのに使ったスクリプトです。VCALENDAR の先頭部分(タイムゾーンの定義を含む)は、どのファイルにも付けています。
"""Split an .ics file into chunks of N events (keeping header/VTIMEZONE)."""
import re
import sys
from pathlib import Path
src, outdir, size = Path(sys.argv[1]), Path(sys.argv[2]), int(sys.argv[3])
text = src.read_text(encoding="utf-8").replace("\r\n", "\n")
first = text.index("BEGIN:VEVENT")
last = text.rindex("END:VEVENT") + len("END:VEVENT\n")
header, body, footer = text[:first], text[first:last], text[last:]
events = re.findall(r"BEGIN:VEVENT\n.*?END:VEVENT\n", body, flags=re.S)
outdir.mkdir(parents=True, exist_ok=True)
for i in range(0, len(events), size):
chunk = events[i : i + size]
name = outdir / f"part_{i // size + 1:02d}.ics"
name.write_text((header + "".join(chunk) + footer).replace("\n", "\r\n"), encoding="utf-8")
print(name.name, len(chunk))
print("total", len(events))
python3 split_ics.py timetree.ics split 300
どこからが失敗するのかの境目は調べていません。300件・約100KBのファイルは問題なく取り込めた、という筆者の環境での結果です。
ハマり2:TimeTreeのラベルの色が引き継がれない
取り込んだ予定は、すべて取り込み先のカレンダーの色1色になりました。TimeTreeでは、ラベル(「夫」「妻」「子ども」「デート」「誕生日」など)で色を分けていたので、見分けがつきません。
書き出した .ics を見ると、ラベル名は CATEGORIES、色は COLOR として残っていました。
BEGIN:VEVENT
SUMMARY:有休
DTSTART:20261228
DTEND:20261229
CATEGORIES:夫
COLOR:#47b2f7
...
END:VEVENT
README にも、ラベルの色は出力に含まれるが、Googleカレンダーは取り込み時にその色を使わない、と書かれています。
そこで、ラベルごとにカレンダーを分けることにしました。Googleカレンダーでは、予定を作るときに選ぶカレンダーが、TimeTreeのラベル代わりになります。
-
CATEGORIESごとに.icsを分ける(1ファイル300件以下) - ラベルと同じ名前のカレンダーを8つ作る
- それぞれに取り込む
- カレンダーの色を「カスタム色を追加」で、
COLORの色コード(例:#47b2f7)にする
あとで気づきましたが、timetree-exporter には --split-by-label というオプションがあり、ラベルごとに .ics を分けて書き出せます。最初からこれを使えば、分ける手間が1つ減りました。
ハマり3:同じ予定を別のカレンダーに取り込むと、コピーになる
あとから、ラベルのカレンダーの1つを、Googleアカウントのメインのカレンダーにまとめたくなりました。メインのカレンダーは、ホットペッパーやGmailの予約が自動で入る先なので、こちらに寄せたほうが便利だったからです。
同じ .ics をメインのカレンダーに取り込むと、全件取り込めました。ただし、元のカレンダーの予定は残ったままで、同じ予定が2つずつ表示されました。予定のID(UID)が同じでも、別のカレンダーなら別の予定として入るようです。
まとめるときは、取り込んだあとで元のカレンダーを消す必要があります。
手順3:夫婦で共有する
カレンダーの「設定と共有」→「共有する相手」→「ユーザーやグループを追加」で、妻のGoogleアカウントを追加しました。
権限は「予定の詳細を変更、表示可能」にしています(画面上の表記は「すべての予定の詳細の変更や表示ができます」)。予定の閲覧・追加・変更・削除ができますが、共有の設定は変えられません。
| 権限 | できること |
|---|---|
| 予定の表示(時間枠のみ、詳細は非表示) | 予定がある時間枠だけ見られる |
| 予定の詳細の表示 | 予定の名称や詳細を見られる |
| 予定の詳細を変更、表示可能 | 予定を編集できる |
| 予定の変更および共有の管理 | 予定の編集に加えて、ほかの人とも共有できる |
共有はカレンダーごとなので、カレンダーを8つに分けた分、招待メールも8通届きます。分け方を決めるときに、ここも考えておくとよいと思います。
ハマり4:書き出しても0件のカレンダーがあった
TimeTreeの「自分用カレンダー」も書き出してみました。ログには Found 1 events と出たのに、A total of 0/1 events are added で、中身が空の .ics ができました。
理由は分かっていません。1件だけだったので、手で入れ直せば済む話でした。件数の少ないカレンダーは、TimeTreeのアプリで中身を見たほうが早いです。
Claude Code に任せたこと・自分でやったこと
| 作業 | 担当 |
|---|---|
| timetree-exporter のインストール、コマンドの起動 | Claude Code |
| TimeTree へのログイン(パスワード入力) | 自分 |
.ics の件数・日時形式・ラベルの確認 |
Claude Code |
| ファイルの分割スクリプト | Claude Code |
| カレンダーの作成、取り込み、色の設定、共有 | Claude Code(Claude in Chrome でブラウザを操作) |
| 不要になったカレンダーの削除 | 自分 |
Claude Code は、パスワードの入力や、カレンダーを中の予定ごと完全に消す操作には手を出しませんでした。そこだけ自分で操作して、あとは任せる、という分け方で進められました。
画面操作のなかでは、送信ボタンの上に連絡先カードが重なって、意図しないページが開いたこともありました。見るだけのページだったので害はありませんでしたが、ブラウザ操作を任せるときは、途中のスクリーンショットを確認しながら進めるのが安心です。
まとめ
- timetree-exporter で、TimeTree の予定を
.icsに書き出せる(非公式ツールなので自己責任で) - Googleカレンダーへの取り込みは、小さいファイルに分けて行う。大きなファイルは、エラー表示なしで失敗することがあった
- ラベルの色は引き継がれないので、ラベルごとにカレンダーを分けると TimeTree に近い見た目になる(
--split-by-labelが使える) - 同じ予定を別のカレンダーに取り込むとコピーになる。まとめるなら元のカレンダーを消す
- 共有はカレンダーごと。カレンダーを分けた数だけ、共有の招待が届く