こんにちは。tkgです。
以前、ナスカレ→Googleカレンダーへの色変更を
自動で取り込む設定を紹介させていただきました。
その中で、社内のNW制限によりエクセルシフトを
Googleカレンダーへ自動取り込みの実現ができなかったところを、
非効率ながらcron設定を使用せずのやり方で実現していますので、
その方法を紹介させていただきます。
前提条件
まず、私の環境での環境・制限は以下です。
会社PCは常時起動しているので、
タイムスケジューラーでpythonファイルを実行するような形で自動化してる形です。
とりあえずpython初心者なので、スクリプトは無駄なコードばっかになってますが、
ご了承ください。
pythonは上記サービスで絶賛学び中です。
今回は準備・設定編です。
step1.Power Automate
ここはなくても良いですが、原本に直接アクセスするのが、
怖いので、設定してます。
Power Automateとは
Microsoft社が提供している、業務効率化ツールで、
基本的にノーコードで自動化をしてくれるものです。
Microsoftのアカウントがあれば無料で使えます。
デスクトップ内で自動化するもの(Power Automate desktop)
クラウドサービスを自動化するもの(Power Automateクラウド)
があります。上記2点を連携するのは有償プランです。

このように数々のテンプレが用意されているので、
比較的容易に自動化可能です(無償では限られるところもあります)
それ以外も数々のテンプレがありますので、
主にMicrosoftサービスを使ってる人は見てみても良いかもです。

このようにコネクターでフローを作って繋げていくもので、
私がまず、sharepoint上の、
シフト原本が更新されたら、
自身で作った適当なフォルダーへコピーするという自動化を実施。
step2,コードを書く環境
Microsoftを使用してるなら、私のおすすめは、
です!(Macでも可)
Visual Studio Code とは
Microsoft社の提供する無償のコードエディタで
テキスト感覚でコードを書けたり、
デバック・補完機能、Git連携・実行環境も揃っているので、便利です。

記載されている変数を予測できたり、内容も出るので、便利です。

このようにファイルを作成して、
pythonコードを記載後、実行の➤押すと、
すぐに【2】という結果返ってきてますね!
入手方法・設定


左下の「検索」→「Microsoft Store」
検索に「Visual Studio Code」入力後、ダウンロードすれば良いので簡単です!

日本語化は左のツリーの
「拡張機能」→検索欄にて該当のパックをダウンロードで完了。
「Restart」表示が右下に現れたら、クリックで再起動します。

同様にpythonの拡張機能もインストールしておきましょう!
ここまで完了したら開発環境の構築は終了です!

左のツリーでフォルダー作成したり、
ファイルも自由に作成したりできますので、
pythonのファイル拡張子である「.py」をつけたファイルを作成し、
コードを書いていきましょう!
Google Cloud Platform設定
ここからは、
Googleカレンダーへの書き込みを
pythonコードで扱えるように設定していく手順です。
まず、chromeにて自身のGoogleアカウントにて
Google Cloud Platformにアクセスしてプロジェクトを作成していきます。
GoogleカレンダAPI有効化

まず、APIを有効にするため、
「APIとサービス」→「ライブラリ」をクリック。


ライブラリ一覧から
「Google Calendar API」項目を選択後、「有効にする」クリック
アプリの登録
続いてアプリの登録を実施します。

ホーム画面にて、
「APIとサービス」→「OAuth同意画面」クリック。
同意画面にて「外部」→「作成」クリック。

アプリ情報を入力していきます。
- アプリ名⇒適当な名前でOK
- ユーザーサポートメール・メールアドレス
⇒Googleアカウントのメールアドレス入力
「保存して次へ」後は、
入力せず、最後まで「保存して次へ」でOKです。
サービスアカウント設定
次にサービスアカウントの設定です。

「APIとサービス」→「認証情報」クリック。
認証画面で、「認証情報を作成」→「サービスアカウント」クリック。
サービスアカウントの詳細画面で、
「サービスアカウント名」の入力後、「完了」。
サービスアカウント名は適当な名前でOK
サービスアカウントIDは自動で入力されるので気にしなくてOKです。
サービスアカウントの鍵を作成・配置
最後に、実際に認証させる認証キーを作成・配置作業です。

サービスアカウント作成後に、
先ほど作成した、サービスアカウントを選択。
「キー」タブ→「鍵追加」→「新しい鍵を作成」をクリック。

クリック後は「JSON」タイプで作成クリックしてください。
その後、自動でJSONファイルがダウンロードされます。
このファイルは、コードを作成する同フォルダーに保存するほうが何かと便利です。
Visual Studio Code項目のツリー画面でもあるように、
私のファイルは「credentials.json」がそのアカウントキーになります。
Googleカレンダーの共有設定
上記参考に先程発行された、
サービスアカウントのメールアドレスを
Googleカレンダーへ共有設定をすれば一先ず完了です!

共有する権限は「変更および共有の管理権限」を選択です。
ここまでで、pythonからGoogleカレンダーを操作できる
土台が完成しました。
コード操作(基本形)
ここからはVisual Studio Codeで操作していきます。
まず必要なモジュールをインストールします。
pip install google-api-python-client google-auth

上記のように、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で実行!

カレンダーを見るとテスト予定が見れますね!
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)

このようにカレンダーイベント取得もできましたね!
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()

コードを実行すると、予定が削除されましたね!
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そこまで詳しくはないので、
クラスや例外処理とかは使ってないです。
※あと無駄作業かなりあります。。
次回は実践のコードについて
記載させていただきます。
コメント