PythonでGoogleカレンダーに予定を追加する

# モチベーション
テキストで送られてくる予定表を手を使ってカレンダーに打ち込むのがめんどくさいなぁって思い、やってみました。

予定表は例えばこんな感じ
>2019.12
2 ラーメン食べる
15 午前になんかする
16 午前ミーティング
30 午後ミーティング
31 蕎麦を食べる

# Google calendar APIを使えるようにする
[こちら](https://developers.google.com/calendar/quickstart/python?hl=ja)のページに飛んで、Enable the Google Calendar API を押してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498814/7285f249-dd2b-d294-0ab6-804917d5a31f.png)

利用規約に同意しますかみたいなことが聞かれるのでyesを押すとこの画面が出てきます。DOWNLOAD CLIENT CONFIGURATIONしてください。すると credentials.json がダウンロードされます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498814/7b8d7668-e43f-215b-996e-086f1a6aee32.png)


# Google Client Libraryをインストールする
```
pip install --upgrade google-api-python-client google-auth-httplib2 google-auth-oauthlib
```

# Googleカレンダーへのアクセスを許可する
[これ](https://github.com/udasou/AddScheduleGoogleCalendar/blob/master/AddCalendar.py)が今回使うやつ

```AddCalendar.py
from __future__ import print_function
import datetime
import pickle
import os.path
from googleapiclient.discovery import build
from google_auth_oauthlib.flow import InstalledAppFlow
from google.auth.transport.requests import Request

# If modifying these scopes, delete the file token.pickle.
SCOPES = ['https://www.googleapis.com/auth/calendar']

def readschedule():
    f = open('schedule.txt')
    data1 = f.read()  
    lines1 = data1.split('\n') 
    f.close()
    return lines1

def main():
    creds = None
    # The file token.pickle stores the user's access and refresh tokens, and is
    # created automatically when the authorization flow completes for the first
    # time.
    if os.path.exists('token.pickle'):
        with open('token.pickle', 'rb') as token:
            creds = pickle.load(token)
    # If there are no (valid) credentials available, let the user log in.
    if not creds or not creds.valid:
        if creds and creds.expired and creds.refresh_token:
            creds.refresh(Request())
        else:
            flow = InstalledAppFlow.from_client_secrets_file(
                'credentials.json', SCOPES)
            creds = flow.run_local_server(port=0)
        # Save the credentials for the next run
        with open('token.pickle', 'wb') as token:
            pickle.dump(creds, token)

    service = build('calendar', 'v3', credentials=creds)

    readschedule()
    print(readschedule())

    yearmon = readschedule()[0]
    a = yearmon.split(".")
    year = int(a[0])
    mon = int(a[1])

    if mon == 1 or mon == 3 or mon == 5 or mon == 7 or mon == 8 or mon == 10 or mon == 12:
        num_days = 31
    elif mon == 2:
        num_days = 28
    else :
        num_days = 30

    for i in readschedule():
        s = i.split(' ')
        if(len(s) == 1): continue

        d_s = int(s[0])
        d_e = int(s[0])
        m_s = mon
        m_e = mon
        y_s = year
        y_e = year

        if(mon == 12 and d_e == 31): 
            y_e = year + 1
        
        if(num_days == d_e):
            d_e = 1
            if mon == 12: m_e = 1
            else: m_e = m_e + 1 

        
            
        event = {
        'summary': '{}'.format(s[1]),
        'location': 'Japan',
        'description': '{}'.format(s[1]),
        'start': {
            'date': '{}-{}-{}'.format(y_s,m_s,d_s),
            'timeZone': 'Japan',
        },
        'end': {
            'date': '{}-{}-{}'.format(y_e,m_e,d_e),
            'timeZone': 'Japan',
        },
        }
        event = service.events().insert(calendarId='自分のカレンダーIDを入力',body=event).execute()
        print (event['id'])

if __name__ == '__main__':
    main()
```
下から5行目のところを自分のカレンダーIDに書き換えてください。
IDがわからん人は[ここ](http://www.sukicomi.net/2018/07/google-calendarid.html)を参考に


こちらが予定表の例。文法はこんな感じで
>
{年}.{月}
{日}(半角スペース){予定}(\n)
{日}(半角スペース){予定}(\n)
...

僕の書いたやつは、コンマ、半角スペース、改行文字を目印に処理してるので文法通りにしないと怒られます

```schedule.txt
2019.12
2 ラーメン食べる
15 午前になんかする
16 午前ミーティング
30 午後ミーティング
31 蕎麦を食べる
```


当たり前ですがcredentials.json と Addcalendar.py と schedule.txt は同じディレクトリに置いてください。

```
$ python3 AddCalendar.py
```
で実行すると、次のような画面がでます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498814/ea0302a4-fd5a-8506-77b2-ca51b532e6c6.png)
とても危なそうなことが言われますが、*Quickstar(安全ではないページ)に移動* を押すと、下のように表示されるので、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498814/89868ea8-abc6-d514-f20c-0ed7d99a57a2.png)
*googleカレンダーを..（略）..共有、完全な削除* をチェックをして許可してください。

# 実際にプログラムを動かして追加する
```
$ python3 Addcalendar.py
```

schedule.txt のテキストが読み込まれ、カレンダーに予定が追加されました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498814/12603334-e2d6-978a-275b-860b2f090c16.png)

#参考にしました
・[【Python】Google Calendar APIを使ってGoogle Calendarの予定を取得・追加する
](https://non-dimension.com/python-googlecalendarapi/#toc1)
・[Google Calendar APIの公式ページ](https://developers.google.com/calendar?authuser=1)