ich habe ein Script geschrieben, das auf allen Seiten im aktuellen Dokument bei allen Objekten mit dem Scriptetikett "Hintergrund" den Inhalt an Rahmen anpasst.
Unter InDesign CS4 hat es problemlos funktioniert.
Mit CS5.5 geht es nicht mehr. Im ExtendedScript Toolkit wird diese Zeile rot markiert:
In der Statuszeile unten steht nur "undefined ist kein Objekt".
Wo liegt der Fehler? Ich vermute, dass es am Auslesen der Seitenanzahl liegt. Aber wie kann ich das beheben?
liest sich als hättest Du das Script im ESTK ausgeführt und target war nicht InDesign. Wenn #target InDesign am Scriptanfang steht wird der Target automatisch gesetzt.
Ein Scriptetikett == label kannst Du nicht direkt ansprechen. Sicherlich ist 'name' (Name des Objektes in der Ebenenpalette) gemeint. Lieben Gruß
danke für eure Antworten. #target InDesign am Anfang hilft schonmal etwas, jetzt werden richtige Fehlermeldungen ausgegeben.
Das umschreiben der Bezeichnungen von Label zu Name funktioniert auch.
Mein Script zum Anpassen des Hintergrundes sieht jetzt so aus:
Dabei wird die Zeile
angemeckert, mit der Begründung: "Fehlerzeichenfolge: myPage.pageItems.ItemByName ist keine Funktion" Nur "name" statt "ItemByName" funktioniert auch nicht. Wie kann ich die Objekte mit dem Namen "Hintergrund" ansprechen?
klar, das i muss klein geschrieben werden... Allerdings wird es dann nur für ein Objekt auf einer Seite (merkwürdigerweise Seite 5 von 7) angewendet. (Vermutlich, weil das das erste Objekt in der Ebenenansicht ist.)
Ich habe es jetzt ganz anders gelöst, ohne alle Seiten manuell durchzulaufen:
wenn es auf einer Seite mehrere Objekte mit dem Namen 'Hintergrund' gibt, dann liefert Deine Code-Zeile meinObjekt = myPage.pageItems.itemByName("Hintergrund"); ein Array mit allen Objekten, die 'Hintergrund' heißen.
Statt eine Fehlermeldung auszugeben, pickt sich InDesign bei der Weiterverarbeitung vermutlich jeweils nur das erste Element heraus und lässt die anderen außen vor. Du solltest also beim Zugriff auf meinObjekt eine Schleife durch die Elemente des Arrays einrichten. Dann sollte es so gehen.
Die einfachere Lösung hast Du bereits selbst gefunden: sprich die Objekte nicht bei ihren Namen an, sondern frage jeweils den Inhalt des Skriptetiketts ab.
Viele Grüße Martin
(Dieser Beitrag wurde von Martin Fischer am 31. Mai 2012, 14:08 geändert)
das kommt davon, dass man blind was behauptet und dieser Behauptung ungeprüft Glauben schenkt, weil sie eine so einfache Erklärung böte ...
Du hast leider recht. Das bestätigt auch ein Blick auf die Belegung der Variable meinObjekt im Objektbrowser des ESTK. Und darüber bin ich leicht entsetzt.
Denn dann eignet sich die 'schnelle' itemByName-Methode zur Ermittlung von mehreren Seitenobjekten auf einer Seite wohl nicht mehr. Dann ist es besser, man prüft alle Seitenobjekte in einer Schleife auf ein bestimmtes Kriterium (name oder label) und filtert so die gesuchten Seitenobjekte für sich heraus.
Offen gesagt enttäuscht mich die in CS5 eingeführte name-property damit noch mehr als sie es getan hat, nachdem ich seinerzeit feststellen musste, dass mir damit eine ebenso einfache wie schnelle, zur Gewohnheit gewordene Methode zur Adressierung bestimmter – per Skriptetikett mit Namen versehener – Seitenobjekte genommen wurde.
Vielleicht finden sich gelegentlich aber auch noch Vorteile dieser name-Property.
Viele Grüße Martin
(Dieser Beitrag wurde von Martin Fischer am 31. Mai 2012, 15:24 geändert)
Also ... darüber war ich schwer entsetzt gewesen, als ich dieses Elend entdeckt hatte.
Mit CS2 konnte man mit ...
... einen Array der Textrahmen bekommen, welche mit "rubrique" gelabelt waren. Dann eine Schleife durch diese Liste, um jedem Element den entsprechenden deutschen Inhalt zuzuweisen.
Ein anderes Beispiel. Ein Script erzeugt die schwarzen Quadrate eines Kreuzworträtsels überall dort wo ein Dollar-Zeichen (statt eines Buchstabens) steht. Damit diese Rahmen bei einem erneuten Start des Scripts abgeräumt werden, sind sie mit "black_frame" benannt. Zum Entfernen aller Rahmen genügte der Befehl:
Ab CS5 müssen die schwarzen Quadrate einzeln begrüsst und entfernt werden.
Na, wenn zwei ausgesprochen kompetente Scripter extrem entsetzt sind, werde ich ja schon neugierig.
Erster Versuch: könnte man nicht stattdessen itemByRange nehmen? Antwort: Im Prinzip ja, aber da dürfen auch keine gleichnamigen Objekte vorkommen. Genauer: von den gleichnamigen wird nur das erste gefunden. Was ginge, wenn die entsprechenden Objekte Script-erzeugt sind: einen Namen mit Timestamp erzeugen. Man hat dann also nicht Objekte "rubrique" sondern "rubrique123456789". Aber das ist nicht ansatzweise hübsch genug, um den Ansatz hier weiter zu verfolgen. Trotzdem sinnvoll zu wissen, dass xxx.itemByRange("frame1", "frame999") wie gehabt tausend Objekte greift, unter der Voraussetzung, dass "frame1" und "frame999" tatsächlich vorhanden sind.
Zweite Frage: Ist es wirklich so punishing (Gibt es da ein vernünftiges deutsches Wort für?), wenn man seine eigene itemsByLabel Funktion schreibt?
Skizze zum selber weiterschreiben:
Die Funktion "pageItemsByLabel" ist eine Studie in "Wie man es nicht machen sollte".
Die Funktion "manyPageItemsByLabel" hingegen liefert mir bei einem Dokument mit rund 2000 pageItems, von denen jedes zweite das gewünschte Label hat, ein Array in weniger als zwei Zehntel Sekunden zurück.
nachdem ich bei meinen Hyperlink-Lösungen gerne den Durchsatz etwas steigern würde, war ich über Ihren Lösungsansatz ganz begeistert und habe Ihr Beispiel auf hyperlinkPageItemSources übertragen.
Meine beiden Routinen sehen so aus:
Die ursprüngliche Lösung:
Die von nach Ihrem Vorschlag modifizierte Lösung:
Der Geschwindigkeitsunterschied ist gewaltig, nur leider ganz anders als von mir erwartet:
Bei 232 Aufrufen benötigt die zweite Lösung die sechzigfache Zeit!
Dabei fällt mir auf, dass der Vorgang vermutlich, warum auch immer, sehr speicherintensiv zu sein scheint, weil einige Durchgänge recht schnell ablaufen, dann eine längere Pause eintritt (garbage collector?) und danach geht es wieder für einige Durchläufe recht schnell ....
Bei der ersten Routine laufen die Aufrufe ganz gleichmäßig ab.