Objectif: associer le calendrier à d'autres applications comme Google Agenda ⇔ fichier CSV ⇔ une autre application. La suite suivante.
J'ai essayé de mettre les rendez-vous CSV sur Google Agenda en utilisant Python https://qiita.com/Octpascal/items/07e53bd89dfbca93bf3e
J'ai créé un programme pour mettre à jour le calendrier Google avec le calendrier décrit dans le fichier CSV. ** Actuellement, le calendrier CSV ⇒ Google est à sens unique. ** **
Le fichier CSV est le même que la dernière fois, la description suivante
id,cid,summary,location,description,start,end
--id: ID d'identification (str) en CSV --cid: ID (str) déterminé sur Google Agenda lors de l'enregistrement dans le calendrier --summary: nom de l'événement (str) --location: Lieu (str) --description: Détails (str) --start: Heure de début (str Exemple: 2020/08/22 09:00 ou 2020/08/22) --end: Heure de fin (même description que str start time, mais doit être alignée)
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
# If modifying these scopes, delete the file token.pickle.
SCOPES = ['https://www.googleapis.com/auth/calendar']
CID = 'Calendar ID'
def check_token():
creds = None
# The file token.pickle stores the user's access and refresh tokens, and is
# created automatically when the authorization flow completes for the first
# time.
if os.path.exists('token.pickle'):
with open('token.pickle', 'rb') as token:
creds = pickle.load(token)
# If there are no (valid) credentials available, let the user log in.
if not creds or not creds.valid:
if creds and creds.expired and creds.refresh_token:
creds.refresh(Request())
else:
flow = InstalledAppFlow.from_client_secrets_file(
'credentials.json', SCOPES)
creds = flow.run_local_server(port=0)
# Save the credentials for the next run
with open('token.pickle', 'wb') as token:
pickle.dump(creds, token)
service = build('calendar', 'v3', credentials=creds)
return service
def insert(event):
service = check_token()
# Call the Calendar API
create_event = service.events().insert(calendarId=CID, body=event).execute()
return create_event['id']
def get_lists():
service = check_token()
page_token = None
events = []
while True:
events_list = service.events().list(calendarId=CID, pageToken=page_token).execute()
page_token = events_list.get('nextPageToken')
events.extend(events_list['items'])
if not page_token:
break
return events
def update(eid, event):
service = check_token()
updated_event = service.events().update(calendarId=CID, eventId=eid, body=event).execute()
return (updated_event['updated'])
def delete(eid):
service = check_token()
service.events().delete(calendarId=CID, eventId=eid).execute()
Entrez votre identifiant de calendrier dans le CID.
check_token À partir de l'exemple de code de l'API Google Calendar. Pour l'authentification API.
insert Inscription à l'événement. Recevez et lancez le type de dictionnaire.
get_list Obtenez des événements qui ont déjà été enregistrés. Il y a une limite au nombre de listes qui peuvent être obtenues à la fois, mais vous pouvez obtenir la liste suivante en envoyant nextPageToken.
update, delete Utiliser tel quel
import pandas as pd
import datetime
import gg_calendar
import sys
TIMEZONE = 'Japan'
def TransTime(t):
if len(t) > 11:
strtime = datetime.datetime.strptime(t, '%Y/%m/%d %H:%M').isoformat()
dictime = {
'dateTime': strtime,
'timeZone': TIMEZONE
}
else :
strtime = datetime.datetime.strptime(t, '%Y/%m/%d').isoformat()
dictime = {
'date': strtime[0:10],
'timeZone': TIMEZONE
}
return dictime
def get_list():
lists = gg_calendar.get_lists()
new_lists = []
for event in lists :
new_lists.append(
{
'id': event['id'],
'summary': event['summary'],
'location': event['location'],
'description': event['description'],
'start': event['start'],
'end': event['end']
}
)
return new_lists
def search_id(dics, skey, svalue):
df = pd.DataFrame(dics)
return (df[skey] == svalue).any()
csv = pd.read_csv('csv.csv')
csv_d = csv.to_dict(orient='index')
ex_lists = get_list()
# delete
for ex_list in ex_lists:
if not search_id(csv, 'cid', ex_list['id']):
print("delete from calendar id={}".format(ex_list['id']))
gg_calendar.delete(ex_list['id'])
# update, insert
for h, num in zip(csv_d.values(), csv_d.keys()):
h['start'] = TransTime(h['start'])
h['end'] = TransTime(h['end'])
if (search_id(ex_lists, 'id', h['cid'])):
del h['id']
cid = h['cid']
del h['cid']
print('updata')
gg_calendar.update(cid, h)
else:
del h['id']
del h['cid']
try:
event_id = gg_calendar.insert(h)
except:
print("Error: Can't put id={} on your calendar".format(csv.loc[num, 'id']))
else:
print("Put id={} on your calendar as calendar_id={}".format(csv.loc[num, 'id'], event_id))
csv.loc[num, 'cid'] = event_id
csv.to_csv('csv.csv',index=False)
TransTime Convertissez le format CSV ci-dessus au format de l'API Google Agenda. Pour plus de détails, voir Article précédent.
get_lsit Obtenez une liste et faites-en un type de dictionnaire avec uniquement les informations nécessaires.
search_id
** Déterminez si le dictionnaire a une valeur **
Détermine s'il existe une valeur dans une clé de dictionnaire (skey) d'un type de dictionnaire (dics).
Convertissez le type de dictionnaire en pandas DataFrame.
df [skey] == svalue
renvoie une série booléenne pandas. (Exemple: Vrai, Faux, Faux, Faux)
S'il y a même un seul True dans la fonction any (), il peut être déterminé en étant True.
Au début, l'instruction for a été tournée dans le type dictionnaire, mais c'est probablement la plus simple à écrire.
delete Tout ce qui disparaît du CSV sera supprimé du calendrier.
update, insert Ceux déjà enregistrés dans le calendrier sont mis à jour. S'il n'y en a pas, enregistrez-le et ajoutez l'ID d'événement renvoyé au CSV.
La prochaine fois, j'aimerais améliorer les points ci-dessus et mettre à jour.
Recommended Posts