Office365ドライバーで予定表を管理する ~CalendarGroups・Calendars・Eventsテーブルの使い方~

by 浦邊信太郎 | August 21, 2026 | Last Updated: August 21, 2026

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

テーブルの関係性

Office 365の予定表データは次のような階層構造になっています。

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

Events テーブルは CalendarIdCalendarGroupIdGroupId といった外部キー的なカラムを持っており、どの予定表・グループに属する予定かを絞り込むことができます。

クエリ実行例

1. CalendarGroupsテーブルで予定表グループを取得する

CalendarGroups は、ユーザーが持つ予定表のグループ分け(「マイカレンダー」「共有カレンダー」など)を表すテーブルです。主なカラムは Id(主キー)、nameclassIdchangeKeyです。

-- すべての予定表グループを取得
SELECT Id, name FROM CalendarGroups;

-- 特定のグループを名前で絞り込む
SELECT Id, name FROM CalendarGroups WHERE name LIKE '%営業課';

クエリ実行例

2. Calendarsテーブルで個々の予定表一覧を取得する

Calendars テーブルは動的にAPIのフィールドへマッピングされ、idnamecalendargroupiduseridcolorisDefaultCalendarcanEditcanShareowner_addressowner_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_*)まで幅広い情報を保持しています。絞り込みには CalendarIdCalendarGroupIdGroupIdUserId を利用できます。

-- 特定の予定表に属する予定を取得
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. 他のユーザーの予定表を横断的に検索する

アプリケーション権限(クライアントクレデンシャル)を使っている場合、UserIdCalendarId を組み合わせたサブクエリで、特定ユーザーの全予定表から予定を取得できます。

SELECT *
FROM Events
WHERE UserId = 'ここに対象ユーザーのIdを指定'
  AND CalendarId IN (
    SELECT Id FROM Calendars WHERE UserId = 'ここに対象ユーザーのIdを指定'
  );

まとめ

CalendarGroupsCalendarsEvents の3テーブルの関係を理解すれば、Office 365の予定表データをSQLだけで柔軟に取得・作成できるようになります。まずは自分自身の予定表からクエリを試し、慣れてきたら組織内の他ユーザーやMicrosoft 365グループの予定表へと範囲を広げていくのがおすすめです。