サービス説明プログラミング

【python】EXCEL⇒Googleカレンダーへのシフト自動取り込み設定をためしてみた(準備編)

プログラミング
この記事はプロモーションリンクが掲載されています

こんにちは。tkgです。

以前、ナスカレ→Googleカレンダーへの色変更を

自動で取り込む設定を紹介させていただきました。

その中で、社内のNW制限によりエクセルシフトを

Googleカレンダーへ自動取り込みの実現ができなかったところを、

非効率ながらcron設定を使用せずのやり方で実現していますので、

その方法を紹介させていただきます。

スポンサーリンク

前提条件

まず、私の環境での環境・制限は以下です。

環境・条件
  • シフトはエクセルで作成され、sharepoint上にあり
  • 社内NWは外部からアクセス不可
  • 会社PC(Windows)は社内にて常時起動状態
  • 情報を外部に載せてはならない
使用アプリ・システム
  • Power Automateクラウド
    (なくても良い)
  • Windows for python(3.9)
  • Visual Studio Code
    (コードを書く環境)
  • タイムスケジューラー(Windows)

会社PCは常時起動しているので、

タイムスケジューラーでpythonファイルを実行するような形で自動化してる形です。

とりあえずpython初心者なので、スクリプトは無駄なコードばっかになってますが、

ご了承ください。

自身のペースでpythonを学ぶなら
7日間の無料体験コースもあります

pythonは上記サービスで絶賛学び中です。

今回は準備・設定編です。

スポンサーリンク

step1.Power Automate

ここはなくても良いですが、原本に直接アクセスするのが、

怖いので、設定してます。

Power Automateとは

Microsoft社が提供している、業務効率化ツールで、

基本的にノーコードで自動化をしてくれるものです。

Power Automate

Microsoftのアカウントがあれば無料で使えます。

デスクトップ内で自動化するもの(Power Automate desktop)

クラウドサービスを自動化するもの(Power Automateクラウド)

があります。上記2点を連携するのは有償プランです。

Power Automateクラウド画面

このように数々のテンプレが用意されているので、

比較的容易に自動化可能です(無償では限られるところもあります)

実現可能例
  • sharepoint上のファイルが更新されたらコピーや移動
  • 更新されたらメールやチャットに送信
  • Googleカレンダーの予定時間をチャットに通知 etc…

それ以外も数々のテンプレがありますので、

主にMicrosoftサービスを使ってる人は見てみても良いかもです。

実際のフロー画面

このようにコネクターでフローを作って繋げていくもので、

私がまず、sharepoint上の、

シフト原本が更新されたら、

自身で作った適当なフォルダーへコピーするという自動化を実施。

スポンサーリンク

step2,コードを書く環境

Microsoftを使用してるなら、私のおすすめは、

Visual Studio Code

です!(Macでも可)

Visual Studio Code とは

Microsoft社の提供する無償のコードエディタ

テキスト感覚でコードを書けたり、

デバック・補完機能、Git連携・実行環境も揃っているので、便利です。

補完画面

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

Visual Studio Code画面(pythonにて1+1の足し算)

このようにファイルを作成して、

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ファイルがダウンロードされます。

JSONファイルは重要な情報なので、人に見せない+大切に保管してください。

このファイルは、コードを作成する同フォルダーに保存するほうが何かと便利です。

Visual Studio Code項目のツリー画面でもあるように、

私のファイルは「credentials.json」がそのアカウントキーになります。

Googleカレンダーの共有設定

上記参考に先程発行された、

サービスアカウントのメールアドレスを

Googleカレンダーへ共有設定をすれば一先ず完了です!

Googleカレンダー共有設定権限画面

共有する権限は「変更および共有の管理権限」を選択です。

ここまでで、pythonからGoogleカレンダーを操作できる

土台が完成しました。

コード操作(基本形)

ここからはVisual Studio Codeで操作していきます。

まず必要なモジュールをインストールします。

pip install google-api-python-client google-auth
VScode画面

上記のように、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の条件は上記の公式リファレンスに記載されてます。

他にもまだまだありますね。

まとめ

上記のコードを参考に、以下のように作成しようと思います。

作成まで
  • 1
    sharepointに接続
  • 2
    月日数を定義+読み込むシートタブを定義
  • 該当のEXCELのデータを取得
  • 4
    データの整形
  • Googleカレンダーへの追加定義

    ※シフトデータ以外の処理は除外

  • 6
    エクセルとカレンダーの差分抽出
  • 7
    差分を削除
  • 8
    差分の追加

また、pythonそこまで詳しくはないので、

クラスや例外処理とかは使ってないです。
※あと無駄作業かなりあります。。

次回は実践のコードについて

記載させていただきます。

スポンサーリンク
スポンサーリンク
スポンサーリンク
tkg
tkg

当サイトの運営者。
普段はIT系で運用保守のお仕事してます。
趣味でブログを始めるにあたって、
家電・ガジェット・機械・お金の話など、ジャンルに囚われずに筆者自身、または周りが経験したものを紹介やレビューしていきます。

tkgをフォローする
tkgをフォローする

コメント

タイトルとURLをコピーしました