Ich habe versucht, den Google-Kalender mit CSV-Terminen mithilfe von Python und Google API zu aktualisieren

Ziel: Verknüpfen Sie den Kalender mit anderen Apps wie Google Kalender ⇔ CSV-Datei ⇔ einer anderen App. Die folgende Fortsetzung.

Ich habe versucht, CSV-Termine mit Python in Google Kalender aufzunehmen https://qiita.com/Octpascal/items/07e53bd89dfbca93bf3e

Ich habe ein Programm erstellt, um den Google-Kalender mit dem in der CSV-Datei beschriebenen Zeitplan zu aktualisieren. ** Derzeit ist CSV ⇒ Google Kalender eine Möglichkeit. ** ** **

Die CSV-Datei ist dieselbe wie beim letzten Mal, die folgende Beschreibung

id,cid,summary,location,description,start,end

--id: Identifikations-ID (str) in CSV --cid: ID (str), die bei der Registrierung im Kalender in Google Kalender ermittelt wurde --Zusammenfassung: Ereignisname (str)

Google Kalender-Betriebscode

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()

Geben Sie Ihre Kalender-ID in die CID ein.

check_token Aus dem Beispielcode der Google Kalender-API. Für die API-Authentifizierung.

insert Veranstaltungsanmeldung. Empfangen und werfen Sie den Wörterbuchtyp.

get_list Holen Sie sich bereits registrierte Ereignisse. Die Anzahl der Listen, die gleichzeitig abgerufen werden können, ist begrenzt. Sie können die nächste Liste jedoch durch Senden von nextPageToken abrufen.

update, delete Verwenden Sie es wie es ist

Programm zum Konvertieren von CSV für 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 Konvertieren Sie das obige CSV-Format in das Google Kalender-API-Format. Weitere Informationen finden Sie unter Vorheriger Artikel.

get_lsit Holen Sie sich eine Liste und machen Sie daraus einen Wörterbuchtyp mit nur den erforderlichen Informationen.

search_id ** Bestimmen Sie, ob das Wörterbuch einen Wert hat ** Bestimmt, ob ein Wörterbuchschlüssel (skey) eines Wörterbuchtyps (dics) einen Wert enthält. Konvertieren Sie den Wörterbuchtyp in pandas DataFrame. df [skey] == svalue gibt eine Boolesche Pandas-Serie zurück. (Beispiel: Richtig, Falsch, Falsch, Falsch) Wenn die Funktion any () auch nur ein True enthält, kann dies durch True bestimmt werden.

Zuerst wurde die for-Anweisung im Wörterbuchtyp gedreht, aber dies ist wahrscheinlich am einfachsten zu schreiben.

delete Alles, was aus CSV verschwindet, wird aus dem Kalender gelöscht.

update, insert Die bereits im Kalender registrierten werden aktualisiert. Wenn es keine gibt, registrieren Sie sie und fügen Sie die zurückgegebene Ereignis-ID zu CSV hinzu.

Aktueller Fehler

Punkte, die verbessert werden müssen

schließlich

Nächstes Mal möchte ich die oben genannten Punkte verbessern und aktualisieren.

Recommended Posts

Ich habe versucht, den Google-Kalender mit CSV-Terminen mithilfe von Python und Google API zu aktualisieren
Erstellen Sie mit Python und GAS Termine für AtCoder-Wettbewerbe in Google Kalender
Ich habe versucht, Web-Scraping mit Python und Selen
Ich habe versucht, Objekte mit Python und OpenCV zu erkennen
Ich habe Jacobian und teilweise Differenzierung mit Python versucht
Ich habe versucht, Mecab mit Python2.7, Ruby2.3, PHP7 zu verwenden
Ich habe Funktionssynthese und Curry mit Python versucht
Ich habe versucht, eine CSV-Datei mit Python zu lesen
Ich habe versucht, Google Translate aus Python zu verwenden, und es war einfach zu einfach
Ich habe versucht, Google Test und CMake in C zu verwenden
Ich habe versucht, eine CSV-Datei mit Python zu berühren
Ich habe versucht, mit Python auf Google Spread Sheets zuzugreifen
Ich habe fp-Wachstum mit Python versucht
Ich habe versucht, mit Python zu kratzen
Ich habe gRPC mit Python ausprobiert
Ich habe versucht, mit Python zu kratzen
Ich habe versucht, die Python-Bibliothek von Ruby mit PyCall zu verwenden
Ich habe versucht, Follow Management mit Twitter API und Python (einfach)
[Python Scraping] Ich habe versucht, Google Search Top10 mit Beautifulsoup & Selenium
Ich habe versucht, die Benutzeroberfläche neben Python und Tkinter dreiäugig zu gestalten
Ich habe versucht, WebScraping mit Python.
Ich habe versucht, Thonny (Python / IDE) zu verwenden.
Ich habe mit PyQt5 und Python3 gespielt
Lesen und Schreiben von CSV mit Python
Ich habe versucht, Prolog mit Python 3.8.2 auszuführen.
Ich habe die SMTP-Kommunikation mit Python versucht
Ich habe versucht, das Ranking des Qiita-Adventskalenders mit Python zu kratzen
Bearbeiten Sie die Google-Tabelle mit Python (kostengünstiger RPA-Fall mit Google API und Python)
Ich habe versucht, mit Selenium und Python einen regelmäßigen Ausführungsprozess durchzuführen
Ich habe versucht, eine ToDo-App mit einer Flasche mit Python zu erstellen
Ich habe versucht, Gesichtsmarkierungen mit Python und Dlib leicht zu erkennen
Ich habe versucht, die Docomo-Spracherkennungs-API und die Google Speech-API in Java zu verwenden
Ich habe versucht, Amazon SQS mit Django-Sellerie zu verwenden
Ich habe versucht, Selen mit Headless-Chrom zu verwenden
Ich habe versucht, PyEZ und JSNAPy zu verwenden. Teil 2: Ich habe versucht, PyEZ zu verwenden
Versuchen Sie, Python mit Google Cloud-Funktionen zu verwenden
Ich habe versucht, die Bayes'sche Optimierung von Python zu verwenden
Ich habe versucht, mit Python + opencv nicht realistisch zu rendern
Ich habe versucht, die UnityCloudBuild-API von Python zu verwenden
Ich habe versucht, mit Python ② (Fibonacci-Zahlenfolge) aufzuklären.
Ich habe Numba mit Python3.5 installiert und verwendet
Ich verwende Tox und Python 3.3 mit Travis-CI
# Ich habe so etwas wie Vlookup mit Python # 2 ausprobiert
[Data Science-Grundlagen] Ich habe versucht, mit Python von CSV auf MySQL zu speichern
Umgang mit OAuth2-Fehlern bei Verwendung von Google APIs aus Python
[ML-Aents] Ich habe versucht, maschinelles Lernen mit Unity und TensorFlow of Python (v0.11β-kompatibel) zu lernen.
Ich habe ein Beispiel für den Zugriff auf Salesforce mit Python und Bottle erstellt
Ich habe versucht, PyEZ und JSNAPy zu verwenden. Teil 1: Übersicht
Ich habe versucht, das Bild mit Python + OpenCV zu "glätten"
Ich habe versucht, einen periodischen Prozess mit CentOS7, Selenium, Python und Chrome durchzuführen
Ich habe Hunderte Millionen SQLite mit Python ausprobiert
Kratzen Sie das Essen mit Python und geben Sie es an CSV aus
vprof - Ich habe versucht, den Profiler für Python zu verwenden
Ich habe versucht, das Bild mit Python + OpenCV zu "differenzieren"