[GastForen Programme Print/Bildbearbeitung Adobe InDesign Skriptwerkstatt Tabelle: Spaltenbreiten auf alle Tabellen anwenden

  • Suche
  • Hilfe
  • Lesezeichen
  • Benutzerliste
Print/Bildbearbeitung - Photos, Layout, Design
Themen
Beiträge
Moderatoren
Letzter Beitrag

Tabelle: Spaltenbreiten auf alle Tabellen anwenden

Bearny
Beiträge gesamt: 6

21. Mär 2012, 17:21
Beitrag # 1 von 7
Bewertung:
(6218 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo zusammen,

ich habe folgende zwei Scipte, mit dem Ersten liest man die Spaltenbreiten einer Tabelle ein, welche dann in einem Textfile gesichert werden:

Code
//DESCRIPTION: Nach Markierung einer kompletten Tabelle werden die Spaltenbreiten ermittelt und in eine txt-Datei geschrieben. Autor: Karsten Geisler; Kommentare erbeten! design@karsten-geisler.de 

var dieSelektion = app.selection[0];
dieSelektion;

if (dieSelektion == undefined || dieSelektion.constructor.name != 'Table' ) {
alert('Keine Tabelle ausgewählt\rBitte wählen Sie mit dem Textwerkzeug eine komplette Tabelle aus und starten das Script erneut.');
exit();
}
else if ( dieSelektion.constructor.name == 'Table') {

var anzahlKolumnen = dieSelektion.columns.count();
var kolumnennummer = 0;
var kolumnenbreite = dieSelektion.columns[kolumnennummer].width;
var aSpaltenbreiten = new Array ();

for ( kolumnennummer = 0; kolumnennummer < anzahlKolumnen; kolumnennummer ++ ) {
aSpaltenbreiten.push(dieSelektion.columns[kolumnennummer].width);
}
var anzahlArrayElemente = aSpaltenbreiten.length;
alert ('Mitteilung\rDie markierte Tabelle hat ' + anzahlArrayElemente + ' Spalten. Bitte wählen Sie eine andere Tabelle aus und starten das Sciript »TabellenSpaltenbreiten_B_Einfuegen.jsx«');
}

//Arraydaten werden in eine neue Textdatei geschrieben
var dasIDDokument = app.documents[0];
var derDokPfad = dasIDDokument.filePath + "/" + dasIDDokument.name.split(".indd")[0] + '.txt';
var dasTextDok = new File (derDokPfad);
dasTextDok.open('w', "TEXT", "R*ch");
dasTextDok.writeln(aSpaltenbreiten);



Mit dem Zweiten kann man dann diese Spaltenbreiten auf eine andere Tabelle übertragen:

Code
//DESCRIPTION: Die Spaltenbreiten werden aus der txt-Datei gelesen und auf eine zweite Tabelle angewendet. Autor: Karsten Geisler; Kommentare erbeten! design@karsten-geisler.de 

//Auslesen der Daten aus dem Textdokument
var dasIDDokument = app.documents[0];

var derDokPfad = dasIDDokument.filePath + "/" + dasIDDokument.name.split(".indd")[0] + '.txt';

var dasTextDok = File (derDokPfad);
dasTextDok.open();
var kolumnenBreiten = dasTextDok.read();

var akolumnenBreitenListe = kolumnenBreiten.split(",");
var kolumnenAnzahlTabelle1 = akolumnenBreitenListe.length;
var dieTabelle2 = app.selection[0];

if (dieTabelle2 == undefined || dieTabelle2.constructor.name != 'Table' ) {
alert('Keine Tabelle ausgewählt\rBitte wählen Sie mit dem Textwerkzeug eine Tabelle aus und starten das Script erneut.');
exit();
}

else if ( dieTabelle2.constructor.name == 'Table') {

var anzahlKolumnen = dieTabelle2.columns.count();
var kolumnenAnzahlMin = Math.min(kolumnenAnzahlTabelle1,anzahlKolumnen)

if (kolumnenAnzahlTabelle1 < anzahlKolumnen) {
alert('Spaltenanzahl stimmt nicht überein\rSie haben nun eine Tabelle gewählt, die mehr Spalten als die zuvor gewählte Tabelle hat. Es werden links nur die ersten ' + kolumnenAnzahlTabelle1 + ' Spaltenbreiten geändert.');
}
else if (kolumnenAnzahlTabelle1 > anzahlKolumnen) {
alert('Spaltenanzahl stimmt nicht überein\rSie haben nun eine Tabelle gewählt, die weniger Spalten als die zuvor gewählte Tabelle hat. Statt ' + kolumnenAnzahlTabelle1 + ' werden ' + anzahlKolumnen + ' in der Breite geändert.');
}

var kolumnennummer = 0;

for (kolumnennummer = 0; kolumnennummer < kolumnenAnzahlMin; kolumnennummer ++ ) {
var breiteAktuelleKolumne = akolumnenBreitenListe[kolumnennummer];
dieTabelle2.columns[kolumnennummer].width = akolumnenBreitenListe[kolumnennummer]*1;
}
}

dasTextDok.close();



Mein Problem dabei ist, das ich in einem Dokument ca. 200 Tabellen hab, die ich damit einzelnt anpassen muss. Vielleicht findet jemand eine Möglichkeit, das Zweite-Scipt so zu verändern, dass es auf alle Tabellen automatisch angewendet wird.

MfG
Bearny
X

Tabelle: Spaltenbreiten auf alle Tabellen anwenden

Karsten Geisler
Beiträge gesamt:

22. Mär 2012, 10:53
Beitrag # 2 von 7
Beitrag ID: #492243
Bewertung:
(6168 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Moin Bearny!

Hättest mich auch direkt fragen können ;-)

Egal: sollte kein Problem sein, die ausgelesenen Spaltenbreiten auf alle Tabellen anzuwenden. Frage wäre: geht es wirklich um ausnahmslos alle Tabellen eines Dokuments? Und haben die Tabellen alle die selbe Spaltenanzahl? Oder könnte es z.B. Sinn machen, nur Tabellen anzusprechen, denen ein bestimmtes Tabellenformat zugewiesen wurde?

Viele Grüße
Karsten


als Antwort auf: [#492193]

Tabelle: Spaltenbreiten auf alle Tabellen anwenden

Bearny
Beiträge gesamt: 6

22. Mär 2012, 13:05
Beitrag # 3 von 7
Beitrag ID: #492253
Bewertung:
(6145 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Servus Karsten,

sorry, das nächstes Mal wende ich mich gleich an dich!

Antwort auf: Frage wäre: geht es wirklich um ausnahmslos alle Tabellen eines Dokuments? Und haben die Tabellen alle die selbe Spaltenanzahl? Oder könnte es z.B. Sinn machen, nur Tabellen anzusprechen, denen ein bestimmtes Tabellenformat zugewiesen wurde?


Es würde mir schon viel helfen, wenn es auf alle Tabellen angewendet werden kann! Wenn es aber die Möglichkeit gibt, dieses nur auf ein bestimmtes Tabellenformat anzuwenden, wäre das noch besser.

Vielen Dank schonmal!

MfG
Bearny


als Antwort auf: [#492243]

Tabelle: Spaltenbreiten auf alle Tabellen anwenden

Karsten Geisler
Beiträge gesamt:

22. Mär 2012, 22:30
Beitrag # 4 von 7
Beitrag ID: #492283
Bewertung:
(6106 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Bearny!

Probier mal statt des bisherigen zweiten Skripts dieses hier. Du brauchst nur die drei XXX in der sechsten Zeile des Skripts durch den Namen des Tabellenformats ersetzen, bei dem das Skript greifen soll. Alle anderen Tabellen bleiben dann unberührt.

Code
//DESCRIPTION: Die Spaltenbreiten werden aus der txt-Datei gelesen und alle Tabellen, die mit einem bestimmten Tabellenformat formatiert wurden, angewendet. Autor: Karsten Geisler; Kommentare erbeten! design@karsten-geisler.de 
//2012-03-22
#target InDesign

//Auslesen der Daten aus dem Textdokument
var tabellenFormat = "XXX";
var dasIDDokument = app.activeDocument;

var derDokPfad = dasIDDokument.filePath + "/" + dasIDDokument.name.split(".indd")[0] + '.txt';

var alleObjekte = dasIDDokument.stories.everyItem().getElements();

var dasTextDok = File (derDokPfad);
dasTextDok.open();
var kolumnenBreiten = dasTextDok.read();

var akolumnenBreitenListe = kolumnenBreiten.split(",");
var kolumnenAnzahlTabelle1 = akolumnenBreitenListe.length;


for (var i = 0; i < alleObjekte.length; i++) {
for (var k = 0; k < alleObjekte[i].tables.length; k++) {
if (alleObjekte[i].tables[k].appliedTableStyle.name == tabellenFormat) {
var dieseTabelle = alleObjekte[i].tables[k];

var anzahlKolumnen = dieseTabelle.columns.count();
var kolumnenAnzahlMin = Math.min(kolumnenAnzahlTabelle1,anzahlKolumnen)

if (kolumnenAnzahlTabelle1 < anzahlKolumnen) {
alert('Spaltenanzahl stimmt nicht überein\rSie haben nun eine Tabelle gewählt, die mehr Spalten als die zuvor gewählte Tabelle hat. Es werden links nur die ersten ' + kolumnenAnzahlTabelle1 + ' Spaltenbreiten geändert.');
}
else if (kolumnenAnzahlTabelle1 > anzahlKolumnen) {
alert('Spaltenanzahl stimmt nicht überein\rSie haben nun eine Tabelle gewählt, die weniger Spalten als die zuvor gewählte Tabelle hat. Statt ' + kolumnenAnzahlTabelle1 + ' werden ' + anzahlKolumnen + ' in der Breite geändert.');
}

var kolumnennummer = 0;

for (kolumnennummer = 0; kolumnennummer < kolumnenAnzahlMin; kolumnennummer ++ ) {
var breiteAktuelleKolumne = akolumnenBreitenListe[kolumnennummer];
dieseTabelle.columns[kolumnennummer].width = akolumnenBreitenListe[kolumnennummer]*1;
}
}
}
}

dasTextDok.close();


Bin gespannt!
Viele Grüße
Karsten


als Antwort auf: [#492253]

Tabelle: Spaltenbreiten auf alle Tabellen anwenden

Karsten Geisler
Beiträge gesamt:

30. Mär 2012, 18:01
Beitrag # 5 von 7
Beitrag ID: #492780
Bewertung:
(5992 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Ich habe mich noch mal an die oben geposteten Skripte gemacht und aus den ursprünglich zweien ein Skript gemacht.

Das Vorgehen für das folgende Skript sieht so aus, dass
– erst eine Tabelle markiert wird, aus der die Spaltenbreiten übernommen werden sollen
– dann Skript laufen lassen
– und dabei das Tabellenformat wählen, auf das dokumentweit die Spaltenbreiten aus der ersten Tabelle angewendet werden sollen (Tabellen, die nicht mit dem gewählten Tabellenformat formatiert wurden, bleiben vom Skript unberührt)

Code
//DESCRIPTION: Spaltenbreiten werden von einer markierten Tabelle ausgelesen und auf alle Tabellen, die mit einem bestimmten Tabellenformat formatiert wurden, angewendet. Autor: Karsten Geisler; Kommentare erbeten! design@karsten-geisler.de 
//2012-03-30
#target InDesign

var dasIDDokument = app.activeDocument;
var alleObjekte = dasIDDokument.stories.everyItem().getElements();
var dieSelektion = app.selection[0];

//Spaltenbreiten der gewählten Tabellen werden in die Variable aSpaltenbreiten geschrieben
if (dieSelektion == undefined || dieSelektion.constructor.name != 'Table' ) {
alert('Keine Tabelle ausgewählt\rBitte mit dem Textwerkzeug eine komplette Tabelle auswählen und das Script erneut starten.');
exit();
}
else if ( dieSelektion.constructor.name == 'Table') {
var anzahlKolumnenTab1 = dieSelektion.columns.count();
var kolumnennummerTab1= 0;
var aSpaltenbreitenTab1 = new Array ();
for (var kolumnennummerTab1 = 0; kolumnennummerTab1 < anzahlKolumnenTab1; kolumnennummerTab1 ++ ) {
aSpaltenbreitenTab1.push(dieSelektion.columns[kolumnennummerTab1].width);
}
}

//Dialog, damit User das gewünschte Tabellenformat auswählen kann, auf das die augenommenen Spaltenbreiten angewendet werden
app.scriptPreferences.userInteractionLevel = UserInteractionLevels.INTERACT_WITH_ALL;
var dialog = app.dialogs.add();
dialog.name = "Tabellenformat der Auswahl zuweisen";
var dialogCol = dialog.dialogColumns.add();
var dialogText = dialogCol.staticTexts.add();
dialogText = "Wählen Sie ein Tabellenformat aus:";
var dropDownListe = dialogCol.dropdowns.add();
dropDownListe.stringList = app.activeDocument.tableStyles.everyItem().name;
var zeigeDialog = dialog.show();
if (zeigeDialog && dropDownListe.selectedIndex > -1 && app.selection.length == 1) {
var ausgewaehltesTabellenFormat = app.activeDocument.tableStyles[dropDownListe.selectedIndex].name;
}
dialog.destroy();

//Spaltenbreiten werden übertragen
for (var i = 0; i < alleObjekte.length; i++) {
for (var k = 0; k < alleObjekte[i].tables.length; k++) {
if (alleObjekte[i].tables[k].appliedTableStyle.name == ausgewaehltesTabellenFormat) {
var tab2 = alleObjekte[i].tables[k];
var anzahlKolumnenTab2 = tab2.columns.count();
var kolumnenAnzahlMin = Math.min(anzahlKolumnenTab1,anzahlKolumnenTab2) ;
var kolumnennummer = 0;
for (kolumnennummer = 0; kolumnennummer < kolumnenAnzahlMin; kolumnennummer ++ ) {
tab2.columns[kolumnennummer].width = aSpaltenbreitenTab1[kolumnennummer]*1;
}
}
}
}


Viele Grüße
Karsten

PS: 1000 Dank an Gregor für sein super Buch ;-)


als Antwort auf: [#492283]

Tabelle: Spaltenbreiten auf alle Tabellen anwenden

barsch1969
Beiträge gesamt: 52

31. Mär 2012, 18:01
Beitrag # 6 von 7
Beitrag ID: #492808
Bewertung:
(5935 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Grandioses Skript!


als Antwort auf: [#492780]

Tabelle: Spaltenbreiten auf alle Tabellen anwenden

Karsten Geisler
Beiträge gesamt:

31. Mär 2012, 18:24
Beitrag # 7 von 7
Beitrag ID: #492810
Bewertung:
(5927 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hi barsch1969!

Freut mich, wenn’s gefällt ;-)

Viele Grüße
Karsten


als Antwort auf: [#492808]
X