Jim's Add an Event to Apple Calendar Macro:

Rather than using a subscription based utility (like Fantastical), I wanted to be able to add an event to Apple Calendar with all of the details in place.

What follows is my solution, done in AppleScript. It uses multiple AppleScript dialog boxes to collect information (using lists or suggestions), then it creates the event for you. The only option I did not include was an end time. Since my events are most often an hour, I use that as my default.

It even grabs the URL from the front tab in Safari as a suggested URL. I am very happy with it, and felt that it was wroth sharing.

You will have to edit the following to suit your needs:

  • The list of calendars (to match the calendars in your app)
  • The list of locations (to your most used ones)
  • The list of times (as I like 11:00am to 9:00pm—which may not suit you)
  • You may wish to change the reminder times (I use 0, -15, -30, -60, -120, -1d, -1w)
  • The defaults (set them to your own preferences)

I hope that you enjoy it. Here is the AppleScript, followed by a downloadable macro, that you can import into your Keyboard Maestro library.

set theDate to short date string of (current date)

tell application (path to frontmost application as Unicode text)
	set varCal to (choose from list {"Things", "Magic", "Gaming", "Home", "Social", "Travel", "Webinar"} with title "List of Calendars" with prompt "Please select a calendar" default items "Things" OK button name {"Choose"}) as string
end tell

display dialog "Enter the event:" default answer "Appointment with "
set varName to text returned of the result

set varLocation to (choose from list {"Home", "Work", "Online", "Store", "Convention"} with title "List of locations" with prompt "Please select a location" default items "Online" OK button name {"Choose"}) as string

display dialog "Enter the date:" default answer (theDate as text)
set varDate to text returned of the result

set varTime to (choose from list {"10:00 am", "11:00 am", "12:00 pm", "1:00 pm", "2:00 pm", "3:00 pm", "4:00 pm", "5:00 pm", "6:00 pm", "7:00 pm", "8:00 pm", "9:00 pm"} with title "List of start times" with prompt "Please select the start time" default items "1:00 pm" OK button name {"Choose"}) as string
set varStart to date (varDate & space & varTime)
set varEnd to (date (varDate & space & varTime)) + (1 * hours)

display dialog "Enter the description:" default answer "→ "
set varDesc to text returned of the result

tell application "Safari"
	set varURL to URL of front document
end tell

display dialog "Enter a link:" default answer varURL
set varURL to text returned of the result

set varRemind to (choose from list {"0", "-15", "-30", "-60", "-120", "-1440", "-10080"} with title "List of reminder minutes" with prompt "Please select a reminder time" default items "-60" OK button name {"Choose"}) as string

tell application "Calendar"
	set theCurrentDate to current date
	set newEvent to make new event in calendar varCal at end with properties {description:varDesc, summary:varName, location:varLocation, start date:varStart, end date:varEnd, url:varURL}
	tell newEvent
		make sound alarm at end of sound alarms with properties {trigger interval:varRemind, sound name:"Crystal"}
	end tell
end tell

F4—Calendar: + an event.kmmacros (3.8 KB)

4 Likes

Thank you for sharing @Jim. I've edited it to fit with my specific calendars etc as you suggest and it works perfectly.

1 Like

You're welcome @Zabobon !

1 Like

Hey @Jim,

Well done!

A couple of things:

Just in case you didn't know – you can get a list of calendars like so:

tell application "Calendar"
   set calendarList to name of calendars
end tell

When I use static lists in AppleScript I really dislike using horizontal lists. They are horrible to read and maintain – so long ago I adopted the “vertical list” format:

set calendarList to items 1 thru -2 of {¬
   "Things", ¬
   "Magic", ¬
   "Gaming", ¬
   "Home", ¬
   "Social", ¬
   "Travel", ¬
   "Webinar", ¬
   ""}

However – I've become partial to letting AppleScript do all the work for me:

