AppleScript to Link to Apple Mail Message

I’ve always like the way OmniFocus can create links to Apple Mail messages when saving an email as a task. With help from listener Jacob (@evansio), I’ve now got a script that can do that anywhere via a text expander snippet. Here’s the AppleScript:

  Returns a link to the first selected Apple Mail message
tell application "Mail"
  set _msgs to selected messages of message viewer 0
  if (_msgs is not equal to missing value) then
    set _msg to first item of _msgs
    set _msgID to do shell script "/usr/bin/python -c 'import sys, urllib; print urllib.quote(sys.argv[1])' " & (message id of _msg)

    return "message://%3C" & (_msgID) & "%3E"
  end if
end tell

Here is that script embedded in a TextExpander Snippet. I’m using the abbreviation “elink”

Screen Shot 2019-02-05 at 7.19.58 AM.png

That’s it. Once you’ve installed it, just type “elink” in any app that can take a URL and you create a link to the currently selected email message. I use it all the time in Notes and Calendar note fields but it really works anywhere. Here’s a short explanatory video.

AppleScript and the New iWork

Early reports on the new iWork are not good. The general consensus seems to be that in order to make everything compatible, they dumbed down the Mac versions. I’m trying to finish a book right now and preparing for a closing statement on Friday so as you can probably guess, I’m kind of busy. I haven’t had time enough to test the new versions fully.

Clark’s Tech Blog explains there is a significant regression in AppleScript support in the new iWork. I’ve always felt that one of the ironic points about iWork was its general lack of support for AppleScript. Microsoft Office does a much better job of supporting AppleScript and Microsoft even went to the extent of hiring one the best people in the business, Ben Waldie, to write a lot of their automation tools for the Mac version. In this regard, Microsoft is heads and shoulders above Apple.

It’s concerning to see that this new version of iWork has not only not moved forward on automation but instead backwards. I don’t use a lot of AppleScript in iWork and, frankly, I don’t know what the percentage of people is the do. However, for those people that do use AppleScript, it is huge.

On the subject of iWork, I did spend a half hour playing with the new collaboration features and while the feature works as demonstrated during yesterday’s keynote event, they certainly are not as fast as they were during the keynote event. I’m going to have a lot more to say about this in the coming days.


Switching Screen Resolutions in Mountain Lion

Recently I bemoaned the ponderous way in which Mountain Lion switches screen resolutions. I often shoot screencasts in less than optimal resolution and the multiple clicks and keypresses required are vexing. David Kreindel heard my call and answered. David pointed me to this Display Menu, a handy app that brings back some old functionality. Does this look familiar.


If that isn't enough, David also put together a simple AppleScript to speed up the process. Copy the below into AppleScript editor and go nuts. Thanks David.

--This script only works on OS X 10.8; This is due to GUI changes from 10.7 to 10.8

--launches System Preferences to Displays pane

tell application "System Preferences"


set current pane to pane ""

end tell

tell application "System Events"

--Ensures window is on Display tab, not Color tab

click radio button "Display" of tab group 1 of window 1 of process "System Preferences"

--Ensures Resolution preference is "Scaled" to select resolutions

click radio button "Scaled" of tab group 1 of window 1 of process "System Preferences"

--Sets the resolution to whatever is in row 9 for the primary display; 1280 x 720

select row 9 of table 1 of scroll area 1 of tab group 1 of window 1 of process "System Preferences"

--Change "row 9" to whatever row corresponds to desired resolution

end tell

--Quits System Preferences

tell application "System Preferences"


end tell

Create OmniFocus Tasks with AppleScript

Sometimes efficiency becomes the enemy. Because I'm now a believer in automating document filing via Hazel and OCR, I sometimes get myself in trouble. A case in point is my life insurance bill. It arrives every quarter. I used to scan it and then name it in my Action folder with a TextExpander snippet, which resulted in it getting sent off to a nested folder somewhere. At the same time I'd record an OmniFocus quick entry to pay the bill. It was all second nature. These days, I use a Hazel rule that looks at the contents of this invoice and names it and files it without me having to trouble to rename the file manually. Put simply, once I scan it, I never see it again unless I go looking for it. The problem is I keep forgetting to create the OmniFocus entry to pay the bill. That's bad. (Especially if I get hit by a bus, which would only add one more problem to cascading badness.) We can't have that.

I decided to create an AppleScript that automatically creates an OmniFocus task when this Hazel rule triggers. After a lot of head scratching, trial and error, and even some help from friends at the Omni Group and Ben Waldie (my AppleScript Sensei), I've cobbled one together. Here is a screenshot and the AppleScript code.

-- Lovingly crafted by David Sparks, The Omni Group, and Ben Waldie --

set theDate to current date
set theTask to "Pay Life Insurance"
set theNote to "Lovingly Scanned by your Mac on " & (theDate as string)

tell application "OmniFocus"
tell front document
set theContext to first flattened context where its name = "Tech"
set theProject to first flattened project where its name = "Finance"
tell theProject to make new task with properties {name:theTask, note:theNote, context:theContext}
end tell
end tell

To test the rule, open AppleScript Editor and copy it in. You need to change the context and project names to something that is in your OmniFocus library. Once you trigger it, AppleScript will create a new task in the designated project with the designated context. The task also gets named and the Note field will include the text "Scanned on {today's date}". This just happens. Don't believe me? Go look in your OmniFocus project afterward.

I use this script directly in Hazel. Specifically, when I've got a scan that requires future action, I add an AppleScript Hazel action at the end to run this script. After Hazel gets done naming and filing my document, it creates a handy OmniFocus task. Below is my life insurance Hazel rule screenshot to demonstrate.


I've modified several versions of the script to handle the variety of documents I scan and OCR that require an automatic OmniFocus action. Creating an OmniFocus task with a script is damn useful. You could use this in a lot of contexts outside of document filing. You're welcome.

Below is a download link for the Hazel rule. Go nuts.

Download Sample Hazel Rule