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)
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
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.
Nächstes Mal möchte ich die oben genannten Punkte verbessern und aktualisieren.