Google Calendar 上で、一日の予定を組み替えていると、1つのイベントを移動させるだけでは成り立たなくて、連動して色々動かしたいときがでてくる。これをプログラム化させる。
美しい姿はブラウザ上で(
Google Lab的なもので)完結するのが美しいとは思うが、手元の知識だと、PCのプログラムのワンクリックでやるしか無いので、まずはこれ。
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
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'])
開始時間、終了時間を設定する
時間の比較
辞書的に比較もできるんだろうが、datetimeオブジェクトに変換する
datetime.fromisoformat(...)
とりあえず、ピッタリつけて並べてみる
直前のイベントの終了時間が、次のイベントの開始時間になる。これを繰り返す。
前にずらすことをしない
直前のイベントの終了時間が、次のイベントの開始時間より前なら、放っておけばいい。
アップデートする
アップデータには、登録先のカレンダー情報も必要。
最終更新:2019年11月24日 21:28