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

WhatsApp 0.2.4238 - Desktop client for W...
WhatsApp is the desktop client for WhatsApp Messenger, a cross-platform mobile messaging app which allows you to exchange messages without having to pay for SMS. WhatsApp Messenger is available for... Read more
VOX 2.8.24 - Music player that supports...
VOX just sounds better! The beauty is in its simplicity, yet behind the minimal exterior lies a powerful music player with a ton of features and support for all audio formats you should ever need.... Read more
Dropbox 24.4.17 - Cloud backup and synch...
Dropbox is an application that creates a special Finder folder that automatically syncs online and between your computers. It allows you to both backup files and keep them up-to-date between systems... Read more
OmniPlan Pro 3.7.1 - Professional-grade...
With OmniPlan Pro, you can create logical, manageable project plans with Gantt charts, schedules, summaries, milestones, and critical paths. Break down the tasks needed to make your project a success... Read more
OmniPlan 3.7.1 - Robust project manageme...
With OmniPlan, you can create logical, manageable project plans with Gantt charts, schedules, summaries, milestones, and critical paths. Break down the tasks needed to make your project a success,... Read more
Adium 1.5.10.4 - Popular instant messagi...
Adium is a fast and free instant messaging client which supports AIM, ICQ, Jabber, MSN, Yahoo!, Google Talk, Yahoo! Japan, Bonjour, Gadu-Gadu, Novell Groupwise, SIP/SIMPLE (Text), and Lotus Sametime... Read more
SteerMouse 5.1 - Powerful third-party mo...
SteerMouse is an advanced driver for USB and Bluetooth mice. It also supports Apple Mighty Mouse very well. SteerMouse can assign various functions to buttons that Apple's software does not allow,... Read more
File Juicer 4.57 - $18.00
File Juicer is a drag-and-drop can opener and data archaeologist. Its specialty is to find and extract images, video, audio, or text from files which are hard to open in other ways. In computer... Read more
1Password 6.7 - Powerful password manage...
1Password is a password manager that uniquely brings you both security and convenience. It is the only program that provides anti-phishing protection and goes beyond password management by adding Web... Read more
CleanMyMac 3.8.1 - $39.95
CleanMyMac makes space for the things you love. Sporting a range of ingenious new features, CleanMyMac lets you safely and intelligently scan and clean your entire system, delete large, unused files... Read more

Latest Forum Discussions

See All

Olli by Tinrocket (Photography)
Olli by Tinrocket 1.0 Device: iOS iPhone Category: Photography Price: $2.99, Version: 1.0 (iTunes) Description: Get drawn in with Olli by TinrocketOlli instantly turns your everyday moments into hand-drawn art and animations. • Watch... | Read more »
Penarium (Games)
Penarium 1.0 Device: iOS Universal Category: Games Price: $1.99, Version: 1.0 (iTunes) Description: | Read more »
Fire Emblem Heroes is way more profitabl...
Profits for Nintendo's mobile game Fire Emblem Heroes are apparently impressive enough to beat out other Nintendo titles likeSuper Mario Run, despite having 10 times fewer downloads. [Read more] | Read more »
Classic series Robot Unicorn Attack 3 no...
The classic Adult Swim browser game, Robot Unicorn Attack, branched off into a series of popular mobile games. Now, the latest entry into the series, Robot Unicorn Attack 3, is available for iOS and Android mobile devices. [Read more] | Read more »
Sudoku Sweeper (Games)
Sudoku Sweeper 1.0 Device: iOS Universal Category: Games Price: $2.99, Version: 1.0 (iTunes) Description: A minimalist mashup of Minesweeper and Sudoku. Logic puzzle perfection. Every row, column and zone contains a bomb and one of... | Read more »
Under Leaves (Games)
Under Leaves 1.0.0 Device: iOS Universal Category: Games Price: $1.99, Version: 1.0.0 (iTunes) Description: Journey into the forest, the jungle or the depths of the deep blue sea. Find chestnuts for the pigs, a caterpillar for the... | Read more »
Ninja Pizza Girl (Games)
Ninja Pizza Girl 1.0 Device: iOS Universal Category: Games Price: $2.99, Version: 1.0 (iTunes) Description: In the not-so-distant future, rampart traffic congestion has resulted in only one way to deliver pizzas across town in thirty... | Read more »
SCRAP (Games)
SCRAP 1.0 Device: iOS Universal Category: Games Price: $2.99, Version: 1.0 (iTunes) Description: That day, for no apparent reason, SCRAP decided to wake up and run. He had to, because his activation was a mistake the "Factory" could... | Read more »
The Bunker (Games)
The Bunker 1.1 Device: iOS Universal Category: Games Price: $3.99, Version: 1.1 (iTunes) Description: The critically acclaimed console hit "The Bunker" comes to iOS, The groundbreaking live-action thriller adventure set in a real... | Read more »
Die With Glory (Games)
Die With Glory 1.2.0 Device: iOS Universal Category: Games Price: $2.99, Version: 1.2.0 (iTunes) Description: Die with Glory is an epic adventure game where your goal is to die in glorious fashion. You must help Sigurd, a brave old... | Read more »

