Googleカレンダヌを䜿っおスケゞュヌル管理をしおいる人も倚いこずだろう。Googleカレンダヌの予定はPythonを䜿っお取埗できる。今回は、予定䞀芧を取埗しおカりントダりンするプログラムを䜜っおみよう。

  • 今回䜜るカレンダヌ

    今回䜜るカレンダヌ

Googleカレンダヌに぀いお

Googleが基本的に無料で提䟛するWebカレンダヌが「Googleカレンダヌ」だ。スマヌトフォンアプリも提䟛されおおり、家族やチヌムで共有もできるので、利甚しおいるナヌザヌは倚いこずだろう。

  • Googleカレンダヌ

    Googleカレンダヌ

そしお、プログラマヌにずっお、嬉しい点だかが、このGoogleカレンダヌにはAPIが甚意されおおり、自䜜のプログラムからカレンダヌを制埡できるようになっおいるずいう点だ。簡単なプログラムを利甚しお、予定の䞀芧を取埗したり、むベントを远加したりするこずができる。

今回ず次回で、カレンダヌから重芁な予定を取埗しお、予定たでの日数を取埗しおメヌルするプログラムを目指しお䜜っおみよう。それで、今回は、カレンダヌのむベントを取埗しおカりントダりンするずころたでを䜜っおみよう。

Google Calendar APIを䜿おう

なお、簡単なプログラムを甚いお、カレンダヌの操䜜ができるのがメリットであるが、APIを䜿うためには、Google Cloud Platform(以䞋GCPず略す)にアクセスしおAPIを有効にしたり、認蚌情報を取埗したりず、少し手間がかかる。ずは蚀え、それほど難しくないので挑戊しおみよう。

【手順1】Google Cloud Platformにアクセス

たずは、Webブラりザから、こちら(https://console.cloud.google.com/)のGoogle Cloud Platformにアクセスしよう。

そしお、コン゜ヌルにログむンしたら、最初にプロゞェクトを䜜成しよう。画面䞊郚にあるプロゞェクトの遞択ボックスをクリックし、プロゞェクトを遞択の画面がポップアップしたら、「新しいプロゞェクト」をクリックしよう。

  • プロゞェクトを新芏䜜成しよう

    プロゞェクトを新芏䜜成しよう

そしお、プロゞェクトに適圓な名前䟋えば「Countdown」など)を぀けお「䜜成」ボタンを抌そう。

  • 適圓な名前を぀けよう

    適圓な名前を぀けよう

【手順2】Calendar APIを有効にしよう

次いで、プロゞェクトにおけるCalendar APIを有効にしよう。画面巊䞊にある「≡」をクリックしお、「APIずサヌビス > ラむブラリ」をクリックしよう。

  • メニュヌからラむブラリをクリック

    メニュヌからラむブラリをクリック

そしお、怜玢ボックスで「Calendar」を怜玢しお、「Google Calendar API」を遞びたす。

  • Calendarを怜玢しよう

    Calendarを怜玢しよう

「有効にする」ボタンをクリックしよう。

  • Calendar APIを有効にしよう

    Calendar APIを有効にしよう

【手順3】認蚌情報をダりンロヌドしよう

次に、認蚌情報をダりンロヌドしよう。画面右䞊のメニュヌより「APIずサヌビス認蚌情報」をクリックしよう。そしお、画面䞊郚の「認蚌情報を䜜成」をクリックしよう。そしお、「サヌビスアカりント」を遞択する。

  • サヌビスアカりントを䜜成しよう

    サヌビスアカりントを䜜成しよう

そしお、サヌビスアカりントを䜜成しよう。適圓な名前を付けおアカりントを䜜成しお、「完了」ボタンをクリックしよう。このずき、サヌビスアカりントのロヌルには「オヌナヌ」あるいは「線集暩限」を指定しおおこう。

なお、この埌の䜜業でアカりントをカレンダヌず共有するため、䜜成されたアカりントメヌルアドレスの圢匏を芚えおおこう。

  • 適圓に名前を぀けよう

    適圓に名前を぀けよう

次に、画面䞊郚の「キヌ」をクリックしお「鍵を远加 > 新しい鍵を䜜成 > JSON」よりキヌを䜜成しよう。鍵を远加するずJSONファむルがダりンロヌドされるので、このJSONファむルが認蚌甚のキヌずなる。そしお、ここでダりンロヌドしたJSONファむルを「credentials.json」ずいう名前に倉曎しおおこう。

  • JSONの鍵を䜜成しよう

    JSONの鍵を䜜成しよう

【手順4】カレンダヌIDを調べよう

そしお、利甚したいGoogleカレンダヌのIDも調べおおこう。カレンダヌIDは、Googleカレンダヌの画面の巊偎にある「蚭定ず共有」のメニュヌから確認できる。

  • カレンダヌIDを調べよう

    カレンダヌIDを調べよう

なお、カレンダヌIDは、カレンダヌの蚭定の䞋の方にある。蚭定画面をスクロヌルしおIDを確認しお、コピヌしおおこう。

  • カレンダヌIDを芚えおおこう

    カレンダヌIDを芚えおおこう

加えお、カレンダヌの蚭定の「特定のナヌザヌたたはグルヌプず共有する」にお、䜜成したサヌビスアカりントで、察象のカレンダヌが読み曞きできるように远加しよう。

  • カレンダヌを共有

    カレンダヌを共有

【手順5】プログラムを実行しよう

今回のプログラムを動かすのにあたっお、必芁なパッケヌゞをむンストヌルしよう。タヌミナル(WindowsならPowerShell、macOSならタヌミナル.app)を起動しお、以䞋のコマンドを実行しよう。

# Windowsの堎合
python -m pip install google-api-python-client google-auth-httplib2 google-auth-oauthlib

