こんにちは。tkgです。
以前、ナスカレ→Googleカレンダーへの色変更を
自動で取り込む設定を紹介させていただきました。
その中で、社内のNW制限によりエクセルシフトを
Googleカレンダーへ自動取り込みの実現ができなかったところを、
非効率ながらcron設定を使用せずのやり方で実現していますので、
その方法を紹介させていただきます。
前提条件
まず、私の環境での環境・制限は以下です。
会社PCは常時起動しているので、
タイムスケジューラーでpythonファイルを実行するような形で自動化してる形です。
とりあえずpython初心者なので、スクリプトは無駄なコードばっかになってますが、
ご了承ください。
pythonは上記サービスで絶賛学び中です。
今回は準備・設定編です。
step1.Power Automate
ここはなくても良いですが、原本に直接アクセスするのが、
怖いので、設定してます。
Power Automateとは
Microsoft社が提供している、業務効率化ツールで、
基本的にノーコードで自動化をしてくれるものです。
Microsoftのアカウントがあれば無料で使えます。
デスクトップ内で自動化するもの(Power Automate desktop)
クラウドサービスを自動化するもの(Power Automateクラウド)
があります。上記2点を連携するのは有償プランです。
![](https://osusume-all.com/wp-content/uploads/2022/12/e227be7976ecb0e5da431865f6ae0990-1.jpg)
このように数々のテンプレが用意されているので、
比較的容易に自動化可能です(無償では限られるところもあります)
それ以外も数々のテンプレがありますので、
主にMicrosoftサービスを使ってる人は見てみても良いかもです。
![](https://osusume-all.com/wp-content/uploads/2022/12/aa011d22ca71f16f672f5dcd9ecc6c45.jpg)
このようにコネクターでフローを作って繋げていくもので、
私がまず、sharepoint上の、
シフト原本が更新されたら、
自身で作った適当なフォルダーへコピーするという自動化を実施。
step2,コードを書く環境
Microsoftを使用してるなら、私のおすすめは、
です!(Macでも可)
Visual Studio Code とは
Microsoft社の提供する無償のコードエディタで
テキスト感覚でコードを書けたり、
デバック・補完機能、Git連携・実行環境も揃っているので、便利です。
![](https://osusume-all.com/wp-content/uploads/2022/12/image-4.png)
記載されている変数を予測できたり、内容も出るので、便利です。
![](https://osusume-all.com/wp-content/uploads/2022/12/27d71bbd22eca49f0ae19a9d5043af0c.jpg)
このようにファイルを作成して、
pythonコードを記載後、実行の➤押すと、
すぐに【2】という結果返ってきてますね!
入手方法・設定
![](https://osusume-all.com/wp-content/uploads/2022/12/image-800x526.jpg)
![](https://osusume-all.com/wp-content/uploads/2022/12/796755335cd59c77b1a9a70c9d05b825-800x492.jpg)
左下の「検索」→「Microsoft Store」
検索に「Visual Studio Code」入力後、ダウンロードすれば良いので簡単です!
![](https://osusume-all.com/wp-content/uploads/2022/12/c6863d5db080929af7c91fbb24b697f8.jpg)
日本語化は左のツリーの
「拡張機能」→検索欄にて該当のパックをダウンロードで完了。
「Restart」表示が右下に現れたら、クリックで再起動します。
![](https://osusume-all.com/wp-content/uploads/2022/12/image-1.png)
同様にpythonの拡張機能もインストールしておきましょう!
ここまで完了したら開発環境の構築は終了です!
![](https://osusume-all.com/wp-content/uploads/2022/12/image-2.png)
左のツリーでフォルダー作成したり、
ファイルも自由に作成したりできますので、
pythonのファイル拡張子である「.py」をつけたファイルを作成し、
コードを書いていきましょう!
Google Cloud Platform設定
ここからは、
Googleカレンダーへの書き込みを
pythonコードで扱えるように設定していく手順です。
まず、chromeにて自身のGoogleアカウントにて
Google Cloud Platformにアクセスしてプロジェクトを作成していきます。
GoogleカレンダAPI有効化
![](https://osusume-all.com/wp-content/uploads/2022/12/33297b7c72a063f137288daf64e3c633.jpg)
まず、APIを有効にするため、
「APIとサービス」→「ライブラリ」をクリック。
![](https://osusume-all.com/wp-content/uploads/2022/12/4e03a0e07ccc98f20a34dc3e207a4fa1-800x455.jpg)
![](https://osusume-all.com/wp-content/uploads/2022/12/7c76c91448c95bb5f5877ea07b278859.jpg)
ライブラリ一覧から
「Google Calendar API」項目を選択後、「有効にする」クリック
アプリの登録
続いてアプリの登録を実施します。
![](https://osusume-all.com/wp-content/uploads/2022/12/92cbe56330c3b63585d4462fe83234ca.jpg)
ホーム画面にて、
「APIとサービス」→「OAuth同意画面」クリック。
同意画面にて「外部」→「作成」クリック。
![](https://osusume-all.com/wp-content/uploads/2022/12/b77c20faa3dc12e0349afa96af85d1ee-1.jpg)
アプリ情報を入力していきます。
- アプリ名⇒適当な名前でOK
- ユーザーサポートメール・メールアドレス
⇒Googleアカウントのメールアドレス入力
「保存して次へ」後は、
入力せず、最後まで「保存して次へ」でOKです。
サービスアカウント設定
次にサービスアカウントの設定です。
![](https://osusume-all.com/wp-content/uploads/2022/12/f5095fb49c23e516bfe3bdadc3e16249.jpg)
「APIとサービス」→「認証情報」クリック。
認証画面で、「認証情報を作成」→「サービスアカウント」クリック。
サービスアカウントの詳細画面で、
「サービスアカウント名」の入力後、「完了」。
サービスアカウント名は適当な名前でOK
サービスアカウントIDは自動で入力されるので気にしなくてOKです。
サービスアカウントの鍵を作成・配置
最後に、実際に認証させる認証キーを作成・配置作業です。
![](https://osusume-all.com/wp-content/uploads/2022/12/a361c212b9172b5b8ee988390a2e2147.jpg)
サービスアカウント作成後に、
先ほど作成した、サービスアカウントを選択。
「キー」タブ→「鍵追加」→「新しい鍵を作成」をクリック。
![](https://osusume-all.com/wp-content/uploads/2022/12/a7fdf342be97c28b6160bbbaa28fefd9.jpg)
クリック後は「JSON」タイプで作成クリックしてください。
その後、自動でJSONファイルがダウンロードされます。
このファイルは、コードを作成する同フォルダーに保存するほうが何かと便利です。
Visual Studio Code項目のツリー画面でもあるように、
私のファイルは「credentials.json」がそのアカウントキーになります。
Googleカレンダーの共有設定
上記参考に先程発行された、
サービスアカウントのメールアドレスを
Googleカレンダーへ共有設定をすれば一先ず完了です!
![](https://osusume-all.com/wp-content/uploads/2022/12/b76b093cd7f4de965726a95bf771dcbf.jpg)
共有する権限は「変更および共有の管理権限」を選択です。
ここまでで、pythonからGoogleカレンダーを操作できる
土台が完成しました。
コード操作(基本形)
ここからはVisual Studio Codeで操作していきます。
まず必要なモジュールをインストールします。
pip install google-api-python-client google-auth
![](https://osusume-all.com/wp-content/uploads/2022/12/2365f6ab1412819e715de745efa41699.jpg)
上記のように、VScode内でpipが可能です。
予定追加(基本コード)
予定追加の基本コードです。
import datetime, re
import googleapiclient.discovery
import google.auth
# 編集スコープの設定(今回は読み書き両方OKの設定)
SCOPES = ['https://www.googleapis.com/auth/calendar']
# カレンダーIDの設定(基本的には自身のgmailのアドレス)
calendar_id = 'xxxx@gmail.com'
# 認証ファイルを使用して認証用オブジェクトを作成
gapi_creds = google.auth.load_credentials_from_file('credentials.json', SCOPES)[0]
# 認証用オブジェクトを使用してAPIを呼び出すためのオブジェクト作成
service = googleapiclient.discovery.build('calendar', 'v3', credentials=gapi_creds)
# 追加するスケジュールの情報を設定
event= {
# 予定のタイトル
'summary': 'テスト!',
# 予定の開始時刻(ISOフォーマットで指定)
'start': {
'dateTime': datetime.datetime(2022, 12, 3, 0, 00).isoformat(),
'timeZone': 'Japan'
},
# 予定の終了時刻(ISOフォーマットで指定)
'end': {
'dateTime': datetime.datetime(2022, 12, 5, 17, 59).isoformat(),
'timeZone': 'Japan'
},
}
# 予定を追加する
event = service.events().insert(calendarId = calendar_id, body = event).execute()
8行目の「calendar_id」を自身のgmailアドレスに変更後、
VScodeで実行!
![](https://osusume-all.com/wp-content/uploads/2022/12/48fcbf6b360805f18a7342b693233cf7.jpg)
カレンダーを見るとテスト予定が見れますね!
event = service.events().insert(calendarId = calendar_id, body = event).execute()
service.events().insert()が追加するコードですね!
予定取得(基本コード)
カレンダー予定取得の基本コードです。
import datetime, re
import googleapiclient.discovery
import google.auth
# 編集スコープの設定(今回は読み書き両方OKの設定)
SCOPES = ['https://www.googleapis.com/auth/calendar']
# カレンダーIDの設定(基本的には自身のgmailのアドレス)
calendar_id = 'xxxx@gmail.com'
# 認証ファイルを使用して認証用オブジェクトを作成
gapi_creds = google.auth.load_credentials_from_file('credentials.json', SCOPES)[0]
# 認証用オブジェクトを使用してAPIを呼び出すためのオブジェクト作成
service = googleapiclient.discovery.build('calendar', 'v3', credentials=gapi_creds)
# 追加するスケジュールの情報を設定
# ②Googleカレンダーからイベントを取得する
# 現在時刻を世界協定時刻(UTC)のISOフォーマットで取得する
now = datetime.datetime.utcnow().isoformat() + 'Z'
# 直近1件のイベントを取得する
event_list = service.events().list(
calendarId=calendar_id, timeMin=now,
maxResults=1, singleEvents=True,
orderBy='startTime').execute()
# ③イベントの開始時刻、終了時刻、概要を取得する
events = event_list.get('items', [])
format_events = [(event['start'].get('dateTime', event['start'].get('date')), # start time or day
event['end'].get('dateTime', event['end'].get('date')), # end time or day
event['summary']) for event in events]
print(format_events)
![](https://osusume-all.com/wp-content/uploads/2022/12/image-3.png)
このようにカレンダーイベント取得もできましたね!
event_list = service.events().list(
calendarId=calendar_id, timeMin=now,
maxResults=1, singleEvents=True,
orderBy='startTime').execute()
service.events().list()が予定を取得するコードですね!
予定削除(基本コード)
カレンダー予定を消す基本コードです。
import datetime, re
import googleapiclient.discovery
import google.auth
# 編集スコープの設定(今回は読み書き両方OKの設定)
SCOPES = ['https://www.googleapis.com/auth/calendar']
# カレンダーIDの設定(基本的には自身のgmailのアドレス)
calendar_id = 'xxxx@gmail.com'
# 認証ファイルを使用して認証用オブジェクトを作成
gapi_creds = google.auth.load_credentials_from_file('credentials.json', SCOPES)[0]
# 認証用オブジェクトを使用してAPIを呼び出すためのオブジェクト作成
service = googleapiclient.discovery.build('calendar', 'v3', credentials=gapi_creds)
# 追加するスケジュールの情報を設定
# ②Googleカレンダーからイベントを取得する
# 現在時刻を世界協定時刻(UTC)のISOフォーマットで取得する
now = datetime.datetime.utcnow().isoformat() + 'Z'
# 直近1件のイベントを取得する
event_list = service.events().list(
calendarId=calendar_id, timeMin=now,
maxResults=1, singleEvents=True,
orderBy='startTime').execute()
# ③イベントの開始時刻、終了時刻、概要を取得する
events = event_list.get("items")
#予定一覧からidを抽出して予定を削除する
for row in events:
event = service.events().delete(calendarId=calendar_id, eventId=row["id"]).execute()
![](https://osusume-all.com/wp-content/uploads/2022/12/6e4b591ef851ad1b335ab6b28bb69c15.jpg)
コードを実行すると、予定が削除されましたね!
event = service.events().delete(calendarId=calendar_id, eventId=row["id"]).execute()
service.events().delete()が削除されるコードですね!
deleteで指定するのはイベントIDと呼ばれる、
カレンダー登録されてた予定のユニークコードになってます。(登録時指定も可)
カレンダーのAPIの条件は上記の公式リファレンスに記載されてます。
他にもまだまだありますね。
まとめ
上記のコードを参考に、以下のように作成しようと思います。
- 1sharepointに接続
- 2月日数を定義+読み込むシートタブを定義
- 3該当のEXCELのデータを取得
- 4データの整形
- 5Googleカレンダーへの追加定義
※シフトデータ以外の処理は除外
- 6エクセルとカレンダーの差分抽出
- 7差分を削除
- 8差分の追加
また、pythonそこまで詳しくはないので、
クラスや例外処理とかは使ってないです。
※あと無駄作業かなりあります。。
次回は実践のコードについて
記載させていただきます。
コメント