from ast import FormattedValue from googleapiclient.discovery import build import datetime from datetime import timedelta from zoneinfo import ZoneInfo import win32com.client from canvas_secrets import GOOGLE_API_KEY # Replace these with your own API key and Calendar ID. calendars = {'peter_main':'peter.howell@gmail.com', 'aly_and_peter':'5qgh1nv9g5on3am4vres9i451c@group.calendar.google.com', 'tlc':'4aq36obt0q5jjr5p82p244qs7c@group.calendar.google.com', 'birthdays':'4q73r3ern2k9k83t0orq6iqaac@group.calendar.google.com'} def to_my_timezone(d, md_table_format=0): # Parse the datetime string into a timezone-aware datetime. dt = datetime.datetime.fromisoformat(d) # Convert to Pacific Time. dt_pacific = dt.astimezone(ZoneInfo("America/Los_Angeles")) # Format the datetime. Note: # - %A: full weekday name (e.g., Thursday) # - %B: full month name (e.g., April) # - %d: day of the month (with leading zero, so we'll remove it later) # - %I: hour in 12-hour format (with leading zero) # - %M: minute (with leading zero) # - %p: AM/PM indicator (will be in uppercase) formatted = dt_pacific.strftime("%A, %B %d | %I:%M%p") # Remove a leading zero from the day and hour if present formatted = formatted.replace(" 0", " ") # Convert the AM/PM indicator to lowercase formatted = formatted.replace("AM", "am").replace("PM", "pm") return formatted #return dt_pacific.strftime("%Y-%m-%d %H:%M:%S %Z%z") def in_my_timezone(d, md_table_format=0): # Parse the datetime string into a timezone-aware datetime. dt = datetime.datetime.fromisoformat(d) # Convert to Pacific Time. #dt_pacific = dt.astimezone(ZoneInfo("America/Los_Angeles")) # Format the datetime. Note: # - %A: full weekday name (e.g., Thursday) # - %B: full month name (e.g., April) # - %d: day of the month (with leading zero, so we'll remove it later) # - %I: hour in 12-hour format (with leading zero) # - %M: minute (with leading zero) # - %p: AM/PM indicator (will be in uppercase) formatted = dt.strftime("%A, %B %d | %I:%M%p") # Remove a leading zero from the day and hour if present formatted = formatted.replace(" 0", " ") # Convert the AM/PM indicator to lowercase formatted = formatted.replace("AM", "am").replace("PM", "pm") return formatted def gcal(): # Build the service using the API key. service = build('calendar', 'v3', developerKey=GOOGLE_API_KEY) n = 30 for name,id in calendars.items(): # Get the current time in RFC3339 format (UTC). now = datetime.datetime.utcnow().isoformat() + 'Z' print(f'Getting the upcoming {n} events') events_result = service.events().list( calendarId=id, timeMin=now, maxResults=n, singleEvents=True, orderBy='startTime' ).execute() events = events_result.get('items', []) if not events: print('No upcoming events found.') return print(f"| Date | Time | Event | Lead |") print(f"|------|------|-------|------|") for event in events: # Depending on the event, the start time might be a date or dateTime. start = event['start'].get('dateTime', event['start'].get('date')) print(f"| {to_my_timezone(start,1)} | {event.get('summary', 'No Title')} | | |") def ocal(): # Initialize Outlook COM object. outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI") #outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI") #print(outlook) #print(dir(outlook)) #print(dir(outlook.Folders)) root_folder = outlook.Folders.Item(1) print (f"Root folder: {root_folder.Name}") #And to know the names of the subfolders you have: #print("\nFolders:") #for folder in root_folder.Folders: # print (" " + folder.Name) # Get the default calendar folder. calendar_folder = outlook.GetDefaultFolder(9) # 9 refers to the Calendar folder #print(calendar_folder) #print(dir(calendar_folder)) #print(calendar_folder.Items) items = calendar_folder.Items print("Total items in Calendar:", items.Count) # Define the time window for which to fetch events. n = 14 now = datetime.datetime.now() end = now + timedelta(days=n) # next 7 days # Restrict the calendar items to the time window. # The Outlook filter syntax uses dates in "mm/dd/yyyy hh:mm" format. filter_start = now.strftime("%m/%d/%Y %H:%M") filter_end = end.strftime("%m/%d/%Y %H:%M") restriction = f"[Start] >= '{filter_start}' AND [End] <= '{filter_end}'" calendar_items = calendar_folder.Items calendar_items.IncludeRecurrences = True calendar_items.Sort("[Start]") #print(calendar_items) print(f"Calendar items in next {n} days:") restricted_items = calendar_items.Restrict(restriction) for item in restricted_items: #for item in calendar_items: start_dt = item.Start # a COM datetime object start = in_my_timezone(str(start_dt),1) subject = item.Subject print(f"{start} - {subject}") if __name__ == '__main__': ocal()