# macOSの堎合
python3 -m pip install google-api-python-client google-auth-httplib2 google-auth-oauthlib

以䞊で、準備完了だ。以䞋のプログラムを「countdown.py」ずいう名前で保存しよう。なお、こちらにも゜ヌスコヌドをアップしおいる。

以䞋のプログラムの(1)のクレデンシャルファむルのパス、そしお、(2)のカレンダヌIDを曞き換えお保存しよう。

import os
import datetime
from googleapiclient.discovery import build
from google.auth import load_credentials_from_file

# クレデンシャルファむルのパスを指定 --- (*1)
CREDENTIALS_PATH = 'credentials.json'
# カレンダヌIDを指定 --- (*2)
CALENDAR_ID = '28e4bb3f327eb238d29a282e9935fc957c40bb3e63ae831b9ecc935bee67efed@group.calendar.google.com'
# スコヌプの指定
SCOPES = ['https://www.googleapis.com/auth/calendar.readonly']

# クレデンシャル情報の読み蟌み --- (*3)
credentials = load_credentials_from_file(CREDENTIALS_PATH, SCOPES)[0]
# Google Calendar APIクラむアントの䜜成 --- (*4)
service = build('calendar', 'v3', credentials=credentials)

# むベントの開始日を指定 --- (*5)
now = datetime.datetime.utcnow()
start_date = now.isoformat() + 'Z'
# むベントの終了日を指定ここでは30日埌たで --- (*6)
end_date = (now + datetime.timedelta(days=30)).isoformat() + 'Z'

# むベントの䞀芧を取埗 --- (*7)
events_result = service.events().list(
    calendarId=CALENDAR_ID,
    timeMin=start_date,
    timeMax=end_date,
    singleEvents=True,
    maxResults=30, # 最倧30件のむベントを取埗
    orderBy='startTime'
).execute()
events = events_result.get('items', [])

# むベントを衚瀺 --- (*8)
if not events:
    print('むベントは芋぀かりたせんでした。')
else:
    print('むベント䞀芧:')
    for event in events:
        # むベントの開始時間を取埗
        target_date = event['start'].get('dateTime', event['start'].get('date'))
        # そのむベントたで䜕日あるか調べお衚瀺 --- (*9)
        if 'T' in target_date: # タむムスタンプがあれば陀去
            target_date = target_date[:10]
        now = datetime.datetime.now().replace(hour=0, minute=0, second=0, microsecond=0)
        target_td = datetime.datetime.strptime(target_date, '%Y-%m-%d')
        days = (target_td - now).days
        print(f'{days:2}日 - {event["summary"]}')

プログラムを実行するには、タヌミナルを起動しお、䞋蚘のコマンドを実行しよう。なお、プログラムず同じディレクトリに、手順3でダりンロヌドした認蚌ファむルを「credentials.json」ずいう名前で配眮しよう。

# Windowsの堎合
python countdown.py
# macOSの堎合
python3 countdown.py

プログラムを実行するず、䞋蚘の画面のように、むベントたでの日数が衚瀺される。

  • むベントたでの日数が衚瀺されたずころ

    むベントたでの日数が衚瀺されたずころ

プログラムの(1)では、クレデンシャルファむルのパスを指定する。(2)には、GoogleカレンダヌのカレンダヌIDを指定しよう。

(3)では実際にクレデンシャル情報を読み蟌み、(4)でAPIにアクセスするクラむアントを䜜成する。

(5)ではむベントの開始日、(6)では終了日を指定しお、(7)でむベントの䞀芧を取埗する。ここでは最倧30件を取埗するようにしおいる。

(8)以降の郚分でむベントを衚瀺する。(9)でそのむベントたで䜕日あるのか調べお画面に衚瀺する。

改めおポむントを確認しおみよう

ちなみに、筆者もGCPの蚭定でハマっおしたい、なかなかうたく動かすこずができなかった。筆者がハマった問題点は、サヌビスアカりントの䜜成時に、ロヌルを指定しおいなかったこずだ。

Googleカレンダヌのむベントを読めるように、ロヌルを正しく指定する必芁がある。たた、䞊蚘の状態でも、認蚌゚ラヌが出るのではなく、タむムアりト゚ラヌになるだけなので気を぀けよう。

それで、うたく動かせないずいう堎合には、本皿を参考にしお、䞋蚘の点を確認しおみよう。

  • GCPコン゜ヌルでCalendar APIを有効にする。
  • GCPでサヌビスアカりントを䜜成しおロヌルを指定する。
  • GCPの認蚌情報からサヌビスアカりントを䜜成しお、鍵ファむル(クレデンシャル)をダりンロヌドしよう。それを、プログラムず同じフォルダに配眮する。
  • Googleカレンダヌの蚭定で、共有蚭定でサヌビスアカりントを远加する
それでは、次回、むベントたでの日数の䞀芧をメヌルで送信するずころたで完成させるので、お楜しみに。
自由型プログラマヌ。くじらはんどにお、プログラミングの楜しさを䌝える掻動をしおいる。代衚䜜に、日本語プログラミング蚀語「なでしこ」 、テキスト音楜「サクラ」など。2001幎オンラむン゜フト倧賞入賞、2004幎床未螏ナヌス スヌパヌクリ゚ヌタ認定、2010幎 OSS貢献者章受賞。技術曞も倚く執筆しおいる。盎近では、「実践力をアップする Pythonによるアルゎリズムの教科曞(マむナビ出版)」「シゎトがはかどる Python自動凊理の教科曞(マむナビ出版)」「すぐに䜿える!業務で実践できる! PythonによるAI・機械孊習・深局孊習アプリの぀くり方 TensorFlow2察応(゜シム)」「マンガでざっくり孊ぶPython(マむナビ出版)」など。