CData Office 365ドライバーを使うと、Microsoft Graph APIの複雑な呼び出しを意識することなく、SQLだけでOutlookの予定表データにアクセスできます。本記事では、予定表グループを表す CalendarGroups、個々の予定表を表す Calendars、そして予定(イベント)そのものを表す Events の3テーブルに焦点を当て、それぞれの関係性と実践的なクエリ例を紹介します。
テーブルの関係性
Office 365の予定表データは次のような階層構造になっています。

実際のOutlookの画面ではそれぞれ以下のように表示されます。

Events テーブルは CalendarId や CalendarGroupId、GroupId といった外部キー的なカラムを持っており、どの予定表・グループに属する予定かを絞り込むことができます。
クエリ実行例
1. CalendarGroupsテーブルで予定表グループを取得する
CalendarGroups は、ユーザーが持つ予定表のグループ分け(「マイカレンダー」「共有カレンダー」など)を表すテーブルです。主なカラムは Id(主キー)、name、classId、changeKeyです。
-- すべての予定表グループを取得
SELECT Id, name FROM CalendarGroups;
-- 特定のグループを名前で絞り込む
SELECT Id, name FROM CalendarGroups WHERE name LIKE '%営業課';
クエリ実行例

2. Calendarsテーブルで個々の予定表一覧を取得する
Calendars テーブルは動的にAPIのフィールドへマッピングされ、id、name、calendargroupid、userid、color、isDefaultCalendar、canEdit、canShare、owner_address、owner_name といったカラムを持ちます。
-- ログインユーザーの予定表を一覧表示
SELECT id, name, isDefaultCalendar, color
FROM Calendars;
-- 特定の予定表グループに属する予定表だけを取得
SELECT id, name
FROM Calendars
WHERE calendargroupid = 'ここに予定表グループのIdを指定';
-- 名前で予定表を検索
SELECT id, name FROM Calendars WHERE name LIKE 'Calendar%';
クエリ実行例

新しい予定表を作成する場合は、最低限 name を指定します。
INSERT INTO Calendars (name) VALUES ('プロジェクトA用カレンダー');
3. Eventsテーブルで予定・会議情報を取得する
Events テーブルが最も列数が多く、件名(subject)、開始・終了日時(start_dateTime / end_dateTime とタイムゾーン)、場所(location_displayName)、出席者(attendees)、オンライン会議情報(onlineMeeting_joinUrl など)、定期予定の設定(recurrence_pattern_*、recurrence_range_*)まで幅広い情報を保持しています。絞り込みには CalendarId、CalendarGroupId、GroupId、UserId を利用できます。
-- 特定の予定表に属する予定を取得
SELECT subject, start_dateTime, end_dateTime, location_displayName
FROM Events
WHERE CalendarId = 'ここに予定表のIdを指定'
ORDER BY start_dateTime;
-- 特定期間かつキーワードを含む予定を検索(例: 9月のマーケティング関連の会議)
SELECT subject, start_dateTime, end_dateTime, organizer_emailAddress_name
FROM Events
WHERE start_dateTime >= '2026-09-01'
AND start_dateTime < '2026-10-01'
AND (LOWER(subject) LIKE '%marketing%' OR LOWER(bodyPreview) LIKE '%marketing%')
ORDER BY start_dateTime;
-- グループ(Microsoft 365グループ)の予定表から予定を取得
SELECT subject, start_dateTime, end_dateTime
FROM Events
WHERE GroupId = 'ここにグループのIdを指定';
クエリ実行例

新しい予定を作成するには、開始・終了それぞれの日時とタイムゾーンが必須です。
INSERT INTO Events (Subject, Body_Content, Start_DateTime, Start_TimeZone, End_DateTime, End_TimeZone, CalendarId)
VALUES ('新規テストイベント', 'Office365ドライバーから作成', '2026-09-18T10:00:00', 'Tokyo Standard Time', '2026-09-18T11:00:00', 'Tokyo Standard Time','ここの対象のカレンダーIdを指定');
このINSERT文でCalendarIdを指定しない場合、既定の予定表に予定を作成します。
クライアントクレデンシャル(アプリケーション権限)で認証している場合は、対象ユーザーを指定するために UserId を指定する必要があります。
INSERT INTO Events (Subject, Body_Content, Start_DateTime, Start_TimeZone, End_DateTime, End_TimeZone, UserId)
VALUES ('新規テストイベント', 'Office365ドライバーから作成', '2026-09-18T10:00:00', 'Tokyo Standard Time', '2026-09-18T11:00:00', 'Tokyo Standard Time', 'ここに対象ユーザーのIdを指定');
4. 他のユーザーの予定表を横断的に検索する
アプリケーション権限(クライアントクレデンシャル)を使っている場合、UserId と CalendarId を組み合わせたサブクエリで、特定ユーザーの全予定表から予定を取得できます。
SELECT *
FROM Events
WHERE UserId = 'ここに対象ユーザーのIdを指定'
AND CalendarId IN (
SELECT Id FROM Calendars WHERE UserId = 'ここに対象ユーザーのIdを指定'
);
まとめ
CalendarGroups・Calendars・Events の3テーブルの関係を理解すれば、Office 365の予定表データをSQLだけで柔軟に取得・作成できるようになります。まずは自分自身の予定表からクエリを試し、慣れてきたら組織内の他ユーザーやMicrosoft 365グループの予定表へと範囲を広げていくのがおすすめです。