Not long ago (about a month ago, as a matter of fact) we here at MacScripter received a message from someone asking about a specific kind of folder action. The gentleman wanted to know how to create a folder action that would accept a dropped file, then create a new subfolder named like the dropped file, and finally place the file in the new subfolder. Specifically, he seemed frustrated that he couldn’t just copy the name of the file to a new folder.
On writing to this gentleman, I found out he lives in Pamplona, Spain, so English wasn’t his native language. He writes English very well, but I began to immediately see why he might be having problems with some of AppleScript’s english terms, and so I began corresponding with Professor Odero in order to help him with his problem. Despite what some may think of my writing skills, English is my native language but Spanish has been my adopted second language since high school and I still relish an opportunity to brush up on it. And when all else fails, I can always fall back on my Dashboard Translator widget to help me!
The first stab at writing my own script revealed Professor Odero’s main hurdle. Try this in Script Editor (and keep your mouse pointer over the Stop icon!):
on adding folder items to theFolder after receiving theItems
repeat with anItem in theItems
tell application "Finder"
set theName to displayed name of anItem
set newFolder to (make new folder at theFolder with properties {name:theName})
move anItem to newFolder
end tell
end repeat
end adding folder items to
See the problem? When you create the new subfolder in the action folder, AppleScript sees that as “adding folder items” and starts an infinite loop of new folders!
Now, in a situation like this there are (at least) two ways you can straighten it out. One, the obvious way, is to create the new folder somewhere besides the action folder. That might be an acceptable solution for some applications, but in this case, we specifically wanted the new folder in the action folder. It doesn’t help us much to have an action folder if we can’t keep anything in it. If we wanted that kind of solution, it would make more sense to create a droplet: a script application that can respond when files or folders are dropped on it.
So the other means of attack for this kind of problem is to create the subfolder in such a way that it won’t be noticed by your action script. The one way to do that is to manipulate the folder name so that it has a known character (or character sequence) embedded in it. For our purpose, if the file dropped is “Readme” we want a folder called “Readme Æ’” to be created.
The “ligature f” character (option-f) has often been used on the Macintosh as shorthand for the word “folder,” so it seemed like a good choice. However, since the word “folder” in Spanish is “carpeta,” we could have used a 'c" character of some kind. Fortunately, Professor Ordero is bilingual and the “f” ligature worked for him too. For your own uses, though, just remember that you can substitute other strings. For uses like this, I also like the bullet character (option-8).
So, we now modify our script as follows:
on adding folder items to theFolder after receiving theItems
repeat with anItem in theItems
tell application "Finder"
set theName to displayed name of anItem
set theName to theName & " Æ’"
set newFolder to (make new folder at theFolder with properties {name:theName})
move anItem to newFolder
end tell
end repeat
end adding folder items to
Don’t run this version, yet! As you might have noticed, all we’ve done is add the “Æ’” character to the folder name. We still have to fool the script into NOT going into an infinite loop. The next modification is to enclose our main code in an IF block that tests for the “Æ’” character in the new item’s name:
on adding folder items to theFolder after receiving theItems
repeat with anItem in theItems
tell application "Finder"
set theName to displayed name of anItem
if theName does not contain "Æ’" then
set theName to theName & " Æ’"
set newFolder to (make new folder at theFolder with properties {name:theName})
move anItem to newFolder
end if
end tell
end repeat
end adding folder items to
Now we have a script that won’t go off creating folders until the Finder goes insane! To finish up, I always like to use a try block if I have code that might generate errors. You’ll find that Apple’s Mail and other programs often won’t report an AppleScript error if it occurs, so you need to help yourself to find out when things are going wrong. Here’s the finished script:
on adding folder items to theFolder after receiving theItems
repeat with anItem in theItems
tell application "Finder"
set theName to displayed name of anItem
if theName does not contain "Æ’" then
try
set theName to theName & " Æ’"
set newFolder to (make new folder at theFolder with properties {name:theName})
move anItem to newFolder
on error the error_message number the error_number
display dialog "Folder action caused an error: " & the error_number & ". " & the error_message buttons {"OK"} default button 1
end try
end if
end tell
end repeat
end adding folder items to
Never be discouraged if you seem to run into a blank wall with scripting. Often times it just takes “turning the problem upside down” to see a different way of doing what you want to do!