AppleScript_ The Definitive Guide - Matt Neuburg [106]
As mentioned earlier, get (along with set) is implemented in a special way; it isn't a message to an object in the manner discussed through this chapter. Thus it can't be sent to a direct object by means of a tell block; you must always say what you want to get, immediately after the word get, or the compiler will complain:
tell 7 to get -- compile-time error: Expected expression but found end of script
It
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: