J'ai essayé de mettre à jour le calendrier Google avec des rendez-vous CSV à l'aide de Python et de l'API Google

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)

Code d'opération du calendrier Google

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

Programme pour convertir CSV pour API

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.

Bug actuel

Points à améliorer

à la fin

La prochaine fois, j'aimerais améliorer les points ci-dessus et mettre à jour.

Recommended Posts

J'ai essayé de mettre à jour le calendrier Google avec des rendez-vous CSV à l'aide de Python et de l'API Google
Créez des rendez-vous pour le concours AtCoder sur Google Agenda avec Python et GAS
J'ai essayé le web scraping en utilisant python et sélénium
J'ai essayé la détection d'objets en utilisant Python et OpenCV
J'ai essayé la différenciation jacobienne et partielle avec python
J'ai essayé d'utiliser mecab avec python2.7, ruby2.3, php7
J'ai essayé la synthèse de fonctions et le curry avec python
J'ai essayé de lire un fichier CSV en utilisant Python
J'ai essayé d'utiliser Google Translate à partir de Python et c'était trop facile
J'ai essayé d'utiliser google test et CMake en C
J'ai essayé de toucher un fichier CSV avec Python
J'ai essayé d'accéder aux feuilles de calcul Google en utilisant Python
J'ai essayé fp-growth avec python
J'ai essayé de gratter avec Python
J'ai essayé gRPC avec Python
J'ai essayé de gratter avec du python
J'ai essayé d'utiliser la bibliothèque Python de Ruby avec PyCall
J'ai essayé la gestion du suivi avec l'API Twitter et Python (facile)
[Python scraping] J'ai essayé la recherche Google Top10 en utilisant Beautifulsoup et sélénium
J'ai essayé de créer une interface graphique à trois yeux côte à côte avec Python et Tkinter
J'ai essayé webScraping avec python.
J'ai essayé d'utiliser Thonny (Python / IDE)
J'ai joué avec PyQt5 et Python3
Lire et écrire du CSV avec Python
J'ai essayé d'exécuter prolog avec python 3.8.2.
J'ai essayé la communication SMTP avec Python
J'ai essayé de gratter le classement du calendrier de l'avent Qiita avec Python
Modifier la feuille de calcul Google avec Python (cas RPA à faible coût avec API Google et Python)
J'ai essayé de faire un processus d'exécution périodique avec Selenium et Python
J'ai essayé de créer une application todo en utilisant une bouteille avec python
J'ai essayé de détecter facilement les points de repère du visage avec python et dlib
J'ai essayé d'utiliser l'API de reconnaissance vocale docomo et l'API Google Speech en Java
J'ai essayé d'utiliser Amazon SQS avec django-celery
J'ai essayé d'utiliser du sélénium avec du chrome sans tête
J'ai essayé d'utiliser PyEZ et JSNAPy. Partie 2: J'ai essayé d'utiliser PyEZ
Essayez d'utiliser Python avec Google Cloud Functions
J'ai essayé d'utiliser l'optimisation bayésienne de Python
J'ai essayé le rendu non réaliste avec Python + opencv
J'ai essayé d'utiliser l'API UnityCloudBuild de Python
J'ai essayé la récurrence avec Python ② (séquence de nombres Fibonatch)
J'ai installé et utilisé Numba avec Python3.5
J'utilise tox et Python 3.3 avec Travis-CI
# J'ai essayé quelque chose comme Vlookup avec Python # 2
[Bases de la science des données] J'ai essayé d'enregistrer de csv à mysql avec python
Comment gérer l'erreur OAuth2 lors de l'utilisation des API Google à partir de Python
[ML-Aents] J'ai essayé l'apprentissage automatique en utilisant TensorFlow de Unity et Python (compatible v0.11β)
J'ai créé un exemple pour accéder à Salesforce en utilisant Python et Bottle
J'ai essayé d'utiliser PyEZ et JSNAPy. Partie 1: Aperçu
J'ai essayé de "lisser" l'image avec Python + OpenCV
J'ai essayé de faire un processus périodique avec CentOS7, Selenium, Python et Chrome
J'ai essayé des centaines de millions de SQLite avec python
Grattage de la nourriture avec python et sortie en CSV
vprof - J'ai essayé d'utiliser le profileur pour Python
J'ai essayé de "différencier" l'image avec Python + OpenCV