mein erster Post :) Vorab vielen Dank für eure Hilfe!
Ich habe das wunderbare Buch von Gregor Fellenz gelesen und bin nun dabei, erste Skripte zu schreiben. Klappt soweit ganz gut, aber jetzt stehe ich auf dem Schlauch. Vielleicht kann mir jemand helfen.
Mein Skript soll ein InDesign-Dokument nach bestimmten Tabellen absuchen und die Inhalte der Tabellen in eine txt/csv-Datei schreiben. Dabei ist wichtig, dass das Layout der jeweiligen Tabelle übernommen wird, sodass die Tabelle im Excel genauso strukturiert ist, wie im InDesign.
Das habe ich auch soweit hinbekommen (allerdings würde es mich nebenbei brennend interessieren, welche Schritte man auch einfacher machen könnte bzw. wo sich das Skript optimieren lässt).
Eine Sache klappt aber nicht: Vor dem Schreiben ins Array tausche ich jeden Umbruch (\r), der in einer Zelle vorkommt, durch ein Codezeichen aus (#r), damit das Layout im Excel erhalten bleibt. Das funktioniert tadellos, solange ich "app.activeDocument" anspreche. Da das Skript aber einen ganzen Ordner bearbeiten soll, wird "app.activeDocument" durch "app.open" ersetzt. Komischerweise klappt die grep-Abfrage nun aber nicht mehr.
Das meiste von dem folgenden Skript ist für das Problem unerheblich, ich poste es aber trotzdem mal komplett, falls jemand Lust hat, nach Optimierungen zu schauen. Die vermutlichen Problemzeilen habe ich rot markiert.
Danke im voraus, Frank
Frage zur grep-Suche per Funktion in Verbindung mit app.open
Es lag wohl daran, dass die Ebenen mit den Tabellen nicht sichtbar/gesperrt waren. Das Skript hat zwar die \r gefunden, konnte sie aber nicht ersetzen.
Was mich nur wundert ist, dass das bei der Version mit "app.activeDocument" geklappt hatte. Aber vielleicht habe ich beim Test geschlafen und die Ebene war gar nicht gesperrt...
Falls noch jemand Verbesserungsvorschläge für das Skript hat, gerne her damit.
Gute Nacht.
Frage zur grep-Suche per Funktion in Verbindung mit app.open
Darüber, was eine Verbesserung ist, lässt sich trefflich streiten.
Deshalb meine Vorschläge:
Variablenbenennung:
1. Unterstriche machen Skripte m. E. schwerer lesbar. Ich verwende deshalb lieber die CamelCase-Schreibweise. Variablen beginne ich mit einem kleinen Buchstaben, selbst definierte Objekte mit einem Großbuchstaben, Konstanten schreibe ich komplett groß. Da JavaScript dynamisch typisiert ist, verwenden einige Anwender ein Prefix, um Hinweise auf den verwendeten Datentyp zu geben: --> var iEins = 1; -> Integer; fZahl -> float.
2. Beschäftige Dich mit der Sichtbarkeit von Variablen, z. B.:
Definition: vorName = "Werner" <-> var vorName = "Werner";
Begrenzung der Sichtbarkeit: Bei Dir sind alle Variablen außerhalb der definierten Funktion global sichtbar! Das kann recht unangenehme Folgen haben. Probiere folgendes aus: erzeuge mal dieses einfache Skript im ESTK var eins = "eins"; erzeuge ein zweites Skript: alert(eins);
Und jetzt probere mal dies: Ändere das erste Skript so:
main()
function main() { var eins = "zwei" }
Und rufe jetzt das zweite Skript auf.
Siehst Du den Unterschied?
Verwende maximal eine globale Variable:
var gObject = {}; Definiere weitere Variablen als Eigenschaft dieses Objektes: gObject.startTime = Date():
Breche Deinen Code in möglichst kleine logische Einheiten herunter und verwende für diese Einheiten Funktionen. Das macht Dein Problem lesbarer, die Fehlersuche einfacher und Du kannst die Funktionen mehrfach nutzen.
Ich packe z. B. Schleifen gerne in Funktionen. da gibt es wenig Ärger mit den Variablen in geschachtelten Schleifen.
Betreibe ein intensives Fehlerhandling, in dem Du Funktionen in der Regel in ein try ... catch packst:
Stimmt, über die Gültigkeit von Variablen habe ich noch gar nicht nachgedacht. Wusste gar nicht, dass sie sogar nach Ablauf des Skripts noch bestehen bleiben...
Variablen in ein Objekt à la "gObject.startTime" ist mir gänzlich neu. Jetzt weiß ich auch, was es mit dieser Schreibweise in anderen Skripts zu tun hat ,-)
Den Tipp mit dem Auslagern von Schleifen in Funktionen werde ich beherzigen, ebenso wie die try...catch-Anweisung.
Tja, bin noch an der Spitze des Eisbergs, aber es macht total Spaß. Vielen Dank nochmal.
Grüße, Frank
Frage zur grep-Suche per Funktion in Verbindung mit app.open
Hm, mit der vierten Codezeile hinter dem = kann ich noch nicht viel anfangen. Ich kannte die "to.String()"-Methode bisher noch nicht. Werd mal ein wenig recherchieren...
Aber genau diese Tipps sind klasse, wenn ich Hinweise auf alternative/effektivere Methoden etc. bekomme. Super!
Viele Grüße, Frank
Frage zur grep-Suche per Funktion in Verbindung mit app.open
Ja, während push den Speicherplatz für jede Elementadresse einzeln reserviert, wird bei der Größenzuweisung die Speicherreservierung auf einmal vorgenommen.