Thinking Logically
Volume Number: 21 (2005)
Issue Number: 1
Column Tag: Programming
AppleScript Essentials
by Benjamin S. Waldie
Thinking Logically
Last month, we explored adding different types of repeat loops to scripts, which is a very
important and useful aspect of AppleScript development. As we discussed, by allowing you to perform
a series of repetitive tasks without the need to duplicate code, repeat loops help to make your code
less verbose, more efficient, and easier to change in the future. This month, we will focus on
adding logic to your scripts, which is another important part of AppleScript development.
In AppleScript, a script can be written to logically determine a specific course of action, based
on criteria that you define. For example, a backup script might be written to perform a specific
backup process, based on the user that triggers the script, or based on the day of the week. While
this is a fairly simple example, the point is, by adding logic to a script, the script can actually
make decisions about which tasks should be performed.
If/Then Statements
Adding logic to a script is done with the addition of an if/then statement. If/then statements
can range from the simple to the extremely complex.
When you write a script, you write a series of instructions for AppleScript to perform when
the script is run. Each of these instructions is considered to be a statement. Simple statements
are written as single lines of code. Compound statements are AppleScript statements that are
written as more than one line of code. Compound statements contain other AppleScript statements,
and always end with an end clause. Tell statements, repeat statements, and if/then statements would
be considered compound statements.
Basic If/Then Statements
The most basic form of the if/then statement appears as follows:
if boolean expression then
do something
end if
You can see from the example above, that a boolean expression is used as the basis for the
if/then statement. In if/then statements, a boolean expression must evaluate to a value of true in
order for the desired code, specified above as do something, to be executed.
In AppleScript, an expression is defined as a series of terms that evaluates to a value. For
example, the following code would be considered an expression in AppleScript, and evaluates to a
value of 2:
1 + 1
A boolean expression is considered to be any expression that evaluates to a true or
false value.
Below is a functional example of a basic if/then statement:
set theOutputFolderPath to path to desktop folder
set theNewFolderName to "My Folder"
tell application "Finder"
if (exists folder (theOutputFolderPath & theNewFolderName as string)) = false then
make new folder at desktop with properties {name:theNewFolderName}
end if
end tell
In the example above, the first two lines set up variables containing an output folder path and a
folder name. Next, the if/then statement determines whether the folder already exists, and it
triggers code to create the folder if it does not already exist.
As I said above, a boolean expression in an if/then statement must evaluate to a true value. To
fully understand this, let's look at the boolean expression from our example in a little more
detail. The complete boolean expression to be evaluated is the following:
(exists folder (theOutputFolderPath & theNewFolderName as string)) = false
We can break down this boolean expression into two separate parts. In the first part, the
Finder's exists command is used in order to determine whether the folder already exists, and is
represented by the following code:
(exists folder (theOutputFolderPath & theNewFolderName as string))
The second part of the boolean expression determines whether the result of the first part is
equal to a value of false, and is represented by the following code:
= false
Looking at both parts of the boolean expression together again as a whole, if the result of the
exists command is equal to false, then the second part of the boolean expression confirms that the
first part is equal to false. Therefore, the boolean expression as a whole has been determined to
be true, and the next part of the code will be executed, thus creating the folder.
Initiating a Second Course of Action
It is also possible to initiate a second course of action, should the boolean expression evaluate
to a value of false. This is done through the addition of an else clause to the if/then statement.
For example:
if boolean expression then
do something 1
else
do something 2
end if
Let's add an else clause to our example from above that creates a folder. In the following
example, if the folder does not already exist, then it will be created. However, if the folder does
already exist, then the user will be presented with a dialog indicating that a new folder was not
created because one already exists.
set theOutputFolderPath to path to desktop folder
set theNewFolderName to "My Folder"
tell application "Finder"
if (exists folder (theOutputFolderPath & theNewFolderName as string)) = false then
make new folder at desktop with properties {name:theNewFolderName}
else
display dialog "Did not create a folder because one already exists."
end if
end tell
Even with the use of basic if/then statements, you can already begin to see that if/then
statements can provide a lot of flexibility with regard to the behavior of a script.
Combining Boolean Expressions
In certain instances, you may need to combine more than one boolean expression together in order
to create a new, more complex boolean expression. This can be done with the use of the and or the
or AppleScript operator. For example:
boolean expression and boolean expression
boolean expression or boolean expression
In either of the above cases, the entire expression will evaluate to a true or false value. In
the first instance, each boolean expression must evaluate to a value of true in order for the entire
expression to evaluate to a value of true. In the second instance, if either of the boolean
expressions evaluates to a value of true, then the entire expression will evaluate to a value of
true.
The following example uses a combination of two boolean expressions in order to determine whether
to create a folder called My Tuesday Folder. One boolean expression determines whether the
folder already exists. The other determines if the current date is a Tuesday. In this example,
each of these boolean expressions must evaluate to a value of true, making the entire expression
evaluate to a value of true, in order for the folder to be created.
set theOutputFolderPath to path to desktop folder
set theNewFolderName to "My Tuesday Folder"
tell application "Finder"
if (exists folder (theOutputFolderPath & theNewFolderName as string)) =
false and (weekday of (current date)) = Tuesday then
make new folder at desktop with properties {name:theNewFolderName}
end if
end tell
Complex If/Then Statements
As we have seen so far, the most basic form of the if/then statement evaluates a boolean
expression in order to determine whether a specific course of action should occur. An if/then
statement of this nature also allows you to take an alternate course of action, if desired.
However, in some cases, you may need to evaluate a boolean expression against multiple criteria,
taking multiple courses of action depending on the results. This can be done by extending the else
clause in the if/then statement to an else if clause. For example:
if boolean expression then
do something 1
else if boolean expression then
do something 2
end if
In the following example, the user is prompted, with a displayed dialog, to click a button
indicating whether a folder should be created. In the dialog, the user is presented with 3 buttons
- Yes, No, and Maybe Later. With the use of a more complex if/then statement, the
script performs a different action, based on the button clicked by the user. If the user clicks the
Yes button, then the folder is created on the desktop. If the user clicks the No button, then the
folder is not created. If the user clicks the Maybe Later button, then the user is prompted to
trigger the script again when ready to create the folder.
set theButton to button returned of
(display dialog "Would you like to create a new folder on the desktop?"
buttons {"Yes", "No", "Maybe Later"})
set theOutputFolderPath to path to desktop folder
set theNewFolderName to "My Folder"
if theButton = "Yes" then
tell application "Finder"
make new folder at desktop with properties {name:theNewFolderName}
end tell
else if theButton = "Maybe Later" then
display dialog "Trigger the script again when you are ready to build a folder."
end if
Optionally, you may still choose to include an else clause in this type of if/then statement, if
desired. For example, we could add an else clause to our code above in order to display a notice to
the user if the No button is clicked.
set theButton to button returned of
(display dialog "Would you like to create a new folder on the desktop?" buttons
{"Yes", "No", "Maybe Later"})
set theOutputFolderPath to path to desktop folder
set theNewFolderName to "My Folder"
if theButton = "Yes" then
tell application "Finder"
make new folder at desktop with properties {name:theNewFolderName}
end tell
else if theButton = "Maybe Later" then
display dialog "Trigger the script again when you are ready to build a folder."
else
display dialog "A folder has not been created."
end if
Nested If/Then Statements
Another effective way to create complex if/then statements is through the nesting of if/then
statements.
If you are not new to scripting, then you may be familiar with nesting already. Nesting refers
to the placement of one type of AppleScript statement within another statement of the same type.
An example of a nested if/then statement's syntax would be the following:
if boolean expression then
if boolean expression then
do something 1
end if
else if boolean expression then
do something 2
end if
Looking back again to our folder creation example, the following code has been modified to
include a nested if/then statement. Should the user choose to click the Yes button to create a new
folder, a second if/then statement will be executed. This will determine whether the folder exists
before creating it, taking a different course of action if it does already exist.
set theButton to button returned of (display dialog "Would you like
to create a new folder on the desktop?" buttons {"Yes", "No", "Maybe Later"})
set theOutputFolderPath to path to desktop folder
set theNewFolderName to "My Folder"
if theButton = "Yes" then
tell application "Finder"
if (exists folder (theOutputFolderPath & theNewFolderName as string)) = false then
make new folder at desktop with properties {name:theNewFolderName}
else
display dialog "Did not create a folder because one already exists."
end if
end tell
else if theButton = "Maybe Later" then
display dialog "Trigger the script again when you are ready to build a folder."
else
display dialog "A folder has not been created."
end if
In Closing
As you can see, if/then statements can be tremendously useful when scripting. With the use of
simple and complex if/then statements, your scripts can become infinitely flexible, allowing them to
take specific action based on virtually any situation that might occur during processing. In fact,
without the use of if/then statements and other powerful scripting techniques, such as repeat loops,
certain types of workflows could just not be automated. Imagine trying to create a complex asset
management system that uses AppleScript to move files around, without the use of if/then statements
or repeat loops. It would be extremely difficult, to say the least, if not impossible. So, I
encourage you to begin incorporating if/then statements into your scripts in order to automate more
complex workflows, and make your scripts more robust.
Until next time, keep scripting!
Benjamin Waldie is president of Automated Workflows, LLC, a firm
specializing in AppleScript and workflow automation consulting. In addition to his role as a
consultant, Benjamin is an evangelist of AppleScript, and can frequently be seen presenting at
Macintosh User Groups, Seybold Seminars, and MacWorld. For additional information about Benjamin,
please visit http://www.automatedworkflows.com, or email Benjamin at applescriptguru@mac.com