【Python】GoogleカレンダーAPIを操作して予定の取得・追加をする方法

アイキャッチ画像
  • PythonでGoogleカレンダーAPIを操作するには?
  • PythonでGoogleカレンダーの予定を取得・追加するには?

本記事ではこのような疑問を解決します。

筆者がWebアプリを開発している際に、Googleカレンダーからデータを取得する機能の実装が必要になりました。

そこで今回はドキュメントを残す目的でGoogleカレンダーAPIを操作して予定の取得・追加をする方法を解説していきます。

あわせて読みたい

エンジニアが副業を始めるには?エンジニアの副業にはどんな種類がある? 本記事ではこのような疑問を解決します。副業がブームになっている昨今、エンジニアほど副業をやりやすい職業はないでしょう。副業に関心があったり、副業をしてみたいと思っ[…]

アイキャッチ画像

Google Cloud Platformで各種準備をする

まずはGoogleのクラウドサービスであるGoogle Cloud Platform(以下GCP)で各種準備をしていきます。

GCPで行う作業は以下の通りです。

・GCPプロジェクトを作成する

・Google Calendar APIを有効にする

・サービスアカウントを作成する

・サービスアカウントの鍵を作成・配置する

GCPプロジェクトを作成する

まずはGCP公式サイトからGCPプロジェクトを作成しましょう。

GCPではプロジェクト単位で課金やユーザー管理が行われます。

Google Calendar APIを有効にする

①ナビゲーションメニューから、[APIとサービス]→[ライブラリ]を選択する。

②検索窓から「Google Calendar API」を検索し、[有効化]をクリックする。

サービスアカウントを作成する

①ナビゲーションメニューから、[IAMと管理]→[サービスアカウント]を選択する。

②画面上の[+ サービスアカウントを作成]をクリックする。

③説明に沿ってサービスアカウント名などを入力する。(省略可の項目は省略してもOK)

サービスアカウントの鍵を作成・配置する

①サービスアカウントの画面で、該当のサービスアカウントの[鍵を管理]を選択する。

②「JSON」を選択して、鍵を作成する。

③作成した鍵を後に作成するPythonファイル(Google Calendar APIを操作するスクリプト)と同じディレクトリに配置する。
※鍵ファイルのパスを指定すれば、必ずしもPythonファイルと同じディレクトリである必要はない。

Googleカレンダーの共有設定を編集する

①Googleカレンダーを開き、使用するスケジュールの[設定と共有]を選択する。

②「特定のユーザーとの共有」のところで、[+ ユーザーを追加]をクリックする。

③サービスアカウントのメールアドレスを入力し、[権限]には「変更および共有の管理権限」を選択する。

必要なモジュールをインストールする

pipコマンドで下記のようにモジュールをインストールします。

$ pip install google-api-python-client google-auth

あわせて読みたい

フリーランスエンジニアが案件獲得方法とは?自ら営業せずに案件を獲得するには?実務経験1年未満でも大丈夫なの? 本記事ではこのような疑問を解決します。これからフリーランスエンジニアとして独立したい方は、兎にも角にも案件の獲得が急務です[…]

アイキャッチ画像

Pythonファイルを作成する

ここではGoogleカレンダーAPIを操作するPythonスクリプトファイルを作成します。

予定を取得する

import datetime, re
import googleapiclient.discovery
import google.auth


# ①Google APIの準備をする
SCOPES = ['https://www.googleapis.com/auth/calendar']
calendar_id = '自身のGoogleカレンダーIDを記述'
# Googleの認証情報をファイルから読み込む
gapi_creds = google.auth.load_credentials_from_file('自身の鍵ファイル名.jsonへのパス', SCOPES)[0]
# APIと対話するためのResourceオブジェクトを構築する
service = googleapiclient.discovery.build('calendar', 'v3', credentials=gapi_creds)


# ②Googleカレンダーからイベントを取得する
# 現在時刻を世界協定時刻(UTC)のISOフォーマットで取得する
now = datetime.datetime.utcnow().isoformat() + 'Z'
# 直近3件のイベントを取得する
event_list = service.events().list(
     calendarId=calendar_id, timeMin=now,
     maxResults=3, singleEvents=True,
     orderBy='startTime').execute()


# ③イベントの開始時刻、終了時刻、概要を取得する
events = event_list.get('items', [])
formatted_events = [(event['start'].get('dateTime', event['start'].get('date')), # start time or day
     event['end'].get('dateTime', event['end'].get('date')), # end time or day
     event['summary']) for event in events]


# ④出力テキストを生成する
response = '[直近イベント3件]\n'
# データの正規化をする
for event in formatted_events:
     if re.match(r'^\d{4}-\d{2}-\d{2}$', event[0]):
         start_date = '{0:%Y-%m-%d}'.format(datetime.datetime.strptime(event[1], '%Y-%m-%d'))
         response += '{0} All Day\n{1}\n\n'.format(start_date, event[2])
     # For all day events
     else:
         start_time = '{0:%Y-%m-%d %H:%M}'.format(datetime.datetime.strptime(event[0], '%Y-%m-%dT%H:%M:%S+09:00'))
         end_time = '{0:%H:%M}'.format(datetime.datetime.strptime(event[1], '%Y-%m-%dT%H:%M:%S+09:00'))
         response += '{0} ~ {1}\n{2}\n\n'.format(start_time, end_time, event[2])
response = response.rstrip('\n')
print(response)

こちらのファイルの実行結果は以下の通りです。

$ python get_calendar.py

[直近イベント3件]
2022-02-03 10:30 ~ 11:30
ミーティング①

2022-02-04 14:30 ~ 15:30
ミーティング②

予定を追加する

import datetime
import googleapiclient.discovery
import google.auth


# ①Google APIの準備をする

SCOPES = ['https://www.googleapis.com/auth/calendar']
calendar_id = '自身のGoogleカレンダーIDを記述'
# Googleの認証情報をファイルから読み込む
gapi_creds = google.auth.load_credentials_from_file('自身の鍵ファイル名.jsonへのパス', SCOPES)[0]
# APIと対話するためのResourceオブジェクトを構築する
service = googleapiclient.discovery.build('calendar', 'v3', credentials=gapi_creds)


# ②予定を書き込む
# 書き込む予定情報を用意する
body = {
    # 予定のタイトル
    'summary': 'ミーティング③',
    # 予定の開始時刻
    'start': {
        'dateTime': datetime.datetime(2022, 2, 6, 10, 30).isoformat(),
        'timeZone': 'Japan'
    },
    # 予定の終了時刻
    'end': {
        'dateTime': datetime.datetime(2022, 2, 6, 12, 00).isoformat(),
        'timeZone': 'Japan'
    },
}
# 用意した予定を登録する
event = service.events().insert(calendarId=calendar_id, body=body).execute()

こちらのファイルの実行結果は以下の通りです。

$ python create_calendar.py

$ python get_calendar.py

[直近イベント3件]
2022-02-03 10:30 ~ 11:30
ミーティング①

2022-02-04 14:30 ~ 15:30
ミーティング②

2022-02-06 10:30 ~ 12:00
ミーティン③

まとめ

以上がPythonでGoogleカレンダーの予定を取得・追加する方法になります。

操作としてはResourceオブジェクトを生成し、データの取得や作成を行うという感じです。

なお、予定の取得と追加は解説しましたが、予定の編集と削除についても今後やり方を模索してみたいと思います。


Google Calendar APIリファレンス