Price Scanner via MacPrices.net

New System Clock for macOS by B-Eng Now Avail...
Fehraltorf, Switzerland based B-Eng has announced the release and immediate availability of System Clock, the company’s new system monitor and information app developed exclusively for macOS. System... Read more
DEVONtechnologies Celebrates 15th Anniversary...
DEVONtechnologies celebrates its 15th company anniversary with a 30% discount on all its software products from May 1st through 5th, 2017. In spring 2002, DEVONtechnologies opened its website and... Read more
WaterField Designs Invites Customers to Help...
San Francisco based WaterField Designs invites customers and air travelers to participate in developing the next generation in-flight travel case, the Air Porter. Frustrated with limited legroom,... Read more
Save up to $260 with Apple refurbished 12-inc...
Apple has Certified Refurbished 2016 12″ Retina MacBooks available for $200-$260 off MSRP. Apple will include a standard one-year warranty with each MacBook, and shipping is free. The following... Read more
Digital Paper Tablet Offers Distraction Free...
I typically spend 8-10 hours a day gazing at the screens in my laptops and iPad, as tools of my livelihood, I don’t as a rule use electronic devices for pleasure reading. I subscribe to a daily... Read more
“Today at Apple” Bringing New Educational Ses...
Apple has announced plans to launch dozens of new educational sessions next month in all 495 Apple Stores ranging in topics from photo and video to music, coding, art and design, and more. The hands-... Read more
Smart Finance Free Comprehensive Personal Fin...
Moscow-based indie developer, Alexander Survillo has announced the release and immediate availability of Smart Finance: Personal Finance, Budget & Money 1.1.4, an update to his comprehensive... Read more
12-inch 1.1GHz Retina MacBooks on sale for $1...
B&H has 12″ 1.1GHz Retina MacBooks on sale for $100 off MSRP. Shipping is free, and B&H charges NY & NJ sales tax only: - 12″ 1.1GHz Space Gray Retina MacBook: $1199.99 $100 off MSRP - 12... Read more
13-inch 2.7GHz Retina MacBook Pro on sale for...
B&H Photo has the 13″ 2.7GHz Retina MacBook Pro on sale for $130 off MSRP. Shipping is free, and B&H charges NY & NJ tax only: - 13″ 2.7GHz/128GB Retina MacBook Pro (MF839LL/A): $1169 $... Read more
15-inch 2.2GHz Retina MacBook Pros available...
B&H Photo has the 15″ 2.2GHz Retina MacBook Pro available for $200 off MSRP including free shipping plus NY & NJ sales tax only: - 15″ 2.2GHz Retina MacBook Pro (MJLQ2LL/A): $1799.99 $200 off... Read more

Jobs Board

*Apple* Mac Computer Technician - GeekHampto...
…complex computer issues over the phone and in person? GeekHampton, Long Island's Apple Premium Service Provider, is looking for you! Come work with our crew Read more
*Apple* Retail - Multiple Positions- Chicago...
Job Description: Sales Specialist - Retail Customer Service and Sales Transform Apple Store visitors into loyal Apple customers. When customers enter the store, Read more
*Apple* Systems Engineer - California Polyte...
Cal Poly, San Luis Obispo Apple Systems Engineer Department: ITS - Customer & Tech Support (134900) College/Division: Academic Affairs Salary Range: Position Read more
*Apple* Mobile Master - Best Buy (United Sta...
**501042BR** **Job Title:** Apple Mobile Master **Location Number:** 000416-East Lansing-Store **Job Description:** **What does a Best Buy Apple Mobile Master Read more
Best Buy *Apple* Computing Master - Best Bu...
**501195BR** **Job Title:** Best Buy Apple Computing Master **Location Number:** 000211-Colorado Blvd-Store **Job Description:** **What does a Best Buy Apple Read more
All contents are Copyright 1984-2011 by Xplain Corporation. All rights reserved. Theme designed by Icreon.