- Location or Property
- Finding Items by Location
- Finding Items by Property
- Chapter Summary
- What's Next?
Finding Items by Location
In the previous chapter, you learned that every scriptable object is contained in a parent object. Now, consider that there might be any number of objects that are also contained by the same parent object. The topic for this chapter is how you refer to any of the objects that are contained in the one parent object, all at the same level of the containment hierarchy.
Finding Items by Index
Every scriptable item on disk, like every scriptable object belonging to an application, occupies a specific place among all the items in its parent container. There is a first item, a second item, and so on. In other words, they have an ordered relationship among themselves. The numeric value representing an item's location in an ordered group of items is called its index.
For example, the second paragraph in a story consisting of ten paragraphs of text has an index value of 2. The third paragraph has an index value of 3, and so on. So, if you asked for the contents of paragraph 5 of the story, you would receive the text of the fifth paragraph in the story. The same principle applies to files and folders in the Finder, as demonstrated in the following examples.
The results of the queries in the following examples are based on the standard Mac OS X installation as it comes on a newly purchased computer. The scripts, when run on your computer, may return answers different from those shown here.
Enter and run Script 4.1.
Script 4.1.
tell application "Finder" to get item 1 of the startup disk
An item reference in nested format is returned by the script:
folder "Applications" of startup disk of application "Finder"
The returned item reference may not refer to the first item displayed in a Finder window showing the contents of the startup disk, because the display may be arranged, for example, in order of modification date or in reverse alphabetical order. Instead, it refers to the first item in the Finder's internal list of items belonging to the startup disk. This internal list is usually alphabetical by default.
Let's get the second item in the startup disk. Don't enter the line beginning with --> returns: in Script 4.2 because we added this only to show you the result as it is displayed in the Result pane at the bottom of the script window. The result shown on your computer may differ, depending on the folders that exist on your startup disk.
Script 4.2.
tell application "Finder" to get item 2 of the startup disk --> returns: folder "Library" of startup disk of application "Finder"
And here's the third item in Script 4.3:
Script 4.3.
tell application "Finder" to get item 3 of the startup disk --> returns: folder "System" of startup disk of application "Finder"
Here's a simple exercise to demonstrate using index values to specify the locations of items. Enter and run Script 4.4:
Script 4.4.
tell application "Finder" to open the startup disk
A Finder window displaying the contents of the startup disk now opens on the Desktop. Switch to the Finder, and make a new folder in that window named Aardvark. Once you've made the folder, enter and run Script 4.5.
Script 4.5.
tell application "Finder" to get item 1 of the startup disk --> returns: folder "Aardvark" of startup disk of application "Finder"
Notice that the first item of the startup disk is no longer the Applications folder. Its index value has been increased by 1 because an item with a name that alphabetically precedes its name has been added to the folder. In other words, the Applications folder is now the second folder of the startup disk.
For proof of this, let's ask the Finder for the new index of the Applications folder in Script 4.6.
Script 4.6.
tell application "Finder" to ¬ get the index of folder "Applications" of the startup disk --> returns: 2
Based on the result of the previous example, you can see the following:
- Although the index of an item is always unique (there is only one item 2, one item 3, and so on), its value may change if other items are added to or removed from the parent container.
Now, let's return the startup disk to the way it was. Delete the Aardvark folder from the startup disk, and then run Script 4.7.
Script 4.7.
tell application "Finder" to get item 1 of the startup disk --> returns: folder "Applications" of startup disk of application "Finder"
Since the top level of the startup disk no longer contains any items that alphabetically come before the folder Applications, it is once again the first item in the startup disk.
Negative Index Values
When working with multiple items, it may be useful to address the last item in the list of scriptable items. AppleScript provides a variety of means to do this. We'll now continue our coverage of index values by showing how to get the index of the last item in a group of items.
One method is to get the total number of items in the container. After all, the index value of the last item in a folder must be equal to the total number of items in the folder, right? Try Script 4.8.
Script 4.8.
tell application "Finder" to count the items of the startup disk --> returns: 4
The result is the total number of items contained in the top level of the startup disk. Incidentally, you can also use the word count as a noun instead of a verb, as in Script 4.9.
Script 4.9.
tell application "Finder" to ¬ get the count of items of the startup disk --> returns: 4
So, if you want to get a reference to the last item in a container, you can use the result of the item count as your index by placing the count request in parentheses, as in Script 4.10.
Script 4.10.
tell application "Finder" to ¬ get item (the count of items of the startup disk) of ¬ the startup disk
When the script is run, the section in the parentheses is executed first and is replaced with the result of its action, in this case the total number of items in the folder, and then the rest of the script is processed, returning this:
folder "Users" of startup disk of application "Finder"
Although the previous script returns the correct result, it is a rather wordy way to request a reference to the last item. There is a more concise way to accomplish the same result using negative index values.
Enter and run Script 4.11.
Script 4.11.
tell application "Finder" to ¬ get the name of every item of the startup disk --> returns: {"Applications", "Library", "System", "Users"}
The result is a list of the names matching the items in the top level of the startup disk. Reading from left to right, item 1 in the list of names is Applications, item 2 is Library, and so on, with the last item in the list being Users. Make sense? Try Script 4.12.
Script 4.12.
tell application "Finder" to ¬ get the name of item 4 of the startup disk --> returns: "Users"
However, AppleScript supports not only indexing lists from left to right but also from right to left! When indexed in reverse order, index values are negative numbers beginning with -1. In other words, a list of items referenced from left to right would be as follows:
{item 1, item 2, item 3, item 4}
The same list of items, referenced in the same order but using negative numbers, is as follows:
{item -4, item -3, item -2, item -1}
The ability to reference items in either direction allows you to locate the last item without knowing how many items are in the group. Just use index value -1.
Try Script 4.13.
Script 4.13.
tell application "Finder" to ¬ get the name of item -1 of the startup disk --> returns: "Users"
If you want a reference to the item before the last item in the startup disk, you write it as shown in Script 4.14.
Script 4.14.
tell application "Finder" to get item -2 of the startup disk --> returns: folder "System" of startup disk of application "Finder"
Finding Items by Range
Another use of the index value is to locate or reference a range of items. For an example, see Script 4.15.
Script 4.15.
tell application "Finder" to get items 2 thru 4 of the startup disk
The result is a three-item list of nested references to a range of items located in the top level of the startup disk.
Note the use of the term thru instead of through. Although they have the same meaning and either spelling can be used, scripters often prefer to use the shorter version.
Negative index values can also be used in requests targeting a range of items. For example, to retrieve references to a range of items starting with the second item and ending with the last item, follow the example of Script 4.16:
Script 4.16.
tell application "Finder" to get items 2 thru -1 of the startup disk
To get a list of references to all items in a container or folder, you could start with the first item and end with the last item, as in Script 4.17.
Script 4.17.
tell application "Finder" to get items 1 thru -1 of the startup disk
However, it is much clearer to use the term every, as in Script 4.18.
Script 4.18.
tell application "Finder" to get every item of the startup disk
Finding Items by Descriptive Index
As you've seen, the index property is an excellent means for finding or referring to specific items or a range of items in a container. Simply follow the class name of the target item with a number, and you have an index reference, as in item 5, folder 3, or Finder window 2.
However, since AppleScript is designed to be written in a "conversational" style, you may optionally choose to write index values in a more descriptive manner.
For example, instead of using item 5, you could write your index value as the fifth item, because AppleScript supports the descriptive indexes for the numeric values 1 through 10, as in first, second, third, fourth, fifth, sixth, seventh, eighth, ninth, and tenth.
Or you can use descriptive suffixes for any integer value, as in the 1st item, the 23rd item, or the 4064th item.
Although using these optional index forms can make your scripts very easy to read and understand, there is one caveat regarding their use. When describing a range of items, you must use only integers, as in items 56 thru 112.
Items can also be identified by other synonyms that stand in for numeric indexes. For example, to get the first item in a group of items in a container, you can use the term front as in Script 4.19.
Script 4.19.
tell application "Finder" to get the front item of the startup disk --> returns: folder "Applications" of startup disk of application "Finder"
Correspondingly, to get the final item in a container, you can use the terms back or last as in Script 4.20,
Script 4.20.
tell application "Finder" to get the last item of the startup disk --> returns: folder "Users" of startup disk of application "Finder"
or Script 4.21.
Script 4.21.
tell application "Finder" to get the back item of the startup disk --> returns: folder "Users" of the startup disk of application "Finder"
Although the terms front and back are usually used to reference windows, they work to reference any object type.
Location references can also be used for items within the outer boundaries of a group. For example, you can use the term middle to get the centermost item in a group of items:
Script 4.22.
tell application "Finder" to get the middle item of the startup disk
Finding Items by Relative Location
In addition, you can use the terms before and after to locate items in relation to other items of the group, as shown in Scripts 4.23 and 4.24.
Script 4.23.
tell application "Finder" to ¬ get the item before the last item of the startup disk --> returns: folder "System" of startup disk of application "Finder"
Script 4.24.
tell application "Finder" to ¬ get the item after the first item of the startup disk --> returns: folder "Library" of startup disk of application "Finder"
Finding Random Items
Occasionally a script may require the selection of a random item. AppleScript offers support for random selection through the use of the term some as in Script 4.25.
Script 4.25.
tell application "Finder" to get some item of the startup disk --> returns a random reference to one of the items in the startup disk