So das ist nun der Code, der mir erlaubt, aus einem Skript-Aufruf in einem Starbasic-Makro in LO heraus in einem Google-Kalender ein Event zu erzeugen, verändern und zu löschen.
PYTHON: "createOL365event.py"
Code: Alles auswählen
#!/usr/bin/python3
#for python2-3 compatibility
from __future__ import print_function
import httplib2
from httplib2 import Http
import os
import sys
try:
sys.argv
except AttributeError:
sys.argv = ['createOL365event.py']
import icalendar
import pytz
from apiclient import discovery
import oauth2client
from oauth2client import client
from oauth2client import tools
import datetime
SCOPES = 'https://www.googleapis.com/auth/calendar'
CLIENT_SECRET_FILE = 'client_secret.json'
APPLICATION_NAME = 'Google Calendar API Python Quickstart'
def get_credentials():
"""Gets valid user credentials from storage.
If nothing has been stored, or if the stored credentials are invalid,
the OAuth2 flow is completed to obtain the new credentials.
Returns:
Credentials, the obtained credential.
"""
home_dir = os.path.expanduser('~')
credential_dir = os.path.join(home_dir, '.credentials')
if not os.path.exists(credential_dir):
os.makedirs(credential_dir)
credential_path = os.path.join(credential_dir,
'calendar-python-quickstart.json')
store = oauth2client.file.Storage(credential_path)
credentials = store.get()
if not credentials or credentials.invalid:
flow = client.flow_from_clientsecrets(CLIENT_SECRET_FILE, SCOPES)
flow.user_agent = APPLICATION_NAME
if flags:
credentials = tools.run_flow(flow, store, flags)
else: # Needed only for compatibility with Python 2.6
credentials = tools.run(flow, store)
print('Storing credentials to ' + credential_path)
return credentials
def CreateGoogleEvent( args, attendees):
"""Creates a new Event in an Office365-Calendar"""
kwargs = dict( args )
#http://wescpy.blogspot.co.at/2015/09/creating-events-in-google-calendar.html
credentials = get_credentials()
if not credentials or credentials.invalid:
flow = client.flow_from_clientsecrets('client_secret.json', SCOPES)
credentials = tools.run_flow(flow, store, flags) \
if flags else tools.run(flow, store)
http = credentials.authorize(httplib2.Http())
service = discovery.build('calendar', 'v3', http=http)
locdtstart = pytz.timezone(kwargs['TZALTNAME']).localize(datetime.datetime.strptime(kwargs['StartTZ'], "%Y-%m-%dT%H:%M:%S"))
locdtend = pytz.timezone(kwargs['TZALTNAME']).localize(datetime.datetime.strptime(kwargs['EndTZ'], "%Y-%m-%dT%H:%M:%S"))
data = {}
if kwargs['Subject'] != "":
data['summary'] = kwargs['Subject']
if kwargs['description'] != "":
data['Body'] = {}
data['Body']['Content'] = kwargs['description']
if kwargs['StartTZ'] != "":
data['start'] = {}
data['start']['dateTime'] = locdtstart.isoformat()
data['start']['TimeZone'] = kwargs['TZALTNAME']
if kwargs['EndTZ'] != "":
data['end'] = {}
data['end']['dateTime'] = locdtend.isoformat()
data['end']['TimeZone'] = kwargs['TZALTNAME']
if kwargs['Location'] != "":
data['location'] = kwargs['Location']
if kwargs['ORGANIZER'][0] != "":
data['organizer'] = {}
data['organizer']['email'] = kwargs['ORGANIZER'][1]
data['organizer']['displayName'] = kwargs['ORGANIZER'][0]
if kwargs['ORGANIZER'][0] != "":
data['creator'] = {}
data['creator']['email'] = kwargs['ORGANIZER'][1]
data['creator']['displayName'] = kwargs['ORGANIZER'][0]
if len(attendees) > 0:
data['Attendees'] = []
for att in attendees:
data['Attendees'].append(att[1])
if kwargs['ACTION'] == 'POST':
e = service.events().insert(calendarId=kwargs['KUID'],sendNotifications=True, body=data).execute()
return e['id']
elif kwargs['ACTION'] == 'PATCH':
#e = service.events().get(calendarId='primary', eventId='eventId').execute()
e = service.events().update(calendarId=kwargs['KUID'], eventId=kwargs['TUID'], body=data).execute()
return e['id']
elif kwargs['ACTION'] == 'DELETE':
try:
e = service.events().delete(calendarId=kwargs['KUID'], eventId=kwargs['TUID']).execute()
return 'Termin gelöscht'
except:
return 'Löschen fehlgeschlagen'
else:
return "Irgendwas ist schief gelaufen"
Starbasic:
Code: Alles auswählen
pyargs=Array(Array("StartTZ",TSTART)_
,Array("EndTZ",TEND)_
,Array("Location",TLOCATION)_
,Array("Subject",TSUMMARY)_
,Array("description",TDESCRIPTION)_
,Array("loginurl",KLOGINURL)_
,Array("urlfull",KURL)_
,Array("username",KUSERNAME)_
,Array("password",KPASSWD)_
,Array("TUID",TUID)_
,Array("TZNAME",TZNAME)_
,Array("UPDATE",TUPDATE)_
,Array("TZALTNAME",TZALTNAME)_
,Array("ORGANIZER",arOrganizer(0,1))_
,Array("ACTION",ACTION)_
,Array("SEND",sSEND)_
,Array("ICSFILE",convertfromurl(Path.Temp+"/message.eml"))_
,Array("KSMTP",KSMTP)_
,Array("APIKEY",APIKEY)_
,Array("KUID",KUID)_
)
scpr = ThisComponent.getScriptProvider
scmod = scpr.getScript("vnd.sun.star.script:createOL365event.py$CreateGoogleEvent?language=Python&location=share"))
returnFromPython = scmod.invoke(Array(pyargs, arAttendee ),b,c)
msgbox returnFromPython
Wobei anzumerken ist, dass ich im Array die Variablen über verschiedene Abfragen aus meiner Datenbank befülle.
Beispiele
TZALTNAME = "Europe/Vienna"
StartTZ = 2016-03-03T13:00:00
EndTZ = 2016-03-03T13:00:00
lg scientific