Adobe Intro To Scripting
Adobe Intro To Scripting
Adobe Intro To Scripting
Copyright 2009 Adobe Systems Incorporated. All rights reserved. Adobe Introduction to Scripting NOTICE: All information contained herein is the property of Adobe Systems Incorporated. No part of this publication (whether in hardcopy or electronic form) may be reproduced or transmitted, in any form or by any means, electronic, mechanical, photocopying, recording, or otherwise, without the prior written consent of Adobe Systems Incorporated. The software described in this document is furnished under license and may only be used or copied in accordance with the terms of such license. This publication and the information herein is furnished AS IS, is subject to change without notice, and should not be construed as a commitment by Adobe Systems Incorporated. Adobe Systems Incorporated assumes no responsibility or liability for any errors or inaccuracies, makes no warranty of any kind (express, implied, or statutory) with respect to this publication, and expressly disclaims any and all warranties of merchantability, fitness for particular purposes, and non-infringement of third-party rights. Any references to company names in sample templates are for demonstration purposes only and are not intended to refer to any actual organization. Adobe, the Adobe logo, Illustrator, InDesign, and Photoshop are either registered trademarks or trademarks of Adobe Systems Incorporated in the United States and/or other countries. Apple, Mac OS, and Macintosh are trademarks of Apple Computer, Inc., registered in the United States and other countries. Microsoft, and Windows are either registered trademarks or trademarks of Microsoft Corporation in the United States and other countries. JavaScriptTM and all Java-related marks are trademarks or registered trademarks of Sun Microsystems, Inc. in the United States and other countries. UNIX is a registered trademark of The Open Group. All other trademarks are the property of their respective owners. If this guide is distributed with software that includes an end user agreement, this guide, as well as the software described in it, is furnished under license and may be used or copied only in accordance with the terms of such license. Except as permitted by any such license, no part of this guide may be reproduced, stored in a retrieval system, or transmitted, in any form or by any means, electronic, mechanical, recording, or otherwise, without the prior written permission of Adobe Systems Incorporated. Please note that the content in this guide is protected under copyright law even if it is not distributed with software that includes an end user license agreement. The content of this guide is furnished for informational use only, is subject to change without notice, and should not be construed as a commitment by Adobe Systems Incorporated. Adobe Systems Incorporated assumes no responsibility or liability for any errors or inaccuracies that may appear in the informational content contained in this guide. Adobe Systems Incorporated, 345 Park Avenue, San Jose, California 95110, USA.
Contents
1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
Is scripting hard to learn? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 Why use scripting? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 How do I know when to use scripting? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 What about actions or macros? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 What exactly is scripting? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . AppleScript . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . VBScript . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . JavaScript . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . How do I begin? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . AS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . JS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . VBS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 6 6 6 7 7 8 8
Scripting Basics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
The building blocks of scripting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 Understanding objects, properties, methods, and commands . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 Using Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 DOM Concepts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 Object references make life better . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 Variables provide a nice shortcut . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 Naming variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 Object collections or elements as object references . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 How elements and collections number subsequent items . . . . . . . . . . . . . . . . . . . . 14 Referring to the current or active object . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 Using properties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . AS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . JS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . VBS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Understanding read-only and read-write properties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Using alert boxes to show a propertys value . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Constant values and enumerations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . AS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . JS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . VBS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Using variables for property values . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Using methods or commands . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Command or method parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Required parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Multiple parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 17 18 18 19 19 20 21 21 22 22 23 23 23 24
Contents
Notes about variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 Changing a variables value . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 Using variables to refer to existing objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 Making script files readable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 Commenting the script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 Continuing long lines in AppleScript and VBScript . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 Using Arrays . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 Creating objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 More information about scripting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
Troubleshooting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
Reserved words . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47 AppleScript Script Editor error messages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47 ESTK error messages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48 VBScript error messages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
Bibliography . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
AppleScript . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50 JavaScript . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50 VBScript . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
Introduction
Scripting is a powerful tool that can be used to control and automate many features of many Adobe applicationssaving you so much time and effort that it can completely change the way you approach your work.
CHAPTER 1: Introduction
Additionally, your script can very cleverly get and respond to information. For example, you may have a document that contains photos of varying sizes. You can write a script that figures out the size of each photo and creates a different colored border based on the size, so that icons have blue borders, small illustrations have green borders, and half-page pictures have silver borders. If you like using Actions, keep in mind that your script can execute Actions within the application.
AppleScript
AppleScript is a plain language scripting language developed by Apple. It is considered one of the simplest scripting languages to use. To write AppleScript scripts, you can use Apples Script Editor application, which, in a default Mac OS installation, is located at:
system drive:Applications:AppleScript:Script Editor
For information about using the Script Editor, see the Script Editor Help.
VBScript
VBScript is a scaled-down version of the Visual Basic programming language developed by Microsoft. VBScript talks to host applications using ActiveX Scripting. While VBScript is the Visual Basic language version officially supported by CS5, you can also write scripts in VBA and Visual Basic itself. You can find several good VBScript editors on the Internet. If you have any Microsoft Office applications, you can also use the built in Visual Basic editor by selecting Tools > Macro > Visual Basic Editor.
JavaScript
JavaScript is a very common scripting language developed originally to make Web pages interactive. Like AppleScript, JavaScript is easy to learn.
CHAPTER 1: Introduction
How do I begin?
NOTE : Adobe has developed an extended version of JavaScript, called ExtendScript, that allows you to take advantage of certain Adobe tools and scripting features. As a beginner, the difference between these two languages will not affect you. However, you should get in the habit of giving your JavaScript scripts a .jsx extension, rather than the usual .js extension. JavaScript has some small advantages over AppleScript and Visual Basic: Your scripts can be used in either Windows or Mac OS. If there is a chance youll want to share or use your scripts on both platforms, you should learn to use JavaScript. In Adobe Illustrator software and InDesign, you can access scripts in any of the supported languages from within the application. However, in Photoshop, you can access only .jsx files from within the application. You must run AppleScript or Visual Basic scripts from outside the application. This is not a major drawback, but it does require a few extra mouse clicks to run your scripts. You can set up .jsx scripts to run automatically when you open the application by placing the scripts in the applications Startup Scripts folder. For information on startup-script folders, see the scripting guide for your application. To write scripts in JavaScript, you can use any text editor, or you can use the ESTK (ExtendScript Tool Kit) provided with your Adobe applications. The ESTK has many features that make it easier to use than a text editor, including a built-in syntax checker that identifies where the problems are in your script and tries to explain how to fix them, and the ability to run your scripts right from the ESTK without saving the file. This second feature can save you a lot of time, especially in the beginning when you may have to test and edit a script more than a few times to get it to work. In a default Adobe installation, the ESTK is in the following location: Mac OS: system drive:Applications:Utilities:Adobe Utilities - CS5:ExtendScript Toolkit CS5 Windows: drive:/Program Files/Adobe/Adobe Utilities - CS5/ExtendScript Toolkit CS5 For details, see the JavaScript Tools Guide.
How do I begin?
Its time to write your first script. NOTE: If you have problems running your script, see Chapter 5, Troubleshooting.
AS
1. Open the Script Editor and type the following (substituting any Adobe application name in the quotes):
tell application "Adobe Photoshop CS5" make document end tell
2. Press Run.
CHAPTER 1: Introduction
How do I begin?
JS
1. Open the ESTK and select an application from the drop-down list in the upper left corner of a document window. 2. In the JavaScript Console palette, type the following:
app.documents.add()
3. Do any of the following: Click the Run icon in the toolbar at the top of the Document window. Press F5. Choose Debug -> Run.
VBS
1. In a text editor, type the following (substituting any Adobe application in the quotes in the second line):
Set appRef = CreateObject("Photoshop.Application") appRef.Documents.Add()
2. Save the file as a text file with a .vbs extension (for example, create_doc.vbs). 3. Double-click the file in Windows Explorer.
Scripting Basics
This chapter covers the basic concepts of scripting in both Windows and Mac OS. For product-specific directions, see the scripting guide for your Adobe application.
Using Objects
The main concept to understand when using objects in scripts is how to refer to an object. How do you let the application know which object you want your script to change? In the applications user interface, you can simply select the object by clicking it. In a script, theres a little bit more to it.
DOM Concepts
Scripting languages use something called a Document Object Model (DOM) to organize objects in a way that makes the objects easy to identify. The principle behind a DOM is the containment hierarchy. In other
9
Using Objects
10
words, top level objects contain next level objects, which contain the subsequent level of objects, and so on. For example, the top level object in any Adobe application DOM is the application object. Next is the document object, which contains all other objects, such as layers, channels, pages, text frames, and so on. These objects can contain objects that the document cannot contain directly. For example, in InDesign or Illustrator, a text frame can contain words. A document cannot contain words unless it has a text frame. Similarly, in Photoshop, a document can contain a layer, and a layer can contain a text frame, but a document cannot contain a text frame unless the document contains a layer. NOTE: An objects containing object is also called its parent object. In your first script, you first named the application object (or selected it in the ESTK), and then you created the document within that application. If, as your next step, you wanted to create a layer, your script would need to identify the document in which you want to create the layer. If your script does not tell the application exactly where to create an object, your script fails. NOTE: To view a chart of the DOM for a specific application, please refer to the applications scripting guide. So, using your DOM principle, how would you add a layer in a document? (To modify this script for Photoshop, please note that a layer is called art layer in AS; and layers are called artLayers in JS or ArtLayers in VBS). AS
tell application "Adobe Illustrator CS5" make document make layer in document end tell app.documents.layers.add()
JS VBS
If you try to run these scripts, you get an error because the application does not know which document you mean. Sure, you have only one document open, but that wont always be the case. Therefore, scripting languages have strict requirements that all objects be explicitly identified in every script statement. This guide introduces three ways to refer to objects: Variables Collection or element numbers The current object or active object property
Variables
A variable is a thing that you create to hold data in your script. The data, called the variables value, can be an object in your script, or it can be a property that describes an object. You could almost think of a variable as a nickname that you give to an object or other data. Using a variable to contain an object makes an object easy to refer to. Most scripters create a variable for each object in their script.
Using Objects
11
The following scripts create a document, just as you did in your first script. However, this version of the script creates a variable named myDoc to contain the document. Take a look at these scripts, and then compare them to your first script. (See How do I begin? on page 7.) AS To create a variable in AS, you use the command set, followed by the variable name. To assign a data value to the variable, you use to followed by the value.
tell application "Adobe Illustrator CS5" set myDoc to make document end tell
JS
To create a variable in JS, you use var, followed by the variable name. To assign a data value, you use an equal sign (=) followed by the value. Spaces do not matter on either side of the equal sign.
var myDoc = app.documents.add()
VBS
To create a variable in VBS, you use the command Set, followed by the variable name. To assign a data value, you use an equal sign (=) followed by the value. Spaces do not matter on either side of the equal sign.
Set appRef = CreateObject("Illustrator.Application") Set docRef = appRef.Documents.Add
Even better, we could create another variable to hold the layer. That would allow us to easily refer to the layer if we wanted to define its properties or add an object to the layer.
tell application "Adobe Illustrator CS5" set myDoc to make document set myLayer to make layer in myDoc end tell
JS
The same script again, this time creating a variable to hold the layer.
var myDoc = app.documents.add() var myLayer = myDoc.layers.add()
VBS
The same script again, this time creating a variable to hold the layer.
Set appRef = CreateObject("Photoshop.Application")
Using Objects
12
JS
VBS
Naming variables
Your scripts will be easier to read if you create descriptive names for your variables. Variable names such as x or c arent helpful when you revisit a script. Better names are those that indicate the data the variable contains, such as theDocument or myLayer. Giving your variable names a standard prefix helps your variables stand out from the objects, commands, and keywords of your scripting system. For example: You could use the prefix doc at the beginning of any variables that contain Document objects, such as docRef, or layer to identify variables that contain Art Layer objects, such as layerRef and layerRef2. You could use the prefix my to add a personal element that separates your variables from script objects. For example, myDoc or myLayer or myTextFrame. All variable names must conform to the following rules: Variable names must be a single word (no spaces). Many people use internal capitalization (such as myFirstPage) or underscore characters (my_first_page) to create more readable names. The variable name cannot begin with an underscore character.
Using Objects
13
Variable names can contain numbers but cannot begin with a number. Variable names cannot contain quotation marks or punctuation other than the underscore character. Variable names in JavaScript and VBScript are case sensitive. thisString is not the same as thisstring or ThisString. Variable names in AppleScript are not case sensitive. Each variable in your script must have a unique name.
NOTE: Beginning scripters using AppleScript are not encouraged to use element numbers as object references when the element contains more than one object. For details as to why, see How elements and collections number subsequent items on page 14. JS In JavaScript, you indicate an items index by using the collection name followed by the index in square brackets ([]).
app.documents.add() app.documents[0].layers.add() app.documents[0].layers[0].textFrames.add()
Using Objects
14
VBS
In VBScript, you indicate an items index by using the collection name followed by the index in parentheses.
appRef.Documents.Add appRef.Documents(1).Layers.Add appRef.Documents(1).Layers(1).TextFrames.Add
Using Objects
15
This is true for all objects you create in a script. Until the script does something else, the new object is the active object, ready for modifications. Conveniently, many parent objects contain properties that allow you to refer easily to the active object. (Youll learn about properties in detail a little later in this guide. For now, you can just copy the script statements in this section and watch how they work without understanding completely why they look the way they do.) In AS, the property that refers to an active object consists of the word current and the object name. Some examples are:
current current current current document layer channel view
In JS, the property name is a compound word that combines active with the object name, in standard JS case usage: The first word in the combined term is lower case. The second word (and all subsequent words) in the combined term use initial caps. Some examples are:
activeDocument activeLayer activeChannel activeView
VBS is exactly the same as JS, except that all words in the combined term use initial caps. Some examples are:
ActiveDocument ActiveLayer ActiveChannel ActiveView
The following scripts create a document and then use this principle to create a layer in the new document. AS
tell application "Adobe Illustrator CS5" make document make layer in current document end tell app.documents.add() app.activeDocument.layers.add()
JS
Using properties
16
Using properties
To define or modify a property of an object, you do three things: 1. Name the object.
2. Name the property. 3. Specify the value for the property. The value can be any of the following datatypes: A string, which is alphanumeric text that is interpreted as text. You enclose strings in quotes (). Strings include such values as an objects name. Numeric, which is a number value that can be used in mathematical operations like addition or division. Mathematical numbers include the length of one side of a frame or the space between paragraphs, the opacity percentage, font size, stroke weight, and so on. Note that some values that look like numbers are really strings. For example, a phone number or social security number are numbers, but you would format them as strings (enclose them in quotes) because the data would not be considered mathematical numbers. Within the numeric category, there are different types of numbers: Integer, which is a whole number without any decimal points Real, fixed, short, long, or double, which are numbers that can include decimal digits, such as 5.9 or 1.0. Note: These differences may not seem important now, but keep them in mind for later. A variable. When you use a variable as a property value, you do not enclose the variable in quotes as you would a string. A Boolean value, which is either true or false. NOTE: In many cases, Boolean values act as an on/off switch. A constant value (also called an enumeration), which is a pre-defined set of values from which you can choose. Using constant values for a property is conceptually similar to using a drop-down menu in an Adobe application. Constants, and how and when to use them, are explained in Constant values and enumerations on page 20. A list (AS) or an array (JS and VBS). Some properties require multiple values, such as the page coordinates of a point location (x and y coordinates), or the boundaries of a text frame or geometric object. Multiple values for a single property are called a list in AS and an array in JS or VBS. Each language specifies formatting rules. The list or array must be enclosed as follows: In AS, the list is enclosed in curly braces: {} In JS the array is enclosed in square brackets: [] In VBS, the array is enclosed in parentheses and follows the keyword Array : Array()
Using properties
17
Values are separated by a comma (,). You can include or omit spaces after the commas; it doesnt matter. AS JS VBS
{3,4,5} or {"string1", "string2", "string3"} [3,4,5] or ["string1", "string2", "string3"] Array(3,4,5)or Array("string1", "string2", "string3")
A list or array can included nested lists or arrays, such as a list of page coordinates. In the following samples, notice that each nested array is enclosed individually, and that the nested arrays are separated by commas. AS JS VBS
{{x1, y1}, {x2, y2}, {x3, y3}} [[x1, y1], [x2, y2], [x3, y3]] Array(Array(x1, y1), Array(x2, y2), Array(x3, y3))
AS
To use properties in AS, you use the set command followed by the property name, and then type of followed by the object reference. The following script defines the name property of the layer object
tell application "Adobe Illustrator CS5" set myDoc to make document set myLayer to make layer in myDoc set name of myLayer to "My New Layer" end tell
You can set several properties in a single statement using the properties property. You format the multiple properties as an array, enclosed in curly braces. Within the array, separate each property name/property value pair with a colon (:). The following script uses properties to define the layers name and visibility state.
tell application "Adobe Illustrator CS5" set myDoc to make document set myLayer to make layer in myDoc set properties of myLayer to {name:"My New Layer", visible:false} end tell
NOTE: Notice in the preceding script that only the string value "My New Layer" is enclosed in quotes. The value for the visible property, false, may look like a string, but it is a Boolean value. To review value types, see Using properties on page 16. You can define an objects properties in the statement that creates the object, as in the following scripts.
tell application "Adobe Illustrator CS5" set myDoc to make document set myLayer to make layer in myDoc with properties {name:"My New Layer"} end tell tell application "Adobe Illustrator CS5" set myDoc to make document set myLayer to make layer in myDoc with properties {name:"My New Layer", visible:false} end tell
Using properties
18
JS
To use a property in JS, you name the object that you want the property to define or modify, insert a period (.), and then name the property. To specify the value, place an equal sign (=) after the property name, and then type the value.
var myDoc = app.documents.add() var myLayer = myDoc.layers.add() myLayer.name = "My New Layer"
NOTE: Notice in the preceding script that only the string value "My New Layer" is enclosed in quotes. The value for the visible property, false, may look like a string, but it is a Boolean value. To review value types, see Using properties on page 16. JS provides a shorthand for defining multiple properties, called a with statement. To use a with statement, you use the word with followed by the object whose properties you want to define, enclosing the object reference in parentheses (()). Do not type a space between with and the first parenthesis. Next, you type an opening curly brace ({), and then press Enter and type a property name and value on the following line. To close the with statement, you type a closing curly brace (}).
var myDoc = app.documents.add() var myLayer = myDoc.layers.add() with(myLayer){ name = "My New Layer" visible = false }
Using a with statement saves you the trouble of typing the object reference followed by a period (in this case, myLayer.) for each property. When using a with statement, always remember the closing curly bracket. JS also provides a properties property, which allows you to define several values in one statement. You enclose the entire group of values in curly braces ({}). Within the braces, you use a colon (:) to separate a property name from its value, and separate property name/property value pairs using a comma (,).
var myDoc = app.documents.add() var myLayer = myDoc.layers.add() myLayer.properties = {name:"My New Layer", visible:false}
VBS
To use properties in VBS, you name the object, insert a period (.), and then name the property. To specify the value, place an equal sign (=) after the property name, and then type the value.
Set appRef = CreateObject("Illustrator.Application") Set myDoc = appRef.Documents.Add Set myLayer = myDoc.Layers.Add myLayer.Name = "My First Layer"
Using properties
19
You can define only one property per statement. To define multiple properties, you must write multiple statements:
Set appRef = CreateObject("Illustrator.Application") Set myDoc = appRef.Documents.Add Set myLayer = myDoc.Layers.Add myLayer.Name = "My First Layer" myLayer.Opacity = 65 myLayer.Visible = false
NOTE: Notice in the preceding script that only the string value "My New Layer" is enclosed in quotes. The value for the Visible property, false, may look like a string, but it is a Boolean value. To review value types, see Using properties on page 16.
To get a string value to display in an alert box, you must store the string value in a variable. The following script converts the document name to a variable named myName, and then displays the value of myName.
tell application "Adobe Photoshop CS5" set myDoc to make document set myName to name of myDoc
Using properties
20
JS To display an alert box in JS, you use the alert() method by typing alert, and then typing the dialog content in parentheses (()). Do not type a space between alert and the first parenthesis. To find out how many objects are in a collection, use the (read-only) length property of any collection object. The following script displays an alert box that tells you how many documents are in the documents collection, then adds a document and displays a new alert with the updated number. NOTE: The collection object name is the plural form of the object. For example, the document objects collection object is the documents object.
alert(app.documents.length) var myDoc = app.documents.add() alert(app.documents.length)
VBS To display an alert box in VBS, you use the MsgBox method by typing MsgBox, and then typing the dialog content in parentheses (()). Do not type a space between MsgBox and the first parenthesis. To find out how many objects are in a collection, use the (read-only) Count property of any collection object. The following script displays an alert box that tells you how many documents are in the Documents collection, then adds a document and displays a new alert with the updated number. NOTE: The collection object is the plural form of the object. For example, the Document objects collection object is the Documents object.
Set appRef = CreateObject("Photoshop.Application") MsgBox(appRef.Documents.Count) Set myDoc = appRef.Documents.Add MsgBox(appRef.Documents.Count)
Using properties
21
NOTE: To find whether you must use an enumeration for a propertys value, look up the property in one of the scripting references provided by Adobe. For information, see Chapter 3, Finding an Objects Properties and Methods.
AS
In AS, you use constants as you would any other property definition. Do not enclose the constant in quotes. The following script uses the constant value dark green to set the layer color of a new layer.
tell application "Adobe Illustrator CS5" set myDoc to make document set myLayer to make layer in myDoc set layer color of myLayer to dark green end tell
NOTE: If dark green were a string value rather than a constant, the value would be enclosed in quotes:
set layer color of myLayer to "dark green"
JS
In JS, you type the enumeration name, a period (.), and then the enumeration value. You must use the exact spelling and capitalization as defined in the scripting references provided by Adobe. Formatting is different in different Adobe applications. For example: In InDesign: Each enumeration begins with an upper case letter, and all words within the combined term also begin with an upper case letter. The enumeration value begins with a lower case letter. The following example uses the UIColor enumeration to set the layer color to dark green.
var myDoc = app.documents.add() var myLayer = mydoc.layers.add() myLayer.layerColor = UIColor.darkGreen
In Illustrator: Each enumeration begins with an upper case letter, and all words within the combined term also begin with an upper case letter. Some enumeration values begin with an upper case letter and then use lower case letters. Others use all upper case. You must be sure to use the value exactly as it appears in the scripting reference. The following example uses the RulerUnits enumeration to set the default unit to centimeters.
var myDoc = app.documents.add() myDoc.rulerUnits = RulerUnits.Centimeters
The next script uses the BlendModes enumeration, whose values are expressed in all upper case letters.
Using properties
22
In Photoshop: Each enumeration begins with an upper case letter, and all words within the combined term also begin with an upper case letter. Enumeration values are all upper case. The following example uses the LayerKind enumeration to make the layer a text layer.
var myDoc = app.documents.add() var myLayer = mydoc.artLayers.add() myLayer.kind = LayerKind.TEXT
VBS
In VBS, you use numeric values for constants.
Set appRef = CreateObject("Photoshop.Application") Set docRef = appRef.Documents.Add Set layerRef = docRef.ArtLayers.Add layerRef.Kind = 2
JS
VBS
23
NOTE: The MsgBox method does not work when you open a script from the Scripts menu in some Adobe applications. To properly display the message box, double-click the script file in Windows Explorer.
JS
You insert methods at the end of JS statements. You must place a period before the method name, and then follow the method name with parentheses (()).
app.activeDocument.print()
VBS
You insert methods at the end of VBS statements. You must place a period before the method name.
Set appRef = CreateObject("Photoshop.Application") appRef.ActiveDocument.PrintOut
Required parameters
The following scripts use the merge command, which requires some indication of the layers you want to merge into the selected layer. Just like properties, command parameters are enclosed in curly braces ({}). However, you include only the parameter value, and not the parameter name, within the braces. NOTE: This script is for InDesign. There is no merge operation in Illustrator. To modify this script for Photoshop, note that a layer is called art layer in AS; and layers are called artLayers in JS or ArtLayers in VBS. AS
tell application "Adobe InDesign CS5" set myDoc to make document set myLayer to make layer in myDoc set myLayer2 to make layer in myDoc merge myLayer2 with {myLayer} end tell
24
JS The method parameter is enclosed in the parentheses that follow the method name.
var myDoc = app.documents.add() var myLayer = myDoc.layers.add() var myLayer2 = myDoc.layers.add() myLayer2.merge(myLayer)
VBS Notice that the method parameter is enclosed in parentheses after the method name. Do not type a space before the first parenthesis.
Set appRef = CreateObject("InDesign.Application") Set myDoc = appRef.Documents.Add Set myLayer = myDoc.Layers.Add Set myLayer2 = myDoc.Layers.Add myLayer2.Merge(myLayer)
Multiple parameters
When you define more than one parameter for a command or method, you must follow specific rules. AS There are two types of parameters for AS commands: A direct parameter, which defines the direct object of the action performed by the command Labeled parameters, which are any parameters other than direct parameters The direct parameter must follow the command directly. In the following statement, the command is make and the direct parameter is document.
make document
You can insert labeled parameters in any order. The following script creates two layers, and defines the location and name of each layer. Notice that, in the statements that create the layers, the location and name parameters appear in different orders.
tell application "Adobe InDesign CS5" set myDoc to make document tell myDoc set myLayer to make layer at beginning of myDoc with properties {name:"Lay1"} set myLayer2 to make layer with properties {name:"Lay2"} at end of myDoc end tell end tell
JS In JS, you must enter parameter values in the order they are listed in the scripting reference resources so that the script compiler knows which value defines which parameter.
25
NOTE: For information on scripting reference resources, see Chapter 3, Finding an Objects Properties and Methods. To skip an optional parameter, type the placeholder undefined. The following statement creates a Photoshop CS5 document whose width is 4000 pixels, height is 5000 pixels, resolution is 72, name is My Document, and document mode is bitmap.
app.documents.add(4000, 5000, 72, "My Document", NewDocumentMode.BITMAP)
The next statement creates an identical document except that the resolution is left undefined.
app.documents.add(4000, 5000, undefined, "My Document", NewDocumentMode.BITMAP)
NOTE: Use the undefined placeholder only to reach the parameters you want to define. The following statement defines only the documents height and width; placeholders are not needed for subsequent optional parameters.
app.documents.add(4000, 5000)
VBS In VBS, you must enter parameter values in the order they are listed so that the script compiler knows which value defines which parameter. To skip an optional parameter, type the placeholder undefined. The following statement creates a Photoshop CS5 document whose width is 4000 pixels, height is 5000 pixels, resolution is 72, name is My Document, and document mode is bitmap.
Set appRef = CreateObject("Photoshop.Application") Set myDoc = appRef.Documents.Add(4000, 5000, 72, "My Document", 5)
The next statement creates an identical document except the resolution is left undefined.
Set appRef = CreateObject("Photoshop.Application") Set myDoc = appRef.Documents.Add(400, 500, undefined, "My Document", 5)
NOTE: Use the undefined placeholder only to reach the parameters you want to define. The following statement defines only the documents height and width; placeholders are not needed for subsequent optional parameters.
Set appRef = CreateObject("Photoshop.Application") Set myDoc = appRef.Documents.Add(4000, 5000)
A tell statement names the default object that performs all commands contained within the statement. In the preceding sample, the tell statement targets the application object. Therefore, any commands
26
contained within the statement must be performed by the application object unless another object is explicitly named in a script statement within the tell statement. The following script carefully outlines the full containment hierarchy of each object to indicate which object the command must work upon:
tell application "Adobe InDesign CS5" set myDoc to make document set myLayer to make layer in myDoc set myLayer2 to make layer in myDoc end tell
You can create a shortcut by changing the command target. To do so, you add a nested tell statement. The following script performs the exact same operation as the previous script. Because the nested tell statement targets the document object, it is not necessary to refer to the document object in the statements that create the layers.
tell application "Adobe InDesign CS5" set myDoc to make document tell myDoc set myLayer to make layer set myLayer2 to make layer end tell end tell
Notice that each tell statement must be closed with its own end tell statement. You can nest as many tell statements as you wish.
JS
To change a variables value in JS, you use the variable name followed an equal sign (=) and the new value. Do not begin the reassignment statement with var; you use var only when creating a new variable.
var docRef = app.documents.add() var layerRef = myDoc.layers.add() layerRef.name = "First Layer" layerRef = myDoc.layers.add()
27
VBS
JS VBS
28
NOTE: The only thing this script does is print the current document. JS To comment all or part of a single line in JS, type two forward slashes (//) at the beginning of the comment. To comment multiple lines, surround the comment with /* and */.
//This is a single-line comment app.activeDocument.print() //this part of the line is also a comment /* This is a multi-line comment, which is completely ignored by the scripting engine, no matter how many lines it contains. Don?t forget the closing asterisk and slash or the rest of your script will be commented out...*/
NOTE: The only thing this script does is print the active document. VBS In VBS, type Rem (for remark) or ' (a single straight quote) at the beginning of the comment. VBS does not support comments that span more than one line. To comment several lines in a row, start each line with either comment format.
'This is a comment. Set appRef = CreateObject("Photoshop.Application") Rem This is also a comment. appRef.ActiveDocument.PrintOut 'This part of the line is a comment. ' This is a multi-line ' comment that requires ' a comment marker at the beginning ' of each line. Rem This is also a multi-line comment. Generally, multi-line Rem comments in VBS are easier for you to identify (and read) in your scripts Rem if they begin with a single straight quote (') rather than if they begin Rem with Rem, because Rem can look like any other text in the script ' The choice is yours but isn?t this more easily ' identifiable as a comment than the preceding ' four lines were?
NOTE: The only thing this script does is print the active document.
Using Arrays
29
such as this one*) set myLayer2 to make layer in myDoc with properties {name:"My Other Layer"} before myLayer end tell
VBS
Type an underscore (_) followed by a carriage return to break a long line but continue the statement. NOTE: In both languages, the continuation character loses its functionality if it is placed inside a string (that is, within the quotes). If the line break occurs within a string value, place the break character before the string and insert the line break early. NOTE: In JavaScript, statements can contain carriage returns, so there is no need for a continuation character. However, the ExtendScript interpreter interprets each line as a complete statement. In general, therefore, its best to insert returns only at the ends of statements.
Using Arrays
In VBScript and JavaScript, arrays are similar to collections; however, unlike collections, arrays are not created automatically. You can think of an array as a list of values for a single variable. For example, the following JavaScript array lists four values for the variable myFiles:
var myFiles = new Array () myFiles[0] = "clouds.bmp" myFiles[1] = "clouds.gif" myFiles[2] = "clouds.jpg" myFiles[3] = "clouds.pdf"
Notice that each value is numbered. To use a value in a statement, you must include the number. The following statement opens the file clouds.gif :
open(myFiles[1])
NOTE: While indexes in VBS collections always begin numbering at (1), you can stipulate in your VBS scripts whether arrays that you create begin numbering at (1) or (0). To find out how to set the array index starting number, refer to any VBScript text book. For information on collections and index numbers, see Object collections or elements as object references on page 13.
Creating objects
Your first script demonstrated how to create an object using the make command (AS), add() method (JS), or Add method (VBS) of the objects collection object. For example: AS
tell application "Adobe Photoshop CS5" make document
30
end tell
JS VBS
app.documents.add()
However, some objects do not have a make command (AS), add() method (JS), or Add method (VBS). To create objects of these types, refer to the section Creating new objects in the chapter for your scripting language in the Adobe scripting guide for your application.
2. Choose your Adobe application, and then choose Open. Script Editor opens the Adobe application and then displays the applications dictionary.
The object description appears in the lower viewing pane. The objects elements and properties are listed below the description. Each element name is a hyperlink to the elements object type. 3. Each property listing contains the following: The property name The data type in parentheses.
31
32
If the data type is an object, the data type is a hyperlink to the object. If the data type is an enumeration, the data type is anything. The valid values are listed after the property description and separated by forward slashes (/), and are preceded by the notation Can return:. The access value: If the object is read-only, r/o appears after the data type. If the object is read-write, no access value is given. A description of the property.
.
1. Select a suite to display the suites objects and commands in the upper middle pane 3. View the objects information in the lower pane. Object description Links to the objects elements
Properties list
Data types and access values are parenthesized following the property name. Note: The access value appears only when the property is read-only. Viewing commands and command parameters
NOTE: The data dictionary lists the objects you can use with a command. However, it does not list the commands you can use with an object. To view a list of commands you can use with an object, refer to the AppleScript scripting reference for your application. See Using Adobe scripting reference documents on page 38 for more information. To view commands in the data dictionary, follow these steps: 1. In the upper left pane of the data dictionary screen, select the suite that contains the command. The upper middle pane lists the commands and objects contained in the suite. 2. Select the command in the upper middle pane.
33
The command description appears in the lower viewing pane. Below the description, the objects with which you can use the command are listed. Below the list of supported objects, the parameters are listed. If the parameter is optional, it is enclosed in square brackets ([ ]). If no brackets appear around the parameter name, the parameter is required. Each parameter name is followed by the data type. If the data type is an object, the data type is a hyperlink to the object. If the data type is an enumeration, the valid values are preceded by the notation Can accept: and then listed, separated by forward slashes (/). 1. Select a suite to display the suites commands and objects in the upper middle pane. 3. View the commands information in the lower pane: Command description List of objects that use the command 2. Select the command.
Parameters, with data types and descriptions optional parameters are enclosed in square brackets ([ ]) Note: When the parameter value is an enumeration, the enumerated values are preceded by Can accept:
34
NOTE: If you use a different editor, refer to the editors help system to find out how to display type libraries.
5. Select your Adobe application in the drop-down list in the upper left corner of the Object Browser window.
.
35
Methods are indicated by the following icon: Understanding property listings in the Object Browser When you select a property in the Members of pane, the propertys information is displayed in the information pane at the bottom of the Object Browser window as follows: The property name is followed by the data type. If the data type is a constant, the constant appears as a hyperlink to the constants values. Constant names begin with a prefix that matches the Adobe applications abbreviated name. For example: The prefix Ps is used for enumerations in Photoshop CS5. Examples: PsColorProfileType, PsBitsPerChannelType The prefix id is used for enumerations in InDesign CS5. Examples: idRenderingIntent, idPageOrientation The prefix Ai is used for enumerations in Adobe Illustrator CS5.) Examples: AiCropOptions, AiBlendModes If the data type is an object, the object name is a hyperlink to the object type. The access value appears only if the property is read-only. If the property is read-write, no access value appears.
The data type appears next to the property name. The access value is listed only when access is read-only. The property description appears at the bottom of the information pane.
36
Finding an enumerations numeric value In VBS, you use an enumerations numeric value as a property value. For example, in the following script, the layer type, represented by the Kind property in the last line of the script, is defined by the numeric value 2, which represents the TextLayer constant value.
Set appRef = CreateObject("Photoshop.Application") Set docRef = appRef.Documents.Add Set layerRef = docRef.ArtLayers.Add layerRef.Kind = 2 'PsTextLayer
To find an enumerations numeric value, follow these steps: 1. Click the link to the enumerations information.
37
2.
Click the enumeration value to display the numeric value in the bottom pane.
Click the enumeration value in the right pane to display its numeric value in the bottom pane. Understanding method listings When you select a method in the Members of pane, the methods information is displayed in the information pane at the bottom of the Object Browser window as follows: The method name is followed by the parameters. Optional parameters are enclosed in square brackets ([ ]). If no brackets appear around a parameter name, the parameter is required. Each parameter name is followed by the data type. If the data type is an object, the data type is a hyperlink to the object. If the data type is an enumeration, the enumeration name begins with the applications initials and is a hyperlink to the enumerations information. If a default value exists for a parameter, the value is listed after the datatype after an equal sign (=). NOTE: The default value is used if you do not define a value for the parameter. Only optional parameters have default values.
38
The data type is listed after the method name; if the datatype is an enumeration, the enumeration name begins with the applications initials and is a link to the enumerations information.
1. Select the method in the Members of pane. The parameters are listed in parentheses after the method name, with optional parameters enclosed in square brackets ([ ]). The method description appears at the bottom of the information pane. If a default value exists, it follows an equal sign (=). Note: Any data type can have a default value.
39
just below the object in the containment hierarchy. For example, the following Elements table is taken from a document object in InDesign. Name character style layer story Refer to by index, name, range, relative, satisfying a test, ID index, name, range, relative, satisfying a test, ID index, name, range, relative, satisfying a test, ID
The information you can get from this table is that, in document objects that you create for this application, you can create character style, layer, and story objects. For example:
tell application "Adobe InDesign CS5" set myDoc to make document set myCharStyle to make character style in myDoc with properties {name:"Bold"} set myLayer to make layer in myDoc set myStory to make story in myDoc end tell
The following script statement would produce an error, because stroke style is not an element of this applications document object.
tell application "Adobe InDesign CS5" set myDoc to make document set myStrokeStyle to make stroke style in myDoc with properties {name:"Erratic"} end tell
40
Property
bounds
What it is Read-only. An array of coordinates that describes the bounding rectangle of the layer in the format [y1, x1, y2, x2]. Read-only. The type of layer. Read-write. The name of the layer. Read-write. The opacity as a percentage. (Range: 0.0 to 100.0) Read-only. The text item that is associated with the layer. NOTE: Valid only when kind = LayerKind.TEXT. See kind.
visible
Boolean
For example: AS
tell application "Adobe Photoshop CS5" set myDoc to make document set myLayer to make art layer in myDoc set properties of myLayer to {kind:text layer, name:"Captions", opacity:45.5, visible:true} set contents of text object in myLayer to "Photo Captions" end tell
NOTE: You cannot define the bounds of the layer because the bounds property is read-only. JS
var myDoc = app.documents.add() var myLayer = myDoc.artLayers.add() alert(myLayer.bounds) // can't set the property because it is read-only myLayer.kind = LayerKind.TEXT myLayer.name = "Captions" myLayer.opacity = 45.5 // can use a decimal point because the type is not integer myLayer.textItem.contents = "Day 1: John goes to school" //see the properties table for the textItem object to find the contents property myLayer.visible = true Set appRef = CreateObject("Photoshop.Application") Set docRef = appRef.Documents.Add Set layerRef = docRef.Layers.Add msgBox(layerRef.Bounds) ' can?t set the property because it is read-only layerRef.Kind = 2 layerRef.Name = "Captions" layerRef.Opacity = 45.5 // can use a decimal point because the type is not integer layerRef.TextItem.Contents = "Day 1: John goes to school" //see the Properties table for the TextItem object to find the Contents property layerRef.Visible = true
VBS
NOTE: In JS and VBS, collection objects are kept in properties of the containing object. To determine an objects containment hierarchy, you must locate the object or objects that use the objects collection object (that is, the objects plural form) as a property. For example, documents.layers, or layers.textFrames.
41
Parameter type
UnitValue UnitValue number (double) string NewDocumentMode DocumentFill number (double)
Returns Document
In the preceding table: All of the parameters are optional, as indicated by the square brackets. The width and height parameters default to the current ruler units, and therefore the data type is listed as UnitValue. In other words, if the current vertical ruler unit is inches and the horizontal ruler unit is centimeters, the following statement will create a document that is 5 inches wide and 7 centimeters tall: AS: JS: VBS:
make document with properties {width:5, height:7} app.documents.add(5, 7) appRef.Documents.Add(5, 7)
The following script statements define values for each of the parameters listed in the sample methods table.
42
AS
make documement with properties {width:5, height:7, resolution:72, name:Diary, mode:bitmap, initial fill:transparent, pixel aspect ratio: 4.7}
JS VBS
app.documents.add(5, 7, 72, "Diary", NewDocumentMode.BITMAP, DocumentFill.TRANSPARENT, 4.7) appRef.Documents.Add(5, 7, 72, "Diary", 5, 3, 4.7 )
Conditional statements
if statements
If you could talk to your Adobe application, you might say, If the document has only a single layer, then create another layer. This is an example of a conditional statement. Conditional statements make decisionsthey give your scripts a way to evaluate something, such as the number of layers, and then act according to the result. If the condition is met, then the script performs the action included in the if statement. If the condition is not met, then the script skips the action included in the if statement. Each of the following scripts opens a document and then checks whether the document contains a single layer. If only one layer exists, the script adds a layer and sets the new layers fill opacity to 65%. AS An if statement in AS begins with the word if, followed by the comparison phrase in parentheses, followed by the word then. You must close the if statement with end if.
tell application "Adobe Photoshop CS5" --modify the hard-drive name at the beginning of the filepath, if needed set myFilepath to alias "c:Applications:Adobe Photoshop CS5:Samples:Ducky.tif" open myFilepath set myDoc to current document tell myDoc if (art layer count = 1) then set myLayer to make art layer with properties {fill opacity:65} end if end tell end tell
NOTE: AS uses a single equal sign (=) for comparing values. Now close Ducky.tif and try the script again, but change the if statement to the following:
if (art layer count < 1) then
JS
An if statement in JS begins with the word if, followed by the comparison phrase in parentheses. Enclose the action in the if statement in curly braces ({}).
var myDoc = app.open(File("/c/Program Files/Adobe/Adobe Photoshop CS5/Samples/Ducky.tif")); if(myDoc.artLayers.length == 1){ var myLayer = myDoc.artLayers.add() myLayer.fillOpacity = 65 }
43
Conditional statements
44
NOTE: JavaScript uses a double equal sign (==) for comparing values, as opposed to the single equal sign (=) used for assigning values to properties or variables. Now close Ducky.tif and try the script again, but change the if statement to the following:
if(myDoc.artLayers.length < 1){
VBS
An if statement in VBS begins with the word If, followed by the comparison phrase, followed by the word Then. You must close the if statement with End If.
Set appRef = CreateObject("Photoshop.Application") Set myDoc = appRef.Open("/c/Program Files/Adobe/Adobe Photoshop_CS5/Samples/Ducky.tif") If myDoc.ArtLayers.Count = 1 Then Set myLayer = myDoc.ArtLayers.Add myLayer.FillOpacity = 65 End If
NOTE: VBS uses a single equal sign for both comparing and assigning values. Now close Ducky.tif and try the script again, but change the if statement to the following:
If myDoc.ArtLayers.Count < 1 Then
if else statements
Sometimes, you might have a slightly more complicated request, such as, If the document has one layer, set the layers fill opacity to 50%but if the document has two or more layers, set the fill opacity of the active layer to 65%. This kind of situation calls for an if else statement. AS
tell application "Adobe Photoshop CS5" --modify the hard-drive name at the beginning of the filepath, if needed set myFilepath to alias "c:Applications:Adobe Photoshop CS5:Samples:Ducky.tif" open myFilepath set myDoc to current document tell myDoc if (count of art layers < 2) then set fill opacity of current layer to 50 else set fill opacity of current layer to 65 end if end tell end tell var myDoc = app.open(File("/c/Program Files/Adobe/Adobe Photoshop CS5/Samples/Ducky.tif")); if(myDoc.artLayers.length < 2){ myDoc.activeLayer.fillOpacity = 50 } else{ myDoc.activeLayer.fillOpacity = 65 } Set appRef = CreateObject("Photoshop.Application") Set myDoc = appRef.Open("/c/Program Files/Adobe/Adobe Photoshop CS5/_ Samples/Ducky1.tif") If myDoc.ArtLayers.Count < 2 Then myDoc.ActiveLayer.FillOpacity = 50
JS
VBS
Loops
45
Loops
You may want your script to find and change all objects of a certain type. For example, your document may have some visible layers and some invisible layers, and you want to make all of the layers visible. You would like this script to work for several documents, but your documents have varying numbers of layers. This is a situation in which a repeat statement (AS) or a loop (JS and VBS) comes in handy. A loop walks through a collection of objects and performs an action on each object. To use the scripts in this section, open your Adobe application and create a document that has at least nine layers. Make some of the layers visible, and hide other layers. Save the document, and then run the script, substituting the name of your application and the layer object name in your applications DOM. The basic principle behind each of these loops is that the script identifies the first layer in the element or collection and sets the layers visibility to true, then identifies the next layer and repeats the action, and then identifies the following layer until each layer has been acted upon. AS
tell application "Adobe Illustrator CS5" set myDoc to current document tell myDoc set myLayerCount to (count layers) set myCounter to 1 repeat while myCounter <= (myLayerCount + 1) set myLayer to layer myCounter set myLayer with properties {visible:true} --the next statement increments the counter to get the next layer set myCounter to myCounter + 1 end repeat end tell end tell
This script uses two variables, myLayerCount and myCounter, to identify a layer and then increment the layer number until all layers in the document have been identified. JS
var myDoc = app.activeDocument var myLayerCount = myDoc.layers.length for(var myCounter = 0; myCounter < myLayerCount; myCounter++) {var myLayer = myDoc.layers[myCounter] myLayer.visible = true}
This script uses a for loop, which is one of the most common techniques in JavaScript. Like the AppleScript above, the script uses two variables, myLayerCount and myCounter, to identify a layer and then increment the layer number until all layers in the document have been identified. The increment takes place in the third statement within the for statement: myCounter++. The ++ syntax adds 1 to the current value, but does not add 1 until the loops action has been done. The for loop in this script would say the following in plain English: 1. Begin with the value of myCounter at 0. 2. If the value of myCounter is less than the value of myLayerCount, then use the value of myCounter as the index for the layer assigned to myLayer, and set the visibility of myLayer to true.
46
3. Add 1 to the value of myCounter, and then compare myCounters new value to the value of myLayerCount. 4. If myCounter is still less than myLayerCount, use the new value of myCounter as the index of myLayer and set the visibility of myLayer to true, then add 1 to the value of myCounter. 5. Repeat until myCounter is no longer less than myLayerCount. VBS
Set appRef = CreateObject("Illustrator.Application") Set myDoc = appRef.ActiveDocument For Each object in myDoc.Layers object.Visible = True Next
The For Each Next loop in VBScript simply tells the application to set the Visible property of each object in the Layers collection in the active document to True. Notice that the collection is identified by the containment hierarchy of parent objects (in this case by the variable myDoc) followed by the collection name, which is the plural form of the object name (in this case Layers). NOTE: The object named in the loop can be anything. The script works the same if you substitute x for object, as in the following script:
Set appRef = CreateObject("Illustrator.Application") Set myDoc = appRef.ActiveDocument For Each x in myDoc.Layers x.Visible = True Next
Troubleshooting
This chapter explains how to interpret some basic error messages that you may receive when you run a script.
Reserved words
Script Editor and the ESTK, as well as many other scripting editors, highlight certain words when you type them. For example, the Boolean values true and false are always highlighted. Other examples are listed below. AS
tell end with set
JS
VBS
These highlighted words are reserved by the scripting language for special purposes and cannot be used as variable names. You can use reserved words as part of a string, because they are enclosed in quotes. You can also use them in comments, because comments are ignored by the scripting engine. If your script indicates a syntax error, check to make sure you have not improperly used a reserved word. For a full list of reserved words in your scripting language, refer to one of the resources listed in Chapter 6, Bibliography.
47
CHAPTER 5: Troubleshooting
48
in the error message) after the object name in your script, or create a nested tell statement that names the parent object. Expected "" but found end of script Make sure all quotes are closed around strings. Requested property not available for this object Check the spelling of all properties. TIP: Choose Result Log at the bottom of the Script Editor window to view your scripts progress line by line.
CHAPTER 5: Troubleshooting
49
undefined is not an object Make sure the object in the highlighted statement is identified correctly in the containment hierarchy. For example, if the object is a layer, make sure you have defined which document contains the layer. For document objects, it may be necessary to include the parent object app.
Bibliography
This chapter contains a list of scripting books for beginners. This is only a partial list. You can also search the Internet for online tutorials in your scripting language.
AppleScript
For further information and instruction in using the AppleScript scripting language, see these documents and resources: AppleScript for the Internet: Visual QuickStart Guide, 1st ed., Ethan Wilde, Peachpit Press, 1998. ISBN 0-201-35359-8. AppleScript Language Guide: English Dialect, 1st ed., Apple Computer, Inc., Addison-Wesley Publishing Co., 1993. ISBN 0-201-40735-3. Danny Goodmans AppleScript Handbook, 2nd ed., Danny Goodman, iUniverse, 1998. ISBN 0-966-55141-9. Apple Computer, Inc. AppleScript website: www.apple.com/applescript
JavaScript
For further information and instruction in using the JavaScript scripting language, see these documents and resources: JavaScript: The Definitive Guide, David Flanagan, OReilly Media Inc, 2002. ISBN 0-596-00048-0 JavaScript Bible, Danny Goodman, Hungry Minds Inc, 2001. ISBN 0-7645-4718-6 Adobe Scripting, Chandler McWilliams, Wiley Publishing, Inc., 2003. ISBN 0-7645-2455-0
VBScript
For further information and instruction in using VBScript and the VBSA scripting language, see these documents and resources: Learn to Program with VBScript 6, 1st ed., John Smiley, Active Path, 1998. ISBN 1-902-74500-0 Microsoft VBScript 6.0 Professional, 1st ed., Michael Halvorson, Microsoft Press, 1998. ISBN 1-572-31809-0. VBS & VBSA in a Nutshell, 1st ed., Paul Lomax, OReilly, 1998. ISBN 1-56592-358-8 Microsoft Developers Network (MSDN) scripting website: msdn.microsoft.com/scripting
50
Index
A
actions, 5 alert boxes, 19 AppleScript definition, 6 dictionaries, 31 first script, 7 web site, 50 arguments definition, 9 using, 23 arrays, 29 creating, 29 defined, 16 enumerations defined, 16 using, 20 ESTK default location, 7 troubleshooting in, 48 viewing JS object model, 33 ExtendScript definition, 7
I
if else statements, 44 if statements, 43 Illustrator, See Adobe Illustrator index definition, 13 numbering schemes, 14
B
bibliography, 50 Boolean, 16
J
JavaScript advantages of, 7 case usage, 15 definition, 6 first script, 8 JavaScript Tools Guide, 7
C
commands properties, 23 using, 23 viewing in AS dictionaries, 31, 32, 33 comments, 27 conditional statements, 43 constants defined, 16 using, 20 containment hierarchy, 9, 12 in scripting references, 39
L
long lines, 28 loops, 45
M
macros, 5 methods arguments, 23 definition, 9 using, 23 viewing in scripting references, 41 viewing in VBS type libraries, 37
D
datatypes, 16 dialogs, 19 dictionaries, 31 DOM definition, 9 viewing, 10
E
elements viewing in scripting references, 38
O
objects active, 15
51
Index
52
collections, 13 current, 15 definition, 9 elements, 13 parent, 10 references, 10 using, 9 viewing in AS dictionaries, 31, 33 viewing in scripting references, 38 viewing in VBS type libraries, 34
V
var, 11 variables as property values, 16 changing value of, 26 creating, 10 definition, 10 for existing objects, 27 naming, 12 using for property values, 22 values definition, 10 VBScript definition, 6 extension, 8 first script, 8 type libraries, 33
P
parameters definition, 9 direct (AS), 24 labeled (AS), 24 optional, 23 required, 23 using, 23 using multiple, 24 viewing in scripting references, 41 parent object, 10 properties datatypes, 16 definition, 9 multiple values, 16 read-only, 19 read-write, 19 using, 16 viewing in AS dictionaries, 31 viewing in scripting references, 39 viewing in VBS type libraries, 35
S
script comments, 27 Script Editor AppleScript dictionaries, 31 default location, 6 troubleshooting in, 47 scripting about, 6 definition, 6 using, 5 scripts running automatically, 7 Startup folder, 7 strings, 16
T
tell statements (AS), 25