TweetFollow Us on Twitter

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

 

Community Search:
MacTech Search:

Software Updates via MacUpdate

Latest Forum Discussions

See All

Combo Quest (Games)
Combo Quest 1.0 Device: iOS Universal Category: Games Price: $.99, Version: 1.0 (iTunes) Description: Combo Quest is an epic, time tap role-playing adventure. In this unique masterpiece, you are a knight on a heroic quest to retrieve... | Read more »
Hero Emblems (Games)
Hero Emblems 1.0 Device: iOS Universal Category: Games Price: $2.99, Version: 1.0 (iTunes) Description: ** 25% OFF for a limited time to celebrate the release ** ** Note for iPhone 6 user: If it doesn't run fullscreen on your device... | Read more »
Puzzle Blitz (Games)
Puzzle Blitz 1.0 Device: iOS Universal Category: Games Price: $1.99, Version: 1.0 (iTunes) Description: Puzzle Blitz is a frantic puzzle solving race against the clock! Solve as many puzzles as you can, before time runs out! You have... | Read more »
Sky Patrol (Games)
Sky Patrol 1.0.1 Device: iOS Universal Category: Games Price: $1.99, Version: 1.0.1 (iTunes) Description: 'Strategic Twist On The Classic Shooter Genre' - Indie Game Mag... | Read more »
The Princess Bride - The Official Game...
The Princess Bride - The Official Game 1.1 Device: iOS Universal Category: Games Price: $3.99, Version: 1.1 (iTunes) Description: An epic game based on the beloved classic movie? Inconceivable! Play the world of The Princess Bride... | Read more »
Frozen Synapse (Games)
Frozen Synapse 1.0 Device: iOS iPhone Category: Games Price: $2.99, Version: 1.0 (iTunes) Description: Frozen Synapse is a multi-award-winning tactical game. (Full cross-play with desktop and tablet versions) 9/10 Edge 9/10 Eurogamer... | Read more »
Space Marshals (Games)
Space Marshals 1.0.1 Device: iOS Universal Category: Games Price: $4.99, Version: 1.0.1 (iTunes) Description: ### IMPORTANT ### Please note that iPhone 4 is not supported. Space Marshals is a Sci-fi Wild West adventure taking place... | Read more »
Battle Slimes (Games)
Battle Slimes 1.0 Device: iOS Universal Category: Games Price: $1.99, Version: 1.0 (iTunes) Description: BATTLE SLIMES is a fun local multiplayer game. Control speedy & bouncy slime blobs as you compete with friends and family.... | Read more »
Spectrum - 3D Avenue (Games)
Spectrum - 3D Avenue 1.0 Device: iOS Universal Category: Games Price: $2.99, Version: 1.0 (iTunes) Description: "Spectrum is a pretty cool take on twitchy/reaction-based gameplay with enough complexity and style to stand out from the... | Read more »
Drop Wizard (Games)
Drop Wizard 1.0 Device: iOS Universal Category: Games Price: $1.99, Version: 1.0 (iTunes) Description: Bring back the joy of arcade games! Drop Wizard is an action arcade game where you play as Teo, a wizard on a quest to save his... | Read more »

Price Scanner via MacPrices.net

14-inch M4 Pro/M4 Max MacBook Pros on sale th...
Don’t pay full price! Get a new 14″ MacBook Pro with an M4 Pro or M4 Max CPU for up to $320 off Apple’s MSRP this weekend at these retailers…they are the lowest prices available for these MacBook... Read more
Get a 15-inch M4 MacBook Air for $150 off App...
A couple of Apple retailers are offering $150 discounts on new 15″ M4 MacBook Airs this weekend. Prices at these retailers start at $1049: (1): Amazon has new 15″ M4 MacBook Airs on sale for $150 off... Read more
Unreal Mobile is offering a $100 discount on...
Unreal Mobile, an MVNO using AT&T and T-Mobile’s networks, is offering a $100 discount on any new iPhone with service. This includes new iPhone 16 models as well as iPhone 15, 13, and SE phones... Read more
16-inch M4 Pro MacBook Pros on sale for $250-...
Don’t pay full price! Amazon has 16-inch M4 Pro MacBook Pros (Silver or Black colors) on sale right now for up to $300 off Apple’s MSRP. Shipping is free. These are the lowest prices currently... Read more
Get a 14-inch M4 MacBook Pro for up to $240 o...
Amazon is offering a $150-$250 discount on Apple’s 14-inch M4 MacBook Pros right now. Shipping is free. Be sure to select Amazon as the seller, rather than a third-party seller: – 14″ M4 MacBook Pro... Read more
Clearance 14-inch M3 Pro MacBook Pros availab...
B&H Photo has clearance 14″ M3 Pro MacBook Pros (in Black or Silver) on sale for $500 off original MSRP, only $1499. B&H offers free 1-2 day delivery to most US addresses: – 14″ 11-Core M3... Read more
Sams Club is offering a $50 discount on Titan...
Sams Club has Titanium Apple Watch Series 10 models on sale for $50 off Apple’s MSRP. Sams Club Membership required. Note that sale prices are for online orders only, in-store prices may vary. Choose... Read more
Sunday Sale: Apple’s latest 13-inch M4 MacBoo...
Amazon has new 13″ M4 MacBook Airs on sale for $150 off MSRP right now, starting at $849. Sale prices apply to most colors and configurations. Be sure to select Amazon as the seller, rather than a... Read more
Apple’s M4 Mac minis on sale for record-low p...
B&H Photo has M4 and M4 Pro Mac minis in stock and on sale right now for up to $150 off Apple’s MSRP, each including free 1-2 day shipping to most US addresses. Prices start at only $469: – M4... Read more
Week’s Best Deals: 14-inch M4 MacBook Pros fo...
Don’t pay full price! These retailers are offering $200-$250 discounts on new 14-inch M4 MacBook Pros this week…they are the lowest sale prices available for new MacBook Pros: (1): Amazon is offering... Read more

Jobs Board

All contents are Copyright 1984-2011 by Xplain Corporation. All rights reserved. Theme designed by Icreon.