The keyword it
represents the target. (In situations where you would say of it
after a word, you may say its
before that word instead.)
The keyword it
can be useful in helping you understand who the target is. It can also be useful as an explicit target, in situations where AppleScript would otherwise misinterpret your meaning.
This example shows it
used while debugging, to make sure we understand who the target is:
tell application "Finder"
tell folders
it -- every folder of application "Finder"
end tell
end tell
Sometimes when you get yourself deep in a nest of tell blocks (see "The Chain of Ofs and Tells," earlier in this chapter), it
can be helpful for referring to the target one level up. For example, this code opens file 1 of folder 1 and also opens folder 1 itself:
tell application "Finder" tell folder 1 open file 1 open it end tell end tell
You have already seen ("Accessing Top-Level Entities" in Chapter 8) the need for it
when accessing a script object's top-level entities within a tell block addressed to the script object. When targeting an attribute of a scriptable application, there is generally no need for it
used in this way. Unlike a script object, an application has a dictionary, so AppleScript knows when you're saying the name of an attribute of that application. For example, the Finder has an attribute home
; there is no need for its
to tell AppleScript that we mean the Finder's home
rather than a variable in scope:
set home to "Ojai"
tell application "Finder"
get home -- folder "mattneub" of folder "Users"...
end tell
In fact, here the problem is more likely to be how to refer to the variable home
from within this tell block. The next section ("Me") solves the problem.
However, there is one situation where it
is needed when targeting an application. It may happen that an application's dictionary gives a property (a kind of attribute) and a class the same name. Applications really shouldn't do this, but in fact they do it quite often. Without it
, such a term may be treated as the class, causing the script to malfunction. For example:
tell application "Finder" tell folder 1 get container -- container, a class end tell end tell
This was not the desired result. To get the value of the container
property of a folder, we must use its
or (what amounts to the same thing) the of
operator:
tell application "Finder" tell folder 1 get its container -- folder "Desktop" of... end tell get container of folder 1 -- folder "Desktop" of... end tell
This problem is particularly insidious, because there is usually no error, so you're mystified when the script doesn't behave as you expect. The following script is intended to change all instances of "o" to "a" in Word. The script compiles and runs, but the change is not performed:
tell application "Microsoft Word" tell find object of selection set content to "o" tell replacement set content to "a" end tell execute find replace replace all end tell end tell
The trouble is that replacement
is both a property of the find object and the name of a class. The solution is to change the fourth line to this:
tell its replacement
Sometimes when a script is being troublesome I make both get
and it
explicit everywhere just to eliminate misunderstandings as a possible source of error. For example, I might rewrite the previous script like this:
tell application "Microsoft Word" tell (get find object of its selection) set its content to "o" tell (get its replacement) set its content to "a" end tell execute find replace replace all end tell end tell
You'd be amazed by how many problems vanish before a little extra verbosity of this sort.