TweetFollow Us on Twitter

Introduction to Scripting iCal

Volume Number: 21 (2005)
Issue Number: 11
Column Tag: Programming

AppleScript Essentials

Introduction to Scripting iCal

by Benjamin S. Waldie

For the past couple of articles, I have discussed scripting specific applications. By now, you should be starting to realize AppleScript terminology varies from application to application. Some applications don't support AppleScript at all, some are more scriptable than others, some have more confusing terminology, etc. Even as become more knowledgeable as a scripter, you will find that there is a learning curve whenever you need to script a new application. Browsing the application's dictionary, and any accompanying documentation or example scripts is usually your best bet for learning how to script a new application.

This month, I will continue to discuss application-specific scripting, and this time, I will focus on iCal. Please note that all sample code within this article was written and tested with Mac OS X Tiger 10.4.x. Many times, software updates will introduce changes in the AppleScript terminology of a given application or process. Therefore, if you are using an older system, some code may not work properly, or may need to be adjusted slightly to work on your machine.

Working with Calendars

Let's begin by discussing the highest-level class within iCal's object hierarchy, a calendar. In iCal, a calendar contains events and to do's, which we will discuss a little later. For now, let's talk about creating calendars, locating them, and more.

Making a New Calendar

More than likely, you are working with existing calendars within iCal, such as a "Home" or "Work" calendar. However, should you need to, you do have the ability to create calendars via AppleScript.

iCal actually contains a command specifically for creating calendars, called simply enough create calendar. This command has an optional parameter, which will allow you to specify the calendar's name. The following sample code demonstrates the creation of a calendar with the use of this command.

tell application "iCal"
   create calendar with name "My Calendar"
end tell

One thing to take note of when using this command is that it does not produce a result. Because of this, you cannot place the newly created calendar into a variable for future reference. As an alternative to the create calendar command, you can also use the make command. This may be a better choice in this situation, as the make command does produce a result, that result being the newly created item. For example, the following code demonstrates how the make command can be used to create a calendar. In this example, the result of this command - the newly created calendar - is placed into a variable called theCalendar, which I can now reference later in my script.

tell application "iCal"
   set theCalendar to make new calendar with properties {title:"My Calendar"}
end tell
--> calendar 3 of application "iCal"

Getting a List of Calendars

If you are working with existing calendars, you may need to write code that will retrieve a list of these calendars. The following code demonstrates how to retrieve a list of all existing calendars.

tell application "iCal"
   set theCalendars to every calendar
end tell
--> {calendar 1 of application "iCal", calendar 2 of application "iCal", 
   calendar 3 of application "iCal"}

The previous code will return references to your existing calendars. However you , may only need to retrieve the names of your calendars. To do this, simply retrieve the title of every calendar. For example:

tell application "iCal"
   set theCalendarNames to title of every calendar
end tell
--> {"Home", "Work", "My Calendar"}

Changing Calendar Views

Within iCal, you have the option to view calendars in several different ways. You can use scripting to change calendar views as well. The following example code demonstrates how to change the calendar view to display in day view mode.

tell application "iCal"
   switch view to day view
end tell

The following sample code demonstrates how to change the calendar view to display in week view mode.

tell application "iCal"
   switch view to week view
end tell

The following example code demonstrates how to change the calendar view to display in month view mode.

tell application "iCal"
   switch view to month view
end tell

So, with the use of the code above, you can actually customize the viewing experience of iCal for the user, as your script processes.

Subscribing to a Calendar

In addition to creating calendars, you can also write code to subscribe to a calendar, using a calendar URL. The following code demonstrates how this is done.

tell application "iCal"
   GetURL "webcal://ical.mac.com/ical/DVDs.ics"
end tell

Please note that, when subscribing to a calendar via AppleScript, some manual intervention will be required. iCal will pop up a few dialogs, allowing users to confirm that they actually do want to subscribe to the calendar, and also allowing them to configure subscription settings. See figure 1.


Figure 1. Calendar Subscription Dialog

Working with Events and To Do's

Now that we have discussed calendars, let's talk about elements of calendars. Specifically, we will walk through several tasks involving events and to do's.

Making a New Event

Like calendars, events can be created with AppleScript. To do this, use the make command. When creating an event, you will most likely want to specify values for various attributes of that event. For example, for an event, you may want to specify the event's name, description, location, etc. This can be done as the event is created, with the use of the with properties parameter. The following sample code demonstrates how to create a new all-day event for the current day, with a specified name, description, and location.

tell application "iCal"
   tell calendar "My Calendar"
      set theDate to current date
      make new event at end with properties {description:"Event Description", 
         summary:"Event Name", location:"Event Location", start date:theDate, 
         allday event:true}
   end tell
end tell
--> event 1 of calendar 3 of application "iCal"

To create an event that falls within a specific time period, you may specify the start date and end date properties of the event. For example, the following example code will create an event at the current date and time, with a length of 2 hours.

tell application "iCal"
   tell calendar "My Calendar"
      set theCurrentDate to current date
      make new event at end with properties {description:"Event Description", 
         summary:"Event Name", location:"Event Location", start date:theCurrentDate, 
         end date:theCurrentDate + 120 * minutes}
   end tell
end tell
--> event 1 of calendar 3 of application "iCal"

Making a New To Do

The process of creating a to do is virtually the same as that of creating an event. Again, you can use the make command, and you may optionally specify properties to be applied as the to do is created. The following sample code will create a to do with a specified summary, description, and due date.

tell application "iCal"
   tell calendar "My Calendar"
      set theDueDate to (current date) + 30 * days
      make new todo at end with properties {description:"To Do Description", 
         summary:"To Do Name", due date:theDueDate}
   end tell
end tell
--> todo 1 of calendar 3 of application "iCal"

To find a complete list of event and to do properties, consult the appropriate class in the iCal suite in iCal's AppleScript dictionary.

Finding an Event or To Do

Many times, you may be working with existing events or to dos. If this is the case, then you might need to locate the appropriate event or to do in some way. The best way to locate something in iCal is to do so by its unique ID. In iCal, calendars, events, and to do's all have unique ID's, which can be retrieved by AppleScript from the item's uid property. The following sample code demonstrates how to retrieve the ID of an event.

tell application "iCal"
   tell calendar "My Calendar"
      set theEvent to first event
      return uid of theEvent
   end tell
end tell
--> "1BCA3512-F3A9-4BCB-A0FD-BE812968D371"

If you have the ID of an event or to do, you can then find the item by its ID. The following code shows how to locate an event by its unique ID.

tell application "iCal"
   tell calendar "My Calendar"
      set theEvent to first event whose uid = "1BCA3512-F3A9-4BCB-A0FD-BE812968D371"
   end tell
end tell
--> event 1 of calendar 3 of application "iCal"

This same technique may be used to locate a to do by its unique ID.

Viewing an Event or To Do

AppleScript can also be used to display a specific event or to do within iCal. To do this, use the show command, and specify the item that you want to display. For example, the following sample code will cause iCal to display and select a specific event, which, in this case, is stored in a variable named theEvent.

tell application "iCal"
   tell calendar "My Calendar"
      show theEvent
   end tell
end tell

Deleting an Event or To Do

Just as you can create events and to do's in iCal, you can also delete them. To delete an item in iCal, use the delete command and specify the item that you want to delete. For example, the following code will delete a specified event that is stored in a variable.

tell application "iCal"
   tell calendar "My Calendar"
      delete theEvent
   end tell
end tell

Working with Alarms

If you are an avid iCal user, then you are probably already aware that events and to do's can be configured with alarms. There are multiple types of alarms that you can configure manually, which can also be configured via scripting. AppleScript can be used to create the following types of alarms:

  • Display Alarm - This type of alarm will display a message to the user, letting the user know about a scheduled event or to do. With the use of scripting, you can set the trigger interval or date for this type of alarm.
  • Mail Alarm - This type of alarm will send an email message to the current user, notifying the user of an upcoming event or to do. Like a display alarm, the trigger date or interval for this type of alarm may be set via scripting.
  • Open File Alarm - This type of alarm will open a file at a specified time. AppleScript can be used to set the date or interval for the alarm. It can also be used to specify the path to the file that should be opened. An alarm of this nature can be extremely useful if you want a script to trigger at a specific time.
  • Sound Alarm - This type of alarm will produce an audio alert about an upcoming event or to do. For this type of event, AppleScript may be used to specify the date or interval, as well as the name or file path of a sound to be used for the alert.

Adding an Alarm to an Event or To Do

Let's take a moment to look at how an alarm can be created with the use of AppleScript, for a given event or to do. For this first example, we are going to create a display alarm. The following example code will add a display alarm to a specified event.

tell application "iCal"
   tell calendar "My Calendar"
      set theEvent to event 1
      tell theEvent
         make new display alarm at end with properties {trigger interval:-30}
      end tell
   end tell
end tell
--> display alarm 1 of event 1 of calendar 3 of application "iCal

In the code above, you will notice that the trigger interval property of the event is set to -30. The trigger interval property may be specified to configure when the alarm message should be displayed. This property should be given a numeric value, signifying minutes. In this case, I have specified a negative value of 30. This will cause the alarm to trigger 30 minutes prior to the start date of the event.

Optionally, I can choose to specify a trigger date for the alarm, rather than a trigger interval. This will allow me to configure the alarm to trigger at a specific date and time, rather than on a trigger interval. The following sample code will create a new display alarm for a given event.

tell application "iCal"
   tell calendar "My Calendar"
      set theEvent to event 1
      set theDate to (current date) - 3 * days
      tell theEvent
         make new display alarm at end with properties {trigger date:theDate}
      end tell
   end tell
end tell
--> display alarm 1 of event 1 of calendar 3 of application "iCal"

Let's look at another type of alarm. This time, let's add an open file alarm to an event. For this type of alarm, in addition to specifying a trigger interval or date, we can specify a file path for the item to be opened. The following example code demonstrates the process of creating an open file alarm for a given event.

set theFile to choose file
tell application "iCal"
   tell calendar "My Calendar"
      set theEvent to event 1
      set theDate to (current date) - 3 * days
      tell theEvent
         make new open file alarm at end with properties {trigger date:theDate, 
            filepath:theFile}
      end tell
   end tell
end tell
--> open file alarm 1 of event 1 of calendar 3 of application "iCal"

If you look in iCal's dictionary, you may notice that the filepath property of an open file alarm is defined as needing a POSIX style path. As you can see from the code above, if you pass an AppleScript alias reference, that will work as well. To pass a POSIX path, you may need to convert the desired file's path. For example:

set theFile to POSIX path of (choose file)
--> "/Users/bwaldie/Desktop/FileToOpen.scpt"

Please note that if you configure an open file alarm to open a compiled AppleScript file, the script will actually be loaded and run by iCal, rather than simply opened. See figure 2. This is a great way to create a workflow with scripts that trigger at scheduled intervals.


Figure 2. An Open File Alarm to Trigger a Compiled Script

Triggering Scripts and Automator Workflows from iCal

As we have seen above, there are ways to trigger an AppleScript from within iCal. You can quickly and easily create events, and add open file alarms to run compiled scripts, open script applications, etc.

You can also trigger Automator workflows from iCal, and Automator makes the process of configuring such scheduled events a snap. First, begin by creating an Automator workflow to perform any set of desired tasks. Next, select Save as Plug-In... from the File menu within Automator. From the plug-in type popup menu, select iCal Alarm. See figure 3.


Figure 3. Creating an Automator iCal Alarm Plug-In

Click the Save button, and a new event will be created in iCal, which will be configured to trigger the workflow. Now, you can adjust the event, as needed, perhaps putting it on a repeating schedule. See figure 4 for an example of a configured event.


Figure 4. A Configured Automator iCal Alarm Plug-In Event

In Closing

Hopefully, you are already thinking of the great possibilities for creating scripts that interact with iCal, or that work in conjunction with iCal. In addition to creating and interacting with calendars, events, and to do's, you can also begin to schedule the execution of your scripts, allowing you to really begin putting your computer to work for you, perhaps at night, over the weekend, or whenever you are away from your desk.

For a list of some existing iCal scripts, try searching for "iCal" in the ScriptBuilders section of MacScripter.net at http://scriptbuilders.net/. For more information about creating and scheduling Automator workflows, check out the help files that come with Automator, or check out my Automator book, available from SpiderWorks at http://www.spiderworks.com/ books/automator.php.

Until next time, keep scripting!


Ben Waldie is author of the best selling books "AppleScripting the Finder" and the "Mac OS X Technology Guide to Automator", available from http://www.spiderworks.com. Ben is also president of Automated Workflows, LLC, a firm specializing in AppleScript and workflow automation consulting. For years, Ben has developed professional AppleScript-based solutions for businesses including Adobe, Apple, NASA, PC World, and TV Guide. For more information about Ben, please visit http://www.automatedworkflows.com, or email Ben at applescriptguru@mac.com.

 

Community Search:
MacTech Search:

Software Updates via MacUpdate

RapidWeaver 8.10.0 - Create template-bas...
RapidWeaver is a next-generation Web design application to help you easily create professional-looking Web sites in minutes. No knowledge of complex code is required, RapidWeaver will take care of... Read more
ForkLift 3.5.7 - Powerful file manager:...
ForkLift is a powerful file manager and ferociously fast FTP client clothed in a clean and versatile UI that offers the combination of absolute simplicity and raw power expected from a well-executed... Read more
1Password 8.7.3 - Powerful password mana...
1Password is a password manager that uniquely brings you both security and convenience. It is the only program that provides anti-phishing protection and goes beyond password management by adding Web... Read more
Microsoft Remote Desktop 10.7.7 - Connec...
Microsoft Remote Desktop for Mac is an application that allows connecting to virtual apps or another PC remotely. Discover the power of Windows with Remote Desktop designed to help you manage your... Read more
NeoOffice 2022.1 - Mac-tailored, OpenOff...
NeoOffice is a complete office suite for OS X. With NeoOffice, users can view, edit, and save OpenOffice documents, PDF files, and most Microsoft Word, Excel, and PowerPoint documents. NeoOffice 3.x... Read more
TotalFinder 1.14.2 - Adds tabs, hotkeys,...
Note: TotalFinder is no longer available for sale. Please read this post with announcement here. TotalFinder is a universally acclaimed navigational companion for your Mac. Enhance your Mac's Finder... Read more
coconutBattery 3.9.8 - Displays info abo...
With coconutBattery you're always aware of your current battery health. It shows you live information about your battery such as how often it was charged and how is the current maximum capacity in... Read more
GraphicConverter 11.6.2 - $39.95
GraphicConverter is an all-purpose image-editing program that can import 200 different graphic-based formats, edit the image, and export it to any of 80 available file formats. The high-end editing... Read more
Spotify 1.1.88.612 - Stream music, creat...
Spotify is a streaming music service that gives you on-demand access to millions of songs. Whether you like driving rock, silky R&B, or grandiose classical music, Spotify's massive catalogue puts... Read more
xScope 4.6 - Onscreen graphic measuremen...
xScope is powerful set of tools that are ideal for measuring, inspecting, and testing on-screen graphics and layouts. Its tools float above your desktop windows and can be accessed via a toolbar,... Read more

Latest Forum Discussions

See All

Niantic Announces NBA Licensed Augmented...
Niantic took what they had learned from their augmented reality multiplayer game Ingress and applied it to the massively popular Pokemon IP to create the cultural phenomenon known as Pokemon GO back in 2016. Ever since that Pokemon GO explosion back... | Read more »
‘Hero Emblems II’ Review – There’s No Ca...
Seven and a half years ago, the original Hero Emblems ($2.99) was released on the App Store. Just under six years ago, its sequel was formally announced and a trailer was shown. A couple of weeks after that, I played Hero Emblems II ($6.99) for the... | Read more »
Pokemon GO: Starly to feature in July Co...
For the upcoming Community Day, Starly is all set to be the star. In an official blog post, Niantic has shared details about the July community day on 17th, which will run from 11 AM to 2 PM. The event will feature Starly, the Starling Pokemon. [... | Read more »
King's Choice, the medieval-themed...
On the anniversary of its first year of release King's Choice, from ONEMT, is celebrating by rewarding its players with a selection of In-game goodies. There will also be limited-time events and a chance for players to be featured in the special... | Read more »
‘King’s Choice’, the Medieval-Themed RPG...
King’s Choice is celebrating its one year anniversary by rewarding players with a number of special In-game goodies. The game’s publisher, ONEMT, will also be hosting limited-time events, as well as giving players the opportunity to be featured in... | Read more »
SwitchArcade Round-Up: Reviews Featuring...
Hello gentle readers, and welcome to the SwitchArcade Round-Up for June 27th, 2022. We’re in the middle of a brutal heat wave here in Japan, and the temperature outside as I write this is 38 degrees Celsius. Wow! Let’s stay inside and play games,... | Read more »
Best iPhone Game Updates: ‘Horizon Chase...
Hello everyone, and welcome to the week! It’s time once again for our look back at the noteworthy updates of the last seven days. A nice variety this week, if I do say so myself. And I do, because who else would be saying anything in an article... | Read more »
Apex Legends Mobile introduces a new Arm...
Apex Legends, the popular EA battle royale, recently made its way to mobile and was well-received. Since the release, Respawn has been actively making additions to the game. And on the same note, Apex Legends Mobile is getting a new mode - Armed... | Read more »
‘Final Fantasy Record Keeper’ Is Shuttin...
Back in March 2015, Square Enix released Final Fantasy Record Keeper (Free) on the US App Store. It has received many updates over the years through collaborations across Square Enix’s other games and more. | Read more »
The Clash Royale 2022 Summer Update is h...
Clash Royale, the 2016 multiplayer battle arena game, developed by Supercell, was a huge success and continues to hold the attention of millions worldwide. [Read more] | Read more »

Price Scanner via MacPrices.net

July 4th Sale at Expercom: $200 off any 16″ M...
Apple reseller Expercom has 16″ M1 Pro and M1 Max MacBook Pros available for $200 off MSRP as part of their July 4th sale. In addition to their MacBook Pro sale prices, take $50 off AppleCare+ when... Read more
10.2″ Apple iPads (WiFi models) are on sale f...
Amazon has Apple’s 9th generation 10.2″ WiFi iPads on sale for up to $20-$50 off MSRP for a limited time. Their prices are the lowest price currently available for one of these iPads. All models are... Read more
10-Core M1 Pro 14″ MacBook Pros on sale for $...
B&H Photo is offering $200 discounts on Apple’s new 14″ M1 Pro MacBook Pros with 10-Core CPUs (16GB RAM/1TB SSDs). Free 1-2 day shipping is available to most US addresses, and both models are in... Read more
B&H has 16-inch M1 Pro MacBook Pros in st...
New Space Gray 16″ MacBook Pros with Apple’s M1 Pro CPUs are in stock and on sale today at B&H Photo for $200 off Apple’s MSRP. Sale prices are for M1 Pro models with 512GB or 1TB of SSD storage... Read more
Price drop! 13″ M1 MacBook Pro with 512GB SSD...
Amazon has dropped prices on recently-discontinued 13″ M1 MacBook Pros with a 512GB SSD by $200 off Apple’s original MSRP. Shipping is free: – 2020 13″ MacBook Pro (Space Gray or Silver) M1 CPU/512GB... Read more
Deal Alert! 14″ Apple MacBook Pros with M1 Pr...
Amazon has 14″ MacBook Pros with 8-Core M1 Pro CPUs back on sale for $200 off MSRP, only $1799. Shipping is free. Be sure to make your purchase from Amazon rather than a third-party seller: – 14″ M1... Read more
16″ MacBook Pros with Apple M1 Pro CPUs are b...
Amazon is discounting new 16″ MacBook Pros with 10-Core Apple M1 Pro CPUs by $200 off MSRP again today. Be sure to select Amazon as the seller rather than a third-party seller, and note that Amazon’s... Read more
13″ M1 MacBook Airs with 16GB of RAM availabl...
Apple has 13″ M1 MacBook Airs (8-Core CPU/7-Core GPU) in stock today with 16GB of RAM for $190 off MSRP, Certified Refurbished. Apple includes a standard one-year warranty with these models, each... Read more
Apple Watch SE models are on sale for $50 off...
Amazon has Apple Watch SE GPS models on sale today for $50 off MSRP including free shipping. Their prices are the lowest currently available for SE Watches anywhere: – 40mm Apple Watch SE GPS: $229,... Read more
Apple launches 2022 Back to School promotion:...
Apple has launched their Back to School promotion for 2022, and here are the details. As part of this promotion, Apple will include a free $150 Apple Gift Card with the purchase of any MacBook Air,... Read more

Jobs Board

Hair Stylist - *Apple* Blossom Mall - JCPen...
Hair Stylist - Apple Blossom Mall Location:Winchester, VA, United States (https://jobs.jcp.com/jobs/location/191170/winchester-va-united-states) - Apple Blossom Read more
Sales Floor Associate - *Apple* Blossom Mal...
Sales Floor Associate - Apple Blossom Mall Location:Winchester, VA, United States (https://jobs.jcp.com/jobs/location/191170/winchester-va-united-states) - Apple Read more
Cashier - *Apple* Blossom Mall - JCPenney (...
Cashier - Apple Blossom Mall Location:Winchester, VA, United States (https://jobs.jcp.com/jobs/location/191170/winchester-va-united-states) - Apple Blossom Mall Read more
Sephora Beauty Advisor - *Apple* Blossom Ma...
Sephora Beauty Advisor - Apple Blossom Mall Location:Winchester, VA, United States (https://jobs.jcp.com/jobs/location/191170/winchester-va-united-states) - Apple Read more
Sr Product Manager, *Apple* TV Platforms Ex...
**Job Number** 70594BR **Job Title** Sr Product Manager, Apple TV Platforms Experience, Peacock **Business Segment** Direct-to-Consumer **Sub-Business** DTC Product Read more
All contents are Copyright 1984-2011 by Xplain Corporation. All rights reserved. Theme designed by Icreon.