macOSカレンダーにスケジュールを一括投入するのにicsファイルを作成しました。
・元データはSQLiteにあります。
・SQLiteからpythonでデータを読み出し
・必要データだけに絞り込み、
・データをicsの形に成形して書出します。
以下、実施例として、
タイトル:姓名
日付:今年の誕生日(月日)
内容:誕生日(年月日)
をセットした結果とスクリプトです。
■生成したicsファイルの一部(icsファイルはテキストファイルです)
BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//BirthdayHellomen//JA
CALSCALE:GREGORIAN
BEGIN:VEVENT
SUMMARY:伊勢鈴蘭のBD
DTSTART;VALUE=DATE:20260119
DTEND;VALUE=DATE:20260120
DESCRIPTION:2004/01/19_オレンジ(ライトオレンジ)
UID:20260119_伊勢鈴蘭@birthday.calendar
END:VEVENT
BEGIN:VEVENT
SUMMARY:橋迫鈴のBD
DTSTART;VALUE=DATE:20261006
DTEND;VALUE=DATE:20261007
DESCRIPTION:2005/10/06_ピュア レッド
UID:20261006_橋迫鈴@birthday.calendar
END:VEVENT
・・・・・・・・
END:VCALENDAR
■構造
BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//BirthdayHellomen//JA
CALSCALE:GREGORIAN
↑ここまでの4行が宣言みたいなデータ
↓以下がカレンダーデータの中身
BEGIN:VEVENT ・・・データの塊の始まり
SUMMARY:橋迫鈴のBD ・・・タイトル
DTSTART;VALUE=DATE:20261006
↑開始日(VALUE=DATE:が終日を指定。時刻がない)
DTEND;VALUE=DATE:20261007
↑終了日時
DESCRIPTION:2005/10/06_ピュア レッド
↑詳細内容
UID:20261006_橋迫鈴@birthday.calendar
↑タイトルなどから適当に生成されたUID(ユニークが必須)
END:VEVENT
(以下、VEVENTのくりかえし)
↓icsデータの末尾
END:VCALENDAR
■生成されたicsをカレンダーに読み込んだ結果例
詳細スケジュールは↓こんな感じ。
■元データのイメージ
↑見えていませんが「ID」列としてInteger、Primarykeyにセットしてあります。
他の列はすべてtextです。
■スクリプト(目的に合わせて適当に改造してください)
import os
import sqlite3
from datetime import datetime
def export_sqlite_to_ics(db_path, output_ics_path):
# 1. SQLiteデータベースに接続
conn = sqlite3.connect(db_path)
cursor = conn.cursor()
# 2. データの抽出
cursor.execute("SELECT 姓名, 生年月日, メンバーカラー, ハロ, 現役 FROM '01_メンバー情報'")
rows = cursor.fetchall()
target_year = "2026"
# 3. icsファイルの書き出し開始
with open(output_ics_path, "w", encoding="utf-8", newline="") as f:
# iCalendarヘッダーの書き込み
f.write("BEGIN:VCALENDAR\r\n")
f.write("VERSION:2.0\r\n")
f.write("PRODID:-//BirthdayHellomen//JA\r\n")
f.write("CALSCALE:GREGORIAN\r\n")
for row in rows:
name, birth_str, color, cond1, cond2 = row
if cond1=="1" and cond2=="1":
print(name, birth_str, color, cond1, cond2)
if not birth_str:
continue
try:
# 4. YYYY/MM/DD 形式から月日を抽出し、2026年に置き換える
dt = datetime.strptime(birth_str, "%Y/%m/%d")
b_month = f"{dt.month:02d}"
b_day = f"{dt.day:02d}"
# 終日イベント用の日付フォーマット (YYYYMMDD)
dtstart = f"{target_year}{b_month}{b_day}"
# 終日イベントは終了日(翌日)が必要なため計算
# 簡易的に翌日を計算(月末や年末の処理に対応するためdatetimeを使用)
current_bday = datetime(int(target_year), dt.month, dt.day)
# 1日足す (※簡易実装として86400秒追加などでなく安全に計算したい場合は
# timedeltaですが、
# 標準機能のみでシンプルに行うため、タイムスタンプ経由か自作で処理します)
# ここでは安全に翌日の文字列を作成します
from datetime import timedelta
next_day = current_bday + timedelta(days=1)
dtend = next_day.strftime("%Y%m%d")
# 詳細内容の作成
description = birth_str + color
# 5. イベントの書き込み (VEVENT)
f.write("BEGIN:VEVENT\r\n")
f.write(f"SUMMARY:{name}のBD\r\n")
# VALUE=DATE を指定することで終日扱いになります
f.write(f"DTSTART;VALUE=DATE:{dtstart}\r\n")
f.write(f"DTEND;VALUE=DATE:{dtend}\r\n")
f.write(f"DESCRIPTION:{description}\r\n")
# 必要に応じて一意のUIDを生成 (簡易的に名前と日付で生成)
f.write(f"UID:{dtstart}_{name}@birthday.calendar\r\n")
f.write("END:VEVENT\r\n")
except ValueError:
# 日付フォーマットが不正なデータはスキップ
continue
# iCalendarフッターの書き込み
f.write("END:VCALENDAR\r\n")
conn.close()
print(f"エクスポートが完了しました: {output_ics_path}")
db_path="/Users/kabayon/Documents/DataBase/ドルオタDB.db"
output_ics_path="/Users/kabayon/Desktop/_birthday_hellomen.ics"
export_sqlite_to_ics(db_path, output_ics_path)
以上


