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)

 

以上