質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.60%

GoogleCalendarのグループカレンダーの削除

受付中

回答 0

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 692

Arisa.Sunagawa

score 15

GoogleCalendarのグループカレンダーの削除

目的:discordにて何らかの投稿があったときに、投稿内の日付を取得しカレンダーのイベントを登録する。
また、その投稿が削除されたときカレンダーのイベントを削除する。
状態:カレンダーの削除に失敗する。

該当のソースコード

1.Oath認証

from __future__ import print_function
import datetime
import pickle
import os.path
from googleapiclient.discovery import build
from google_auth_oauthlib.flow import InstalledAppFlow
from google.auth.transport.requests import Request

SCOPES = ['https://www.googleapis.com/auth/calendar']

def main():
    # token.pickleを初期作成する際は外すこと。
    creds = None
    # token.pickleファイルには、ユーザーのアクセストークンと更新トークンが格納されています。
    # 許可フローが最初に完了したときに自動的に作成されます。

    # token.pickleの読み込み
    if os.path.exists('token.pickle'):
        with open('token.pickle', 'rb') as token:
            creds = pickle.load(token)

    # token.pickleの読み込み失敗時
    # 利用可能な(有効な)認証情報がない場合は、ユーザーにログインさせます。
    if not creds or not creds.valid:

        if creds and creds.expired and creds.refresh_token:
            # ブラウザのリフレッシュ
            creds.refresh(Request())

        # ブラウザで認証URLを開く
        else:
            flow = InstalledAppFlow.from_client_secrets_file(
                'credentials.json', SCOPES)
            creds = flow.run_local_server()

        # 次回の実行のために資格情報を保存します
        with open('token.pickle', 'wb') as token:
            pickle.dump(creds, token)

if __name__ == '__main__':
    main()

2.カレンダーの操作

################################################################
#
# ファイル名:google_calendar.py
# 処理機能 :GoogleCalendarへの処理
#
################################################################
### 汎用モジュールのインポート ###
import datetime
import pickle
import re
import os.path
from googleapiclient.discovery import build
from google_auth_oauthlib.flow import InstalledAppFlow
from google.auth.transport.requests import Request

################################################################
#
# google_calendar
#
################################################################
class google_calendar:

    ############################################################
    #
    # クラス変数
    #
    ############################################################
    # カレンダーへのRW権限(スコープ)を変更する
    # 変更する際はtoken.pickleを作成しなおすこと。
    __SCOPES = ['https://www.googleapis.com/auth/calendar']

    # 変更する対象のカレンダーID
    __CARENDAR_ID = 'XXX@group.calendar.google.com'
    #__CARENDAR_ID = 'XXX@gmail.com'

    # 東京でのUTCとの誤差
    __ERR_UTC_TOKYO = 9

    # 時間の出力フォーマット
    __FORMAT_TIME = '%Y-%m-%dT%H:%M:%S%z'

    def __init__(self):#インスタンス変数管理
        pass

    ############################################################
    # 処理内容:GoogleCalendarとの接続
    # 関数名 :connect
    # 引数  :self / メソッドの仮引数
    # 戻り値 :service / GoogleCalendarAPIとの接続用クラス
    ############################################################
    def connect(self):
        # token.pickleの読み込み
        # token.pickleの作成は以下のURL参照のこと
        # https://qiita.com/lobmto/items/c1a220a12ec9c1fad560 #
        with open('token.pickle', 'rb') as token:
            creds = pickle.load(token)

        # カレンダーAPIとの接続
        service = build('calendar', 'v3', credentials=creds)

        return service

    ############################################################
    # 処理内容:GoogleCalendarのイベント削除
    # 関数名 :add_calendar_event
    # 引数  :self / メソッドの仮引数
    #        : summary / イベントのタイトル
    #        : start_time / イベントの開始時刻
    #        : end_time / イベントの終了時刻
    # 戻り値 :なし
    ############################################################
    def add_calendar_event(self, summary, start_time, end_time):
        # APIとの接続
        service = self.connect()

        # カレンダ情報の格納
        body = {'summary': summary,
                'start': {  'dateTime': start_time,
                            'timeZone': 'Asia/Tokyo',
                         },
                'end':   {  'dateTime': end_time,
                            'timeZone': 'Asia/Tokyo',
                         },
                'attendees': '',
               }

        # カレンダへイベントの追加
        event = service.events().insert(
            calendarId=google_calendar.__CARENDAR_ID,
            body=body
        ).execute()

    ############################################################
    # 処理内容:GoogleCalendarのイベント削除
    # 関数名 :del_calendar_event
    # 引数  :self / メソッドの仮引数
    #        : summary / イベントのタイトル
    #        : start_time / イベントの開始時刻
    #        : end_time / イベントの終了時刻
    # 戻り値 :なし
    ############################################################
    def del_calendar_event(self, summary, start_time, end_time):
        # APIとの接続
        service = self.connect()

        # イベントIDの取得
        eventid = self.get_calendar_event(summary, start_time, end_time)

        # カレンダのイベントを削除
        service.events().delete(
            calendarId=google_calendar.__CARENDAR_ID,
            eventId=eventid
        ).execute()

    ############################################################
    # 処理内容:GoogleCalendarのイベント取得
    # 関数名 :del_calendar_event
    # 引数  :self / メソッドの仮引数
    #        : summary / イベントのタイトル
    #        : start_time / イベントの開始時刻
    #        : end_time / イベントの終了時刻
    # 戻り値 :イベントID
    ############################################################
    def get_calendar_event(self, summary, start_time, end_time):
        # APIとの接続
        service = self.connect()

        eventid = 0
        page_token = None

        # カレンダーの取得
        while True:
            events = service.events().list(
                calendarId=google_calendar.__CARENDAR_ID,
                pageToken=page_token
            ).execute()

            # 日付データ文字(引数)を置換
            startTime = datetime.datetime.strptime(start_time,self.__FORMAT_TIME)
            endTime = datetime.datetime.strptime(end_time,self.__FORMAT_TIME)

            # イベントの検索
            for event in events['items']:
                start = event['start']
                end   = event['end']

                # 日付と卓名が一致したら、それを返却
                if event['summary'] == summary and datetime.datetime.strptime(start['dateTime'],self.__FORMAT_TIME) == startTime and datetime.datetime.strptime(end['dateTime'],self.__FORMAT_TIME) == endTime:
                    eventid = event['id']
                    break

            # 次イベントの取得
            page_token = events.get('nextPageToken')

            # 読むイベントがなくなったら終了
            if not page_token:
                break

        # idの返却
        return eventid

試したこと

1.上記コードでカレンダーへイベントの登録は行えるが削除を行うことができない。
2.上記コードの__CARENDAR_IDを'XXX@group.calendar.google.com'から'XXX@gmail.com'に変更した場合、登録/削除共に成功する。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

まだ回答がついていません

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.60%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る