Skip to content

Instantly share code, notes, and snippets.

@ppdms
Created December 31, 2022 14:30
Show Gist options
  • Save ppdms/b17afb2aee421be43f2ed048b4ee154a to your computer and use it in GitHub Desktop.
Save ppdms/b17afb2aee421be43f2ed048b4ee154a to your computer and use it in GitHub Desktop.
add events to Google Calendar from a Sheets spreadsheet
# WARNING: deletes all events in specified time range (line 53)
# see https://docs.google.com/spreadsheets/d/1Iwd2qV-xbHgyDU2YKQr7UedLvYhVsEmxciuPsk5rLA0/ for example spreadsheet layout
# there should be a credentials.json file in your working directory: see https://developers.google.com/calendar/api/quickstart/python#authorize_credentials_for_a_desktop_application
# also, properly setup your project's authorization screen to include both required scopes.
# code based on https://github.com/googleworkspace/python-samples/blob/main/calendar/quickstart/quickstart.py (and sheets equivalent)
from __future__ import print_function
import os.path
from google.auth.transport.requests import Request
from google.oauth2.credentials import Credentials
from google_auth_oauthlib.flow import InstalledAppFlow
from googleapiclient.discovery import build
from googleapiclient.errors import HttpError
import datetime
SCOPES = ['https://www.googleapis.com/auth/spreadsheets', 'https://www.googleapis.com/auth/calendar']
spreadsheetID=''
calendarID=''
def main():
creds = None
if os.path.exists('token.json'):
creds = Credentials.from_authorized_user_file('token.json', SCOPES)
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)
with open('token.json', 'w') as token:
token.write(creds.to_json())
try:
sheet = build('sheets', 'v4', credentials=creds).spreadsheets()
calendar = build('calendar', 'v3', credentials=creds)
def getValues(range):
result = sheet.values().get(spreadsheetId=spreadsheetID,
range=range).execute()
values = result.get('values', [])
return values
subjects = [["Discrete", getValues("A2:B24")], ["Python", getValues("C2:D27")],
["Econ", getValues("E2:F33")], ["Analysis", getValues("G2:H40")], ["CS", getValues("I2:J45")]]
events_result = calendar.events().list(calendarId=calendarID, timeMin=datetime.datetime.strptime(subjects[0][1][0][0], "%m/%d/%Y").isoformat() + 'Z', timeMax=datetime.datetime.strptime(subjects[4][1][43][0], "%m/%d/%Y").isoformat() + 'Z').execute()
events = events_result.get('items', [])
for event in events:
calendar.events().delete(calendarId=calendarID, eventId=event['id']).execute()
for i in range(len(subjects)):
for j in range(len(subjects[i][1])):
calendar.events().insert(calendarId=calendarID, body={
'summary': subjects[i][0],
'description': subjects[i][1][j][1],
'start': {
'date': datetime.datetime.strptime(subjects[i][1][j][0], "%m/%d/%Y").strftime("%Y-%m-%d")
},
'end': {
'date': datetime.datetime.strptime(subjects[i][1][j][0], "%m/%d/%Y").strftime("%Y-%m-%d")
},
}).execute()
except HttpError as err:
print(err)
if __name__ == '__main__':
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment