I’ve been looking at having iCal (the calendar app on Mac OS X) to help me inject some order into my schedule. In life, at the very least, you need to have a basic “to do” list, a schedule, and a budget. iCal takes care of two out of those three. Not bad for a start.
While it’s a simple matter of entering in items into my schedule, what’s a realistic way to enforce adherence to that schedule? On the face of it, it seems simple – just keep on referring to your calendar every now and then. But I believe a ‘push’ model would work better than a ‘pull’ model here; it would be awesome to have your calendar tell you what to do when it needs to get done!
iCal has e-mail options which enables it to e-mail you about upcoming events and scheduled items, but it does not take advantage of text-to-speech for some reason. So here’s a little Applescript to add that functionality. Calling this script on the event will read out (in the default MacOS ‘Alex’ voice) your event, in this format:
Attention! It’s 10 o’clock. Time to Sell Nesco shares.
This is assuming my event was ‘Sell Nesco shares‘, and scheduled at ten.
(Statutory disclaimer: This is not stock advice, and the author has interest in Nesco shares)
Without further ado, here’s the code:
set Now to current date set Earlier to (current date) - (0.1 * hours) set Later to (current date) + (0.1 * hours) tell application "iCal" set AllCalendars to every calendar repeat with EachCalendar in AllCalendars set CalendarName to name of EachCalendar tell calendar CalendarName -- just change the above line if you want to 'say' events from one calendar only repeat with thisEvent in (every event whose start date is greater than Earlier and start date is less than Later) -- or (start date is MidnightToday and allday event is true)) Â Â Â Â Â Â Â Â Â --say "" -- say CalendarName if contents of thisEvent is not missing value then set TheEvent to contents of thisEvent set EventProperties to properties of thisEvent set EventName to summary of EventProperties set EventLocation to location of EventProperties set EventDescription to description of EventProperties set EventStartDate to start date of EventProperties --say (time string of (current date)) set {hours:hr, minutes:mn, seconds:sc} to current date set SpokenTime to "Attention! It's " set SpokenTime to SpokenTime & hr & ":" & mn say SpokenTime -- say mn set SpokenEvent to "Time to " set SpokenEvent to SpokenEvent & EventName say SpokenEvent end if end repeat end tell end repeat end tell
To use this script, open up Script Editor
from Applications/Applescript
. Paste the script in and save it to a good location. Apple recommends /home/library/scripts
, I believe.
While adding or editing the event you want to be spoken out, you can now choose Run Script
as your alarm, and point to the script you just saved. here you can see my own screenshot, where I’ve saved the script as iCal_SpeakEvents.
Suggest modifications in the comments below!
I tried this script and it worked well but it fails to repeat any events that are scheduled to repeat at a regular interval. I wondered if you have any idea how this could be changed? I’m not very good at scripting things as you can guess. Thanks for any help.