自動化 > 一日の予定を詰めて表示してみる

Google Calendar 上で、一日の予定を組み替えていると、1つのイベントを移動させるだけでは成り立たなくて、連動して色々動かしたいときがでてくる。これをプログラム化させる。

美しい姿はブラウザ上で(Google Lab的なもので)完結するのが美しいとは思うが、手元の知識だと、PCのプログラムのワンクリックでやるしか無いので、まずはこれ。

Python で書き、Google API を叩く。

Google Calendar が動かせるようにする

カレンダー上のイベントを読み出す

今日のイベントだけ読み出す

この先のイベントをずっとを、隙間なく並べられても困るので、開始と終了の設定は必要。
timeMin, timeMax で設定できる。

とりあえず、今日一日にしておこう。現在時刻を取得しようとしたらこれ。
now = datetime.datetime.utcnow().isoformat() + 'Z' # 'Z' indicates UTC time
# 2019-11-24T01:56:42.025634Z

google calendar さんが認識するのは
現在11時くらい。ローカルタイムのほうがわかりやすい。

now = datetime.datetime.now(timespec="seconds").isoformat() + '+09:00:00'
# 2019-11-24T11:10:55+09:00:00
"+09:00:00" がなかったら駄目だった。あと、ミリ秒はいらないので、秒まで。実質、秒もいらないけど、通らない。(+09:00:00 と秒まで書いてしまったからか?)
https://note.nkmk.me/python-datetime-isoformat-fromisoformat/
さて、終了時間を丸一日先にすると、夜中も仕事をさせられるので、12時までにしよう。そのまま日付に+1をすると、月末に良からぬことが起こると嫌なので、(10月32日を11月1日と認識してくれればいいが)
tomorrow = now + timedelta(days=1)
endtime = datetime(tomorrow.year, tomorrow.month, tomorrow.day)
end_iso = endtime.isoformat(timespec="seconds") + '+09:00:00'
にして、timeMaxとして、イベントを取り出す

複数カレンダーの今日のイベントをまとめる

取得するカレンダーのidを切り替える。
いまのところ決め打ちでいく。

events = []
a = service.events().lists(calendarId="...",,,),execute()
events.extend(a.get("item",[]) # キーitemがなければ、空の配列([])を返す
b = service.events().lists(calendarId="...",,,),execute()
events.extend(b.get("item",[]) # キーitemがなければ、空の配列([])を返す

loopを回すのが美しいが、とりあえずこのままで。

開始時間順に並べ替える

辞書のリストを並べ替えることになる。
events_sorted = sorted(events, key=lambda x:x['start']['dateTime'])
これがわかりやすかった。並べ替えのキーとして events の要素を x としたときに、 x のstartのdateTime を使ってくれ、といっている。
https://qiita.com/n10432/items/e0315979286ea9121d57

開始時間、終了時間を設定する


時間の比較

辞書的に比較もできるんだろうが、datetimeオブジェクトに変換する

datetime.fromisoformat(...)
使えるのが python 3.7 以降みたいで、3.6.7だった自分は一旦引っかかった。
バージョンを変えたら、違うところで問題出た。
Python/_ssl が見つからない問題

とりあえず、ピッタリつけて並べてみる

直前のイベントの終了時間が、次のイベントの開始時間になる。これを繰り返す。

前にずらすことをしない

直前のイベントの終了時間が、次のイベントの開始時間より前なら、放っておけばいい。

アップデートする

アップデータには、登録先のカレンダー情報も必要。
最終更新:2019年11月24日 21:28