Warum bricht das Gruppieren oder Verschieben von Textfeldern das Skript?

Ich bin ein Anfänger im Schreiben von Skripten für InDesign (erst heute angefangen!). Ich habe es irgendwie geschafft, ein Skript zu schreiben, das ein Textfeld automatisch mit einer Liste der verknüpften Bilder im Dokument füllt. Wenn ich das Textfeld jedoch mit anderen Objekten gruppiere oder es in ein anderes Indesign-Dokument verschiebe, funktioniert das Skript nicht mehr. Ich erhalte eine Fehlermeldung, die besagt „Objekt ist ungültig“, wobei die Quelle „resFrame.contents = res.String;“ ist. Kann jemand bitte erklären, warum dies geschieht und wie es behoben werden kann?

Code unten...

myDoc = app.activeDocument;  
myPages = myDoc.pages.everyItem().getElements();  
myDoc.viewPreferences.horizontalMeasurementUnits = myDoc.viewPreferences.verticalMeasurementUnits = MeasurementUnits.INCHES;  

for (var k = 0; k < myPages.length; k++) {  
    resString = myDoc.links.everyItem().name.join("\r");  
    resFrame = myFramelinks(myPages[k]);  
    resFrame.contents =  resString;
    }  

function myFramelinks (page) {
    var mFlinks = page.textFrames.item("linkslist");
    return mFlinks;
    }

Antworten (1)

Woher kommt der Name Ihres Artikels "Linksliste"? Indem Sie einen Namen für den TextFrame festlegen?

Die Eigenschaft "Name" eines Textrahmens scheint für das Dokument dauerhaft zu sein. Auch wenn Sie den Textrahmen kopieren und in ein anderes Dokument einfügen, ist er immer noch vorhanden.

Aber wenn Sie eine Seite mit 2 Textrahmen haben und Sie ausführen:

$.writeln(app.activeDocument.pages[0].textFrames.length);

es kommt zurück 2

Gruppieren Sie diese Textrahmen zusammen und es wird 0 zurückgegeben

Wenn Sie auf gruppierte Elemente zugreifen möchten, müssen Sie wie folgt darauf zugreifen:

$.writeln (app.activeDocument.pages[0].groups[0].textFrames[0].name)

Sie können auch auf diese Weise darauf zugreifen:

$.writeln(app.activeDocument.pages[0].allPageItems.length)

Dies gibt 3 zurück.

wenn du läufst:

for(var i = 0; i < app.activeDocument.pages[0].allPageItems.length; i++){
  $.writeln(app.activeDocument.pages[0].allPageItems[i].constructor.name)
}

Die Ausgabe wird sein:

Group
TextFrame
TextFrame

Sie könnten also eine Überprüfung für Ihren Namen erstellen und erneut auf diesen bestimmten TextFrame zugreifen.

(Getestet in ID CC 2014 auf OSX 10.10.2)

Aktualisieren:

Um den Textrahmen mit dem Namen "Linksliste" abzurufen, sollten Sie etwa so vorgehen:

function get_linklist(page) {
  var tf = null;
  for (var i = 0; i < page.allPageItems.length; i++) {
    var item = page.allPageItems[i];
    if (item.name == "linkslist") {
      tf = item;
      break;
    }
  }
  return tf;
}

var doc = app.activeDocument;
var p = doc.pages[0];

var res = get_linklist(p);
if (res === null) {
  $.writeln(" :(");
} else {
  $.writeln(" :)");
}
Hallo Fabian, danke für den Beitrag. Ich habe einige Schwierigkeiten, dies in mein Skript zu integrieren - können Sie das näher erläutern?
Ich habe den Beitrag mit einem Beispielcode aktualisiert.
Der Schlüssel ist also, ein Objekt (allPageItems) zu durchlaufen, das die Textrahmen nicht verdeckt?
Genau, wenn sich der textFrame in der Gruppe befindet, ist er ein Kind der Gruppe und nicht über die textFrames-Sammlung zugänglich
Es klappt!! Vielen Dank. Wissen Sie noch, wie ich das Skript dazu bringen kann, doppelte Links nicht aufzulisten?
Stellen Sie eine neue Frage, damit wir die Themen nicht verwechseln. ;-)