set calendarList to paragraphs 2 thru -2 of "
Things
Magic
Gaming
Home
Social
Travel
Webinar
"

These formats make inserting new items, deleting items, and sorting the list sooo much easier.

In Choose-From-List dialogs I like to provide a default item:

set calendarList to paragraphs 2 thru -2 of "
Things
Magic
Gaming
Home
Social
Travel
Webinar
"

set chosenCalendar to choose from list calendarList with title "Calendars" with prompt ¬
   "Please Choose a Calendar:" default items {item 1 of calendarList} ¬
   without empty selection allowed

-Chris

1 Like

Thanks @ccstone — great points!

I chose to use a manual list of calendars, as I have several subscription based calendars (US holidays, Spanish holidays, moon cycles, etc.) and I didn't want them showing up in the list. A manual list allows for curation.

In case others want to use an automated list of calendars, here is the code that I was going to use:

tell application "Calendar"
	set CalList to name of every calendar
	set varCal to choose from list CalList with title "List of Calendars" with prompt "Please choose a calendar:" default items "Things" OK button name "Choose"
end tell

I like the vertical lists, and did not know about them. I will use them. Thanks!

My lists do use default items—you may have missed them due to the length of the horizontal lists.

Thank you again for the feedback!

2 Likes

Hi @Jim - I am getting one quirk with this - when I select a PM time it is entered into the Calendar as an AM time. So, selecting 5 pm from the dropdown list puts the event at 5 am in my Calendar. Is this something that you are getting too? It might be a setting in my Calendar. I will try changing 5 pm in the list to 17:00

Yes, that was it (to answer my own question). As my Calendar is set to display 24 hour time I had to change the time choosing part to:

Now it puts the event in the right time.

2 Likes

Happy to see that you figured that out @Zabobon — I don't use military (2400) time, so this did not affect me.

Not that any of us are gong anywhere on airplanes at the moment... but I got into the habit of 2400 time when I was...

2 Likes

2400 does make sense to me. However, since I grew up with 1200, it is a hard habit to change.

Use what works best for you.

I adopted 24 hour time when I had my first regular job and mis-set my shiny new digital alarm clock to PM instead of AM.

All the clock had to indicate the difference was a dot, and it was too easy to mis-set when I was tired or not paying close attention.

When I found the clock could do 24 hour time, I was off to the races and changed all of my timekeepers to same.

No more AM/PM mistakes for me.

-Chris

1 Like

When I started with Windows (ages ago), I always had difficulties sorting my files. Then I found out in Korea that they used YYYYMMDD. Ever since my files are named YYYYMMDD-hhmmss and then the other useful informations. And when the PCs allowed for an appropriate setting I used it. It helps to find a file where you know the date, to catch a plane on time, ... But Jim, I know that it takes forever to change the habits accordingly.

1 Like

For scheduling the thing I find very ambiguous with AM PM is 12am and 12pm. I always have to really think about that when I see it in a schedule. The problem is that 12pm (pm being late sounding) feels intuitively like it should represent Midnight. I know that 12 is like zero in time - which also makes it confusing. 12:00 and 24:00 are clearly two different times in the 24:00 clock.

So, I have got into the habit of writing 12 noon. Everyone knows what that is.

True.

I use 00:00 for Midnight and 12:00 for Noon, which is the typical military convention (although they tend to omit the colon character).

But military time confuses many people, so when I write times for folks other than myself I use 12-hour time – unless I know they grok military time.

-Chris

1 Like

Jim
Nice work and thanks for doing this. You have a small typo in your code ("minute" is missing an "n").

I wonder if it would be possible to make this grab a contact that's selected rather than a (Safari) url? This would be more useful I think. I'm not an AppleScript jock but I will try to figure this out and post if if I can get it to work.

Thanks again.

You're welcome @michaelcolacino. The typo has been fixed.

Regarding Contacts, I believe that it is possible, but since I would never use it, I will leave the research, coding and implementation to you. It will be a good learning experience.