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