hilfdirselbst.ch
Facebook Twitter gamper-media
Another Joe m
Beiträge: 8
3. Aug 2013, 21:37
Beitrag #1 von 8
Bewertung:
(2258 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Frage zur grep-Suche per Funktion in Verbindung mit app.open


Hallo zusammen,

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

Code
 
#target InDesign

//Ordner auswählen
var _verzeichnis = Folder.selectDialog();
var _alleDoks = _verzeichnis.getFiles("*.indd");
for (var l = 0; l < _alleDoks.length; l++) {
var _dok = app.open(_alleDoks[l], false);

//alle Tabellen
var _ta = _dok.stories.everyItem().tables.everyItem().getElements();


//Variablen
var _zeile = [];
var _tabelle = [];
var _zelle = 0;
//Der japanische Name (Unicode-Zeichen) für das Farbfeld ist \u8868
var _farbe = "\u8868";

//Tabellen nach Farbe prüfen; nur diese Tabellen finden
for (var k = 0; k < _ta.length; k++) {
if (_ta[k].cells[0].fillColor.name == _farbe) {
var _anzSpalten = _ta[k].columns;
var _anzZeilen = _ta[k].rows;

//Zellenverbindungen aufheben
_ta[k].cells.everyItem().unmerge();

//Zeilenumbruch durch #r ersetzen
Ersetzen("\\r", "#r", _ta[k]);


//Array füllen START
for (var i = 0 ; i < _anzZeilen.length; i++) {

//Sortierinfos hinzufügen
_zeile.push(_ta[k].parent.parentPage.name);
_zeile.push(k);
_zeile.push(i);

//Array füllen ZELLEN
for (var j = 0 ; j < _anzSpalten.length; j++) {
_zeile.push(_ta[k].cells[_zelle].contents);
_zelle = _zelle + 1;
}
_zeile = _zeile.join(";");
_tabelle.push(_zeile);
_zeile = [];
}
//Array füllen ABSTAND zur nächsten Tabelle
_zeile.push(_ta[k].parent.parentPage.name, k, i);
_zeile = _zeile.join(";");
_tabelle.push(_zeile);
_zeile = [];
_zelle = 0;
}
}

//TXT erstellen
var _dateiNeu = File("~/Desktop/tabelle.txt");

_dateiNeu.encoding = "UTF-8";

if (_dateiNeu.open("a")) {
for (var k = 0; k < _tabelle.length; k++) {
_dateiNeu.writeln(_tabelle[k]);
}
_dateiNeu.close();
} else {
alert("Keine Datei");
}

//INDD-Datei schließen OHNE zu speichern
_dok.close(SaveOptions.NO);

}

//Suchen-Ersetzen-Einstellungen zurücksetzen
app.findTextPreferences = NothingEnum.nothing;
app.changeTextPreferences = NothingEnum.nothing;

alert(_alleDoks.length + " Dokumente bearbeitet!");


function Ersetzen(_findWhat, _changeTo, _location) {

with (app.findChangeGrepOptions) {
caseSensitive = false;
wholeWord = false;
includeFootnotes = true;
includeHiddenLayers = true;
includeLockedLayersForFind = true;
includeLockedStoriesForFind = true;
includeMasterPages = false;
}
app.findGrepPreferences = NothingEnum.nothing;
app.changeGrepPreferences = NothingEnum.nothing;

app.findGrepPreferences.findWhat = _findWhat;
app.changeGrepPreferences.changeTo = _changeTo;

_location.findGrep();
_location.changeGrep();


}

Top
 
X
Another Joe m
Beiträge: 8
4. Aug 2013, 01:28
Beitrag #2 von 8
Beitrag ID: #515832
Bewertung:
(2217 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Frage zur grep-Suche per Funktion in Verbindung mit app.open


**UPDATE**

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.
als Antwort auf: [#515831] Top
 
WernerPerplies
Beiträge: 2201
4. Aug 2013, 08:59
Beitrag #3 von 8
Beitrag ID: #515834
Bewertung:
(2175 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Frage zur grep-Suche per Funktion in Verbindung mit app.open


Hallo Frank,

Zitat Falls noch jemand Verbesserungsvorschläge für das Skript hat, gerne her damit.


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:

Code
main() 

function main()
{
var quotient = dividiereDieseZwei(3,2);
if (quotient == null)
return ;
return alert (quotient) ;
/*string*/function dividiereDieseZwei(/*Num*/dividend,/*Num*/divisor)
{
try
{
var quotient = Dividend/divisor;
return quotient;
}
catch (error)
{
alert(error.message+"\n"+error.line);
}
return null;
}
}


So, das mal für den Anfang. ;-)

Einen schönen Tag wünscht

Werner Perplies
Auftragsprogrammierung und Skripte für Adobe InDesign
neu: WpsProjectHandler 15.06.2018, Version 1.75, neue Funktionen
Aktuelles
XING
als Antwort auf: [#515832] Top
 
Another Joe m
Beiträge: 8
4. Aug 2013, 14:45
Beitrag #4 von 8
Beitrag ID: #515843
Bewertung:
(2139 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Frage zur grep-Suche per Funktion in Verbindung mit app.open


Hallo Werner,

vielen lieben Dank für die Infos und Tipps.

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
als Antwort auf: [#515834] Top
 
WernerPerplies
Beiträge: 2201
4. Aug 2013, 14:57
Beitrag #5 von 8
Beitrag ID: #515845
Bewertung:
(2136 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Frage zur grep-Suche per Funktion in Verbindung mit app.open


Hallo Frank,

freut mich, dass Du mit meinen Tipps etwas anfangen konntest.

Noch etwas:

Fülle ein Array, wenn es auf Geschwindigkeit ankommt, so:

Code
var numberOfElements = 10000; 
var a = new Array(numberOfElements);
for (var i = 0; i<numberOfElements; i++)
a[i] = "v1: " + i.toString();
// statt
var b = new Array()
for (var i = 0; i<numberOfElements; i++)
b.push("v2: " + i.toString());

Viel Spaß noch

Einen schönen Tag wünscht

Werner Perplies
Auftragsprogrammierung und Skripte für Adobe InDesign
neu: WpsProjectHandler 15.06.2018, Version 1.75, neue Funktionen
Aktuelles
XING
als Antwort auf: [#515843] Top
 
Another Joe m
Beiträge: 8
4. Aug 2013, 22:23
Beitrag #6 von 8
Beitrag ID: #515853
Bewertung:
(2076 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Frage zur grep-Suche per Funktion in Verbindung mit app.open


Hallo Werner,

es geht bestimmt um Speicherverwaltung, oder?

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
als Antwort auf: [#515845] Top
 
WernerPerplies
Beiträge: 2201
5. Aug 2013, 06:18
Beitrag #7 von 8
Beitrag ID: #515860
Bewertung:
(2035 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Frage zur grep-Suche per Funktion in Verbindung mit app.open


Hallp Frank,

Zitat es geht bestimmt um Speicherverwaltung, oder?


Ja, während push den Speicherplatz für jede Elementadresse einzeln reserviert, wird bei der Größenzuweisung die Speicherreservierung auf einmal vorgenommen.

Zitat Werd mal ein wenig recherchieren...


Ich habe hier einige Quellen zusammengestellt:
Bücher und weitere Infos

Einen schönen Tag wünscht

Werner Perplies
Auftragsprogrammierung und Skripte für Adobe InDesign
neu: WpsProjectHandler 15.06.2018, Version 1.75, neue Funktionen
Aktuelles
XING
als Antwort auf: [#515853] Top
 
Another Joe m
Beiträge: 8
7. Aug 2013, 20:09
Beitrag #8 von 8
Beitrag ID: #515973
Bewertung:
(1956 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Frage zur grep-Suche per Funktion in Verbindung mit app.open


Nochmal ein kurzes Danke. Das Buch von Grant Gamble hört sich gut an (nebenbei lerne ich dann vermutlich auch viel über xml), wird bestellt!

Viele Grüße,
Frank
als Antwort auf: [#515860] Top
 
X