Tag: applescript

★ Importing Mavericks Tags to Evernote

I have a Hazel-based workflow defined for scanned documents. With the release of Mavericks, I added tagging to that flow for things like the company that generated the document, a few tags about what the doc is about (cars, kids, etc). However, I like keeping the docs in Evernote. So, as I usually do, I turned to Applescript and came up with this:

set theActualFile to choose file

set theFile to quoted form of (POSIX path of (theActualFile))

set origDelim to AppleScript’stext item delimiters

set newDelim to “,”

set AppleScript’stext item delimiters to newDelim

— Get tags from file

set userTags to (do shell script “mdls -raw -name kMDItemUserTags ” & theFile)

set theTags to (every text item of userTags)

tell application “Evernote”

set theNote to create note from file theActualFile

–Clean up the list, removing whitespace, quotes, parenthesis, tabs, newlines

repeat with theTag in theTags

— sed command in line below taken from stib’s answer on this page: http://stackoverflow.com/questions/2783713/applescript-cleaning-a-string

set theTag to do shell script “echo ” & quoted form of theTag & “| tr -d ‘\n'”

set theTag to do shell script “echo ” & quoted form of theTag & “| tr -d ‘\r'”

set theTag to do shell script “echo ” & quoted form of theTag & “| tr -d ‘[:blank:]'”

set theTag to do shell script “echo ” & quoted form of theTag & “|sed \”s/[^[:alnum:][:space:]]//g\””

— TODO need to clean out newline as well

if not (tag named theTag exists) then

set my_new_tag to (make new tag with properties {name:theTag})

assign my_new_tag to theNote


assign tag theTag to theNote

end if

end repeat

end tell

set AppleScript’s text item delimiters to origDelim


The workflow asks for a file to be chosen (I’ll fix that so it accepts a file argument later when I’m ready to make it a part of the automated flow), gets the tags as string (via mdls), splits it out, and then strips out the newlines, tabs and whitespace from each of the tags.

Two caveats.

1) I assume it will split apart any tag with a comma in it.
2) It will remove whitespace form inside the tag as well – so a tag of “credit card” will become “creditcard”… but I’m okay with that.

Here’s the Applescript for your downloading pleasure: Import File to Evernote.scpt

★ Adding Items to the Grocery List

So last week I mentioned my shopping list spreadsheet.

However, there’s one flaw. My Mac isn’t in the kitchen, and adding things to the spreadsheet via Numbers on my phone is… awkward at best.

But I can send a text with my phone. And I have Messages running on my Mac. And I read this. And it all clicked.

So now I text “gr milk” and milk gets added to my grocery list, it gets sorted by aisle and saved to iCloud. And it only works if I do it from my phone. Don’t need anyone adding things to my list.

While I was at it, I added commands to quit Chrome and to fire up iTunes.

There’s one more thing I want to do to this – I want to make a small script that calls this one, instead of having Messages call it directly. the reason is that when you edit the script, you need to re-add it to Messages and honestly, it was becoming a bit of a pain during debugging.

Here’s my script:

on nextEmptyCellInColumn(sheetName, tableName, colNumber, compValue)
— Copied from http://applescript.bratis-lover.net/library/iwork-numbers/#nextEmptyCellInColumn
— Finds next empty row in the spreadsheet
local sheetName, tableName, colNumber, res, i, len
tell application “Numbers”
tell document “Groceries”
tell sheet sheetName
tell table tableName
set len to row count
set res to 0
repeat with i from 1 to len
if (value of cell colNumber of row i) = compValue then
set res to i
exit repeat
end if
end repeat
if res = 0 then
error “No empty row in table ” & tableName & “!” number 111
end if
end tell
end tell
end tell
end tell
return res
on error eMsg number eNum
error “Can’t nextEmptyCellInColumn: ” & eMsg number eNum
end try
end nextEmptyCellInColumn

using terms from application “Messages”
on message receivedtheMessagefromtheBuddyfortheChat
set theName to full name of theBuddy
if theName contains “Neil Kelly” then
if theMessage starts with “COMMANDS:” then
— This is here to prevent the reply for commands from triggering all the commands
set a to 1
if theMessage contains “itunes” then
tell application “iTunes”
end tell
end if
if theMessage contains “chrome” then
tell application “Google Chrome”
end tell
end if

if theMessage starts with “gr ” then
set numCell to nextEmptyCellInColumn(1, 1, 1, 0)
set groceryItem to text 4 thru (length of theMessage) of theMessage
tell application “Numbers”
tell document “Groceries”
tell sheet 1
tell table 1
set value of cell 1 of row numCell to groceryItem
sortbycolumn 2 directionascending

end tell
end tell
end tell

end tell
end if
if theMessage contains “commands” or theMessage contains “help” then
— reply with list of commands
— this doesn’t autogenerate
— so if you add a command you should document it here too
— backslash-n adds a newline
gr to add to grocery list
chrome to quit chrome
itunes to start itunes” to theChat

end if
end if

end if

end message received

end using terms from

★ Using Automator to Get At Things Applescript Won’t Cooperate With

One of the things that drew me to the Mac was Applescript – the idea of a scripting language that would work with most of the programs in the OS was… well, pretty freaking cool.

However, “most of the programs” eventually means “not the program I was using.” Then I came across this article – by using the Automator “Watch Me Do” recording function and a little bit of trickery, you can get the Applescript code to do whatever you need.

Random Useful Mac OS X User Tips: “I lamented this in one of my posts about Leopard, but I noted that there didn’t seem to be a way to directly access the AppleScript code from the Watch Me Do feature — Automator only creates run-only plugins or scripts. This is annoying if you want to modify the UI script later to do something slightly different. In this situation, you’d have to redo the whole set of actions all over again.”

Way cool.