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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

0回答

335閲覧

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

Arisa.Sunagawa

総合スコア15

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2019/06/29 02:47

編集2019/06/29 02:49

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

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

該当のソースコード

1.Oath認証

python

1from __future__ import print_function 2import datetime 3import pickle 4import os.path 5from googleapiclient.discovery import build 6from google_auth_oauthlib.flow import InstalledAppFlow 7from google.auth.transport.requests import Request 8 9SCOPES = ['https://www.googleapis.com/auth/calendar'] 10 11def main(): 12 # token.pickleを初期作成する際は外すこと。 13 creds = None 14 # token.pickleファイルには、ユーザーのアクセストークンと更新トークンが格納されています。 15 # 許可フローが最初に完了したときに自動的に作成されます。 16 17 # token.pickleの読み込み 18 if os.path.exists('token.pickle'): 19 with open('token.pickle', 'rb') as token: 20 creds = pickle.load(token) 21 22 # token.pickleの読み込み失敗時 23 # 利用可能な(有効な)認証情報がない場合は、ユーザーにログインさせます。 24 if not creds or not creds.valid: 25 26 if creds and creds.expired and creds.refresh_token: 27 # ブラウザのリフレッシュ 28 creds.refresh(Request()) 29 30 # ブラウザで認証URLを開く 31 else: 32 flow = InstalledAppFlow.from_client_secrets_file( 33 'credentials.json', SCOPES) 34 creds = flow.run_local_server() 35 36 # 次回の実行のために資格情報を保存します 37 with open('token.pickle', 'wb') as token: 38 pickle.dump(creds, token) 39 40if __name__ == '__main__': 41 main()

2.カレンダーの操作

python

1################################################################ 2# 3# ファイル名:google_calendar.py 4# 処理機能 :GoogleCalendarへの処理 5# 6################################################################ 7### 汎用モジュールのインポート ### 8import datetime 9import pickle 10import re 11import os.path 12from googleapiclient.discovery import build 13from google_auth_oauthlib.flow import InstalledAppFlow 14from google.auth.transport.requests import Request 15 16################################################################ 17# 18# google_calendar 19# 20################################################################ 21class google_calendar: 22 23 ############################################################ 24 # 25 # クラス変数 26 # 27 ############################################################ 28 # カレンダーへのRW権限(スコープ)を変更する 29 # 変更する際はtoken.pickleを作成しなおすこと。 30 __SCOPES = ['https://www.googleapis.com/auth/calendar'] 31 32 # 変更する対象のカレンダーID 33 __CARENDAR_ID = 'XXX@group.calendar.google.com' 34 #__CARENDAR_ID = 'XXX@gmail.com' 35 36 # 東京でのUTCとの誤差 37 __ERR_UTC_TOKYO = 9 38 39 # 時間の出力フォーマット 40 __FORMAT_TIME = '%Y-%m-%dT%H:%M:%S%z' 41 42 def __init__(self):#インスタンス変数管理 43 pass 44 45 ############################################################ 46 # 処理内容:GoogleCalendarとの接続 47 # 関数名 :connect 48 # 引数  :self / メソッドの仮引数 49 # 戻り値 :service / GoogleCalendarAPIとの接続用クラス 50 ############################################################ 51 def connect(self): 52 # token.pickleの読み込み 53 # token.pickleの作成は以下のURL参照のこと 54 # https://qiita.com/lobmto/items/c1a220a12ec9c1fad560 # 55 with open('token.pickle', 'rb') as token: 56 creds = pickle.load(token) 57 58 # カレンダーAPIとの接続 59 service = build('calendar', 'v3', credentials=creds) 60 61 return service 62 63 ############################################################ 64 # 処理内容:GoogleCalendarのイベント削除 65 # 関数名 :add_calendar_event 66 # 引数  :self / メソッドの仮引数 67 # : summary / イベントのタイトル 68 # : start_time / イベントの開始時刻 69 # : end_time / イベントの終了時刻 70 # 戻り値 :なし 71 ############################################################ 72 def add_calendar_event(self, summary, start_time, end_time): 73 # APIとの接続 74 service = self.connect() 75 76 # カレンダ情報の格納 77 body = {'summary': summary, 78 'start': { 'dateTime': start_time, 79 'timeZone': 'Asia/Tokyo', 80 }, 81 'end': { 'dateTime': end_time, 82 'timeZone': 'Asia/Tokyo', 83 }, 84 'attendees': '', 85 } 86 87 # カレンダへイベントの追加 88 event = service.events().insert( 89 calendarId=google_calendar.__CARENDAR_ID, 90 body=body 91 ).execute() 92 93 ############################################################ 94 # 処理内容:GoogleCalendarのイベント削除 95 # 関数名 :del_calendar_event 96 # 引数  :self / メソッドの仮引数 97 # : summary / イベントのタイトル 98 # : start_time / イベントの開始時刻 99 # : end_time / イベントの終了時刻 100 # 戻り値 :なし 101 ############################################################ 102 def del_calendar_event(self, summary, start_time, end_time): 103 # APIとの接続 104 service = self.connect() 105 106 # イベントIDの取得 107 eventid = self.get_calendar_event(summary, start_time, end_time) 108 109 # カレンダのイベントを削除 110 service.events().delete( 111 calendarId=google_calendar.__CARENDAR_ID, 112 eventId=eventid 113 ).execute() 114 115 ############################################################ 116 # 処理内容:GoogleCalendarのイベント取得 117 # 関数名 :del_calendar_event 118 # 引数  :self / メソッドの仮引数 119 # : summary / イベントのタイトル 120 # : start_time / イベントの開始時刻 121 # : end_time / イベントの終了時刻 122 # 戻り値 :イベントID 123 ############################################################ 124 def get_calendar_event(self, summary, start_time, end_time): 125 # APIとの接続 126 service = self.connect() 127 128 eventid = 0 129 page_token = None 130 131 # カレンダーの取得 132 while True: 133 events = service.events().list( 134 calendarId=google_calendar.__CARENDAR_ID, 135 pageToken=page_token 136 ).execute() 137 138 # 日付データ文字(引数)を置換 139 startTime = datetime.datetime.strptime(start_time,self.__FORMAT_TIME) 140 endTime = datetime.datetime.strptime(end_time,self.__FORMAT_TIME) 141 142 # イベントの検索 143 for event in events['items']: 144 start = event['start'] 145 end = event['end'] 146 147 # 日付と卓名が一致したら、それを返却 148 if event['summary'] == summary and datetime.datetime.strptime(start['dateTime'],self.__FORMAT_TIME) == startTime and datetime.datetime.strptime(end['dateTime'],self.__FORMAT_TIME) == endTime: 149 eventid = event['id'] 150 break 151 152 # 次イベントの取得 153 page_token = events.get('nextPageToken') 154 155 # 読むイベントがなくなったら終了 156 if not page_token: 157 break 158 159 # idの返却 160 return eventid

試したこと

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問