Copy link to clipboard
Copied
I am frequently in a situation where, after finishing work on multiple open photoshop documents, I want to play a specific action on a few of them. The file name ALWAYS match a pattern that should be pretty easy to match with regex. Essentially:
If the document name is 5 or 6 digits + "F", play action A.
If the document name is 5 or 6 digits + "FX", play action B.
If the document name is 5 or 6 digits + "B", play action A.
If the document name is 5 or 6 digits + "BX", play action B.
I gather this requires a for loop to look through every open doc, and then a if docName matches regex, then play correct action. But I am having trouble putting it all together and would greatly appreciate some assistance.
Thanks!
Hi squirpy,
you can use a switch case or an if else clause. There is no difference.
...// be sure that action set with name actionSet exists
// be sure that action1 in action set with name actionSet exists
for(i=0; i<app.documents.length; i++) {
var aDoc = app.activeDocument = app.documents;
if(aDoc.name.match(/^\d{5,6}(B|F)$/) != null) {
// do action1
app.doAction("action1", "actionSet");
} else {
if(aDoc.name.match(/^\d{5,6}((B|F)X)$/) != null) {
// do action2
Copy link to clipboard
Copied
one more thing....the target documents are always unsaved so the regex DOES NOT need to contend with any extensions.
Copy link to clipboard
Copied
Make sure you amend the Action Name and ActionSetName!
#target photoshop;
//doAction("Action Name","ActionSetName");
//Change to suit!
for(d=0;d<app.documents.length;d++){
app.activeDocument = app.documents
; switch(app.activeDocument.name.match(/(^\d{5,6})(.*)/)[2].toLowerCase()){
case "f" : doAction("A","ActionSetName"); break;
case "fx" : doAction("B","ActionSetName"); break;
case "b" : doAction("A","ActionSetName"); break;
case "bx" : doAction("B","ActionSetName"); break;
default : break;
}
};
Copy link to clipboard
Copied
Hi squirpy,
you can use a switch case or an if else clause. There is no difference.
// be sure that action set with name actionSet exists
// be sure that action1 in action set with name actionSet exists
for(i=0; i<app.documents.length; i++) {
var aDoc = app.activeDocument = app.documents;
if(aDoc.name.match(/^\d{5,6}(B|F)$/) != null) {
// do action1
app.doAction("action1", "actionSet");
} else {
if(aDoc.name.match(/^\d{5,6}((B|F)X)$/) != null) {
// do action2
app.doAction("action2", "actionSet");
} else {
//alert("do nothing");
}
}
}
Have fun
Copy link to clipboard
Copied
Thanks to both of you for your assistance! It is VERY close to working perfectly. The problem is this....right now every time I run it, it misses some, but then if i run it again, it get's some more and so on. So if I run it a few times it eventually gets them all, but not only this inefficient, needing to be run multiple times also will cripple my ability to add to the script and integrate it into my workflow.
The problems seems to be that my actions end by closing their target document. So documents.length is changing during the loop and throwing things off. Is there a way to account for this by doing something with the iterator?
Here is my current code:
var actionfolder = 'regular';
var actionfolder2 = 'bottomFRAME';
var saveSquare = 'Save []';
var saveTemp = 'CATsend';
for(i=0; i<app.documents.length; i++) {
var aDoc = app.activeDocument = app.documents;
if(aDoc.name.match(/^\d{5,6}(B|F)$/) != null) {
app.doAction(saveTemp,actionfolder);
} else {
if(aDoc.name.match(/^\d{5,6}((B|F)X)$/) != null) {
app.doAction(saveSquare,actionfolder2);
} else {
alert("do nothing");
}
}
}
EDIT: The solution involves iterating backwards like so:
for (i = app.documents.length - 1; i >= 0; i--) { ... }
Now everything is working perfect....thanks again!