【Python】Outlook予定表の空き時間を自動取得する方法|会議調整を効率化

【Python】Outlook予定表の空き時間を自動取得する方法|会議調整を効率化 Python

会議の調整に時間がかかる要因の一つが、参加者の予定確認です。Microsoft 365(Outlook)とPythonを連携すれば、複数人の予定をAPI経由で取得し、共通の空き時間を自動で抽出できます。

この記事では、Microsoft Graph APIを活用してOutlook予定表から空き時間を取得するPythonスクリプトの構築方法を解説します。

前提:Microsoft Graph APIの準備

  1. Microsoft Entra ID(旧 Azure AD)でアプリ登録
  2. 以下のAPIアクセス権限を付与し、管理者承認
    • Calendars.Read
    • Calendars.Read.Shared
  3. クライアントID・テナントID・シークレットを取得

必要ライブラリのインストール

pip install msal requests pytz

Pythonでトークンを取得

from msal import ConfidentialClientApplication

client_id = "YOUR_CLIENT_ID"
tenant_id = "YOUR_TENANT_ID"
client_secret = "YOUR_CLIENT_SECRET"

app = ConfidentialClientApplication(
    client_id,
    authority=f"https://login.microsoftonline.com/{tenant_id}",
    client_credential=client_secret
)

token = app.acquire_token_for_client(scopes=["https://graph.microsoft.com/.default"])
access_token = token["access_token"]

空き時間(Free/Busy)を取得する

import requests
from datetime import datetime, timedelta
import pytz

# 対象ユーザーのメールアドレス
user_email = "user@example.com"

# 対象日時の範囲(UTC)
start_time = datetime.utcnow().replace(hour=0, minute=0, second=0)
end_time = start_time + timedelta(days=1)

# Graph APIエンドポイント
url = "https://graph.microsoft.com/v1.0/me/calendar/getSchedule"

headers = {
    "Authorization": f"Bearer {access_token}",
    "Content-Type": "application/json"
}

body = {
    "schedules": [user_email],
    "startTime": {
        "dateTime": start_time.isoformat(),
        "timeZone": "UTC"
    },
    "endTime": {
        "dateTime": end_time.isoformat(),
        "timeZone": "UTC"
    },
    "availabilityViewInterval": 30
}

response = requests.post(url, headers=headers, json=body)
data = response.json()

if "value" in data:
    availability = data["value"][0]["availabilityView"]
    print("30分ごとの予定(0=空き, 1=予定あり):")
    print(availability)

共通の空き時間を取得する(複数人)

複数のメールアドレスを"schedules"に指定することで、共通の空き時間をチェック可能です。すべてのユーザーで0が並んだ時間帯が「空き」と判断できます。

応用:最初の空き時間を抽出して通知

def find_first_available_slot(availability, interval_minutes=30):
    for i, val in enumerate(availability):
        if val == "0":
            start = start_time + timedelta(minutes=i * interval_minutes)
            return start.astimezone(pytz.timezone("Asia/Tokyo")).strftime("%H:%M")
    return "空きなし"

print("最初の空き時間:", find_first_available_slot(availability))

まとめ

Microsoft Graph APIとPythonを連携させることで、Outlook予定表から空き時間を自動取得できます。これにより、会議調整や面談スケジュール作成を効率化でき、業務の無駄を削減できます。

Slackやメールと連携させて自動通知する仕組みに拡張すれば、さらに便利なスケジュール管理ボットも実現できます。ぜひ実務に活用してみてください。