pythonでgoogle calendarの予定【勤怠】をエクセル形式で出力するプログラムを作る(データ取り込み編)
こんにちは Tomoです。
近年働き方改革の施行により業務の生産性が求められています。そんな生産性の向上のためにプログラミングを勉強する方も増えていると思います。
また、最近では音声認識を使ってGoogle calendarへの登録や、予定の確認を行う方も増えているのではないでしょうか?
プログラミングを勉強をしつつGoogle calendarを利用した簡単なプログラムを作ってみたいと思います。
第一弾としてgoogle calendarに勤怠を登録し、毎月会社に提出するエクセル形式のファイル出力をするプログラムを作成したいと思います。
1回の投稿では書ききれないので何度かに分けて投稿します。興味がある方はご覧ください。
カレンダーのエクスポートファイルをPythonで読む
今回はGoogleカレンダーのエクスポートからPythoでそのファイルを読むところの手順を投稿します。
事前に『Pythonのインストール』と『エディタ』のインストール、およびカレンダーの使用方法をご理解ください。
上記の通り過去のブログに記載しています。
Google カレンダーから予定をエクスポートする
まずは、グーグルカレンダーから予定をエクスポートします。
エクスポートは別のアプリケーションでデータを使えるようにデータを決まった形式でファイルに出力などする方法です。
これに対して別のアプリケーションからデータを使えるようにデータを決まった形式でファイルを読み込む(入力)することをインポートと言います。
今ある予定を出力すると分かり難いので、新しくカレンダーの予定を作ります。名前は「テストカレンダー」とします。
カレンダーを作成したら予定を作成します。
勤怠関連の予定を取り込みますので、予定の名前は「勤怠」として時間を「09:30~18:30」とします。この時予定の設定を「テストカレンダー」にしておきます。
では実際にエクスポートします。
左側に先ほど作成した「テストカレンダー」のラベルの上にマウスを置きます。
・・・の縦のアイコン「テストカレンダー」のオーバーフローメニューをクリックします。
「設定と共有」のリンクをクリックします。
詳細画面が開きました。赤丸のところの「カレンダーをエクスポート」をクリックします。
ダウンロードが始まります。
ファイル名は以下のような形式になっていると思います。
{Google アカウント}@gmail.com.ical.zip
これでエクスポートは完了です。
このファイルをPythonが読み込みできるフォルダに移動します。
私は「d:\python_workspace」のフォルダに「input_data」のフォルダを作成してファイルを移動しました。
ちょっとした注意点ですが、ダウンロードを何度もするとファイル名に{Google アカウント}@gmail.com.ical(1).zipこのような「()」が付きますのでどうするときに外しておいてください。
外さなくてもPython側で読み込む際に()まで指定すると読み込みはできます。
エクスポートしたファイルを読み込む
ではエディタを使ってプログラミングコードを書きます。
エクスポートしたファイルがzip形式なのでzip形式を使えるPythonのライブラリを使う宣言をします。
import zipfile
これでライブラリを使うことができます。
余談ですがPythoの利点として、ライブラリが豊富に用意されていることがあげられます。
1行改行をしてファイルを読み込むコードを書きます。
import zipfile
with zipfile.ZipFile('D:\\python_workspace\\imput_data\\{Google アカウント}@gmail.com.ical.zip') as cal_zip:
「with」は「with構文」といわれており、ファイル操作のときの「ファイルオープン」、「ファイルクローズ」を簡略化してコードを記載することができます。
ここではファイル操作の時に使うと簡単に覚えてもらえるとよいと思います。
「zipfile.ZipFile()」は先ほどimportしたzipfileライブラリのメソッドです。メソッドの説明は省略します。ここでは「zipfileライブラリのZipFile()メソッドをつかってファイルを開く」と理解していただければと思います。
このメソッドの()の中に「'D:\\python_workspace\\imput_data\\{Google アカウント}@gmail.com.ical.zip'」を記載しています。()の中にかいているのは「引数」と呼びます。
引数には「カレンダーをエクスポートしたzipファイルを保存した場所」を記載しています。
「as cal_zip」と記載していますが、これは「zipfile.ZipFile()メソッドを使ってzipファイルの情報をcal_zipの名前で変数に代入しています」
この先のコーディングでは「cal_zip」の変数を使って操作します。
最後に「:」をつけてください。これは「条件構文」や「繰り返し構文」などの「制御構文」に対して付けます。制御構文については省略します。
ちなみに、{Google アカウント}は自分のアカウントに置き換えてください{}は不要なので外してください。
次にzipファイルの中にあるファイルの情報を取得します。
zipファイルは複数のファイルを圧縮する技術です。今回は1つだけファイルが存在すると思います。
zipファイルをダブルクリックすると「{xxxxxxxx}@group.calendar.google.com.ics」({xxxxxxxx}はアルファベットや数値)の拡張子が「.ics」のファイルが存在すると思います。
import zipfile
with zipfile.ZipFile('D:\\python_workspace\\imput_data\\{Google アカウント}@gmail.com.ical.zip') as cal_zip:
with cal_zip.open('{xxxxxxxx}@group.calendar.google.com.ics') as cal_file:
ここでは先ほどzip代入した変数を使って「cal_zip」のメソッド「open()」でzipファイルの中にあるファイルを読み込んで「alfile」の変数に代入しています。
引数はzipファイルの中のファイル名を渡しています。
ここでの注意点は「半角スペース」を4つ入れているところです。プログラミングでは「インデント」と読んでいます。
Pythonはこのインデントを正しくコーディングすることが他の言語との違いとなります。インデントすることで、読みやすいプログラムとなります。
では、zipファイルの中のファイルを1行ずつ読み込んで出力したいと思います。
import zipfile
with zipfile.ZipFile('D:\\python_workspace\\imput_data\\{Google アカウント}@gmail.com.ical.zip') as cal_zip:
with cal_zip.open('{xxxxxxxx}@group.calendar.google.com.ics') as cal_file:
for line in cal_file:
print(line)
「繰り返し構文」を使ってファイルを1行ずつ読みます。
「for」が繰り返しでcal_fileの内容を1行取り出して「line」という変数に代入しています。
実際に「line」の内容をprint関数を使って出力します。
メソッドと関数の違いについては、「xxx.xxx」どっとが付いているのがメソッド、ついていないのが関数と思ってください。
ただし、このまま実行すると「line」の内容が文字化けします。
python用に出力したいと思います。
import zipfile
with zipfile.ZipFile('D:\\python_workspace\\imput_data\\{Google アカウント}@gmail.com.ical.zip') as cal_zip:
with cal_zip.open('{xxxxxxxx}@group.calendar.google.com.ics') as cal_file:
for line in cal_file:
print(line.decode('utf-8') )
lineの変数をdecodeメソッドを使って「utf-8」形式に変換します。
decodeの説明は苦手なので説明は省略します。
今回はこれで終わりです。ファイルを「testpython.py」として保存します。「utf-8」形式で保存することを忘れずに・・・
保存したら実行します
python testpython.py BEGIN:VCALENDAR PRODID:-//Google Inc//Google Calendar 70.9054//EN VERSION:2.0 CALSCALE:GREGORIAN METHOD:PUBLISH X-WR-CALNAME:テストカレンダー X-WR-TIMEZONE:Asia/Tokyo BEGIN:VEVENT DTSTART:20191228T003000Z DTEND:20191228T093000Z DTSTAMP:20191228T014818Z ・・省略 STATUS:CONFIRMED SUMMARY:勤怠 TRANSP:OPAQUE END:VEVENT END:VCALENDAR
実行すると上記のように出力されます。
次回予告
次回はカレンダーファイルから必要な情報だけを取りしたいと思います。