hello, applescript 3: (don’t?) tell me to run
Continuing where we left off at the end of User In, User Out, let’s build on our knowledge of getting user input and using conditionals.
In this script, we’re going to query the user for some information, and if that information meets a certain test, we’ll give the user one answer, if it doesn’t we’ll give them another. Kind of like a mini-quiz game program. There’s lots of new stuff in this script, but don’t be put off. Just bang it out on the keyboad, fix any typos if it won’t compile, and run it. Run it at least three times choosing a different button each time. We’ll go through it line by line after you’ve had a play around with it.
Line 1 assigns a string literal (the lovely “Loser”) to a variable,
heReply. We’re doing two things here. We’re first declaring a variable that we’ll want to use later in the script, and we’re also initialising it with a default value. “Loser” is one of two possible values we’ll want this variable to have later, so we’ll set this as the default now, which means the variable will always have this value when we use it unless we change it later in the script.
Most of Line 2 should be familiar to you now, except that we’ve added a third button and a default value for the answer. We’ve also added a default button, in this case 3. To understand what the default button parameter does run the script with value 1, and then again with value 2.
As you will notice, the number refers to one of the buttons defined in the buttons list, where 1 is the first item in the list and the left most button, and 3 is the last item in the list and the right most button. The parameter determines which button has focus (and therefore responds to the
return key on the keyboard).
If you’ve already tried experimenting with 4 buttons, you’ll see that the compiler complains that a maximum of 3 buttons is allowed. That’s not strictly true, but we’ll save that trick for later in the series.
Note: Lists in AppleScript, unlike most other modern programming languages, are not zero-indexed. The first item is item 1, not item 0 as it would be in Python, C, Swift and so on.
If you prefer you can also refer to buttons by their name instead of their index. This helps improve readability of your code and makes it clearer which button was intended as the default. To refer to the button by name, you would write the parameter like this:
default button "Sure?"
Line 3 should be familiar to you, but refer back to Script 6 in the previous post if you need a reminder.
Line 4 begins an
if statement block that contains another
if statement block (again, see Script 6), but there’s also something new here: the
else condition. This says that if our condition in Line 4 isn’t met, do whatever’s in the
else block starting at Line 10.
If the condition in Line 4 is met, however, then Line 6 offers a further condition: if the user typed in “Phil”, then Line 7 says change the value of the variable
theReply from “Loser” to “Winner”. Note, particularly, that if this condition is not met, then the value of
theReply will be “Loser” when it’s called later in the script.
Line 8 ends the inner
if statement block.
Line 9 now says: display the dialog to the user, showing them the value of whatever
theReply is currently set to (either “Winner” or the default “Loser”). Note that the same value is used to set the title.
Line 10 starts the
else block. This will be triggered if the user doesn’t choose either “Cancel” – which would end the script – or “Sure?” – which would trigger the first condition – when Line 2 is executed.
We don’t need to put in a specific test for “Cancel” because “Cancel” will automatically end the script with
error -128. However, as we’ll see later in the series, sometimes it can be useful to catch “Cancel” in the
ifblock too, in order to execute certain commands before the script quits.
Line 11 may look a bit mysterious; this is your first introduction to AppleScript’s most pervasive control statement.
tell is how you send a command to a particular object in AppleScript. If you’ve ever done any Object-oriented programming, another way of expressing the same idea is to say
tell allows you to target a message toward an object. In this case the object is
me — a built-in AppleScript keyword that refers to the script itself. So,
tell me to run
says “send the run message to the script”.
There’s an easy (and inaccurate) way to understand what that means, and a hard (and accurate) way. For now, we’re going to go easy so that the learning curve doesn’t get too steep. In this context, we will say that
run means “go back to Line 1 and begin execution of the script again”.
Every time you choose “Try Again”, the script goes back to Line 1 and repeats itself until you choose one of the other answers.
Where we are: so far!
In this post, we’ve been introduced to AppleScript’s list class, consolidated our knowledge of display dialogs and if statements, and had our first taste of tell, me, and run. These concepts will require more elucidation and, most importantly, more practice, all of which are coming up!
In the next post hello applescript 4: shelling out, we’ll work with these concepts some more and build on them to produce our first practical scripts. Be sure to follow Applehelpwriter to be notified when the post is published.
See you there!
For extra credit:
This week’s extras
1. Modify Script 7’s inner
if statement so that if the text returned contains your name,
theReply is “Winner”; if the text contains “Phil”,
theReply is set to “Runner Up”. Any other name should produce the default reply “Loser”.
There are in fact two ways to solve this challenge, see if you can produce both. For help, look up
else if in the Control Statements Reference section of the AppleScript documentation.
Solutions from last time
1. Use the
hidden answer parameter:
2. In the second exercise, we posed a number of questions. The easiest way to find out about the parameters for a command is to use Script Debugger’s Dictionary viewer, which you can access by clicking on the Window menu (not, confusingly, the Dictionary menu!) and choosing ‘Dictionary’.
Also, don’t forget to use the AppleScript documentation, which I’ve linked to multiple times in this and earlier posts. It’s a great source of information, hampered somewhat by the lack of an effective search feature on Apple’s site. An older, pdf version of the doc which you can search can be downloaded by clicking this link, and is also available from here. Bear in mind, though, that Apple’s online docs contain some information that the older pdf doesn’t.
We’ll leave the other questions open for now, as they’ll be coming up in later posts!