How to access a textFrame with label?

Explorer ,
Jul 13, 2022 Jul 13, 2022

Copy link to clipboard

Copied

hi All, I have approx 20 pages in a document and want to empty for a new monthly issue. I have assinged labels to each textframe e.g. One, Two, Three, Four etc. I am using following script but I want to access a particular textFrame using label directly without loop something like below. 

var myFrame = myDoc.pageItems.itemsByID(2034); // something for a textFrame with script label "One".

 

This is the script:

var myDoc = app.activeDocument;

var i;

var myFrame = myDoc.textFrames;

for (i=0; myFrame.length; i++)

{

Switch (myFrame[i].label)

case "One":

myFrame[i].characters.itemByRange(24, -1).remove(); // here i want few lines

case "Two"

myFrame[i].contents = "";  // no text in the frame

case "Three"

myFrame[i].contents = "";  // no text in the frame

and so on

}

TOPICS
Scripting

Views

84

Likes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines

correct answers 1 Correct answer

Adobe Community Professional , Jul 13, 2022 Jul 13, 2022
Hi @BarlaeDC , itemByName refers to property "name" of that text frame and not to "label". "label" means a script label by definition. I'm not sure how @virender_CTS assigned a label value to a particular frame. If he uses property label it must be a script label. It's value can be seen in the UI with the Scripts Label Panel. Looking for labels and their value: Iterate the pageItems collection or the allPageItems array of a page, a spread or the document to read out the value. Or use the tex...

Likes

Translate

Translate
Adobe Community Professional ,
Jul 13, 2022 Jul 13, 2022

Copy link to clipboard

Copied

Hi,

 

You should be able to use

 

 

var myFrame = app.activeDocument.textFrames.itemByName("ScriptLabel");

 

So the above was complete rubbish, although I knew you could do something like it. BUT you gotta go back to a previous version 😛

// Store the version of the current scripting environment:
var currentScriptingEnvironment = app.scriptPreferences.version ;
// Set the scripting environment to the version of InDesign CS4:
app.scriptPreferences.version = "6.0";
var allFrames = app.activeDocument.pageItems.item("frameOne").getElements();
// IMPORTANT: Set the scripting environment back:
app.scriptPreferences.version = currentScriptingEnvironment;

 

Likes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Explorer ,
Jul 13, 2022 Jul 13, 2022

Copy link to clipboard

Copied

Hi, Thanks for the reply. I checked it twice but it says object is invvalid, however with loop I can do it.

var myFrame = app.activeDocument.textFrames.itemByName("One");
myFrame.contents = "";

Likes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Adobe Community Professional ,
Jul 13, 2022 Jul 13, 2022

Copy link to clipboard

Copied

itemByName only works on pageItems named in the layers panel. To access items with labels, you need to iterate through all text frames and operate. You could also write a helper function that converts the labels to names, but if two items have the same label, then you would still need to iterate, since itemByName would only find the first one (unless you were to iterate through pages and check, ie page[i].textFrames.itemByName("One"); 

Likes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Adobe Community Professional ,
Jul 13, 2022 Jul 13, 2022

Copy link to clipboard

Copied

Hi @BarlaeDC ,

itemByName refers to property "name" of that text frame and not to "label".

"label" means a script label by definition.

 

I'm not sure how @virender_CTS assigned a label value to a particular frame.

If he uses property label it must be a script label. It's value can be seen in the UI with the Scripts Label Panel.

 

Looking for labels and their value:

Iterate the pageItems collection or the allPageItems array of a page, a spread or the document to read out the value.

Or use the textFrames collection that would not include nested text frames like anchored or grouped ones.

 

Directly this cannot be done anymore.

Once that was possible with InDesign CS4, but this changed with InDesign CS5.

That all said, one could force InDesign to a script version 6 environment. And if done, one could get all the labeled text frames with: app.documents[0].textFrames.item("NameOfLabel").

 

Here some code:

var currentVersion = app.scriptPreferences.version;
// String "17.0"  for InDesign 2022 version 17.3.0

// Set version to OLD InDesign CS4:
app.scriptPreferences.version = "6.0";

// Address all text frames with label value "LabelOne" in one go:
app.documents[0].textFrames.item("LabelOne").fillColor = "Yellow";

// Reset version:
app.scriptPreferences.version = currentVersion;

 

Don't know if that approach will work for your purposes.

 

Regards,
Uwe Laubender
( Adobe Community Professional )

 

 

Likes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Explorer ,
Jul 13, 2022 Jul 13, 2022

Copy link to clipboard

Copied

LATEST

Hi Uwe, 

I have used scrpt label as per your comments above. (If he uses property label it must be a script label. It's value can be seen in the UI with the Scripts Label Panel.) I assinged to the different text frames directly in indd file not via script.

 

Regards

Virender

Likes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Guru ,
Jul 13, 2022 Jul 13, 2022

Copy link to clipboard

Copied

Here are a few useful functions.

Likes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Adobe Community Professional ,
Jul 13, 2022 Jul 13, 2022

Copy link to clipboard

Copied

Hi Kasyan,

thank you for the link!

( Especially the function by Loic is interesting… )

 

Regards,
Uwe Laubender
( Adobe Community Professional )

Likes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines