[GastForen Programme Print/Bildbearbeitung Adobe InDesign Skriptwerkstatt INDesign Script für Datenzusammenführung

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

INDesign Script für Datenzusammenführung

Bonsai
Beiträge gesamt: 98

12. Jun 2013, 14:47
Beitrag # 1 von 13
Bewertung:
(14732 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo,

bin auf der Suche nach einem Script zur automatisierten Datenzusammenführung in InDesign CS6.
Grundkonfiguration:
- Master-Dokument mit csv-Anbindung (variable Platzhalter-Texte)
- Dokument besteht aus 4 Seiten

Was soll das Script leisten können?
- Über Datenzusammenführung pro Excel/csv-Zeile ein neues InDesign-Dokument erstellen
- Dokument in vorgegebenen Folder abspeichern
- Dateibenamung anhand einer variable, die in Excel definiert ist und als variabler Text eingelesen wird.
Beispiel:
Excel-Spalte--> B --> 08154711
InDesign-Dateiname --> 08154711.indd

Gibt's sowas? Kann mir da jemand weiterhelfen?

Vielen Dank
X

INDesign Script für Datenzusammenführung

WernerPerplies
Beiträge gesamt: 2760

12. Jun 2013, 15:11
Beitrag # 2 von 13
Beitrag ID: #513776
Bewertung:
(14715 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Bonsai,

Zitat Gibt's sowas?


Ich weiß es nicht.

Zitat Kann mir da jemand weiterhelfen?


Ja, gerne. Bei Interesse mache ich Ihnen gerne ein Angebot.


als Antwort auf: [#513775]

INDesign Script für Datenzusammenführung

-hans-
Beiträge gesamt: 748

12. Jun 2013, 18:25
Beitrag # 3 von 13
Beitrag ID: #513791
Bewertung: ||
(14662 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Wie der Dateiname ermittelt werden soll ist nicht präzise formuliert (oder ich hab's nur nicht verstanden ;-) )

Ansonsten sollte es so gehen:
Code
var destFolderPath = Folder.selectDialog('DestFolder').absoluteURI + '/' 

var currDoc = app.activeDocument;//vorbereitetes Dokument
currDoc.dataMergeOptions.createNewDocument = true;

var maxRange = currDoc.dataMergeProperties.dataMergePreferences.recordRange.split('-')[1];//Anzahl der Datensätze in der CSV
//schleife durch die Datensätze
for(var i = 0; i < maxRange; i++)
{
with(currDoc.dataMergeProperties.dataMergePreferences)
{
recordSelection = RecordSelection.ONE_RECORD;
recordNumber = i+1;
}

currDoc.dataMergeProperties.mergeRecords();
app.activeDocument.save(File(destFolderPath +(i+1) + '.indd'));
app.activeDocument.close();
}


ohne Gewähr.


als Antwort auf: [#513775]

INDesign Script für Datenzusammenführung

Bonsai
Beiträge gesamt: 98

13. Jun 2013, 06:55
Beitrag # 4 von 13
Beitrag ID: #513797
Bewertung:
(14604 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Herr Claßen,

der Dateiname steht als Wert in jeder CSV-Zeile.
Bspw. Spalte A, Datensatz 1 = 08154711
Dokumentname: 08154711.indd

spw. Spalte A, Datensatz 2 = 012345
Dokumentname: 012345.indd

Viele Grüße


als Antwort auf: [#513791]

INDesign Script für Datenzusammenführung

-hans-
Beiträge gesamt: 748

13. Jun 2013, 11:08
Beitrag # 5 von 13
Beitrag ID: #513807
Bewertung:
(14554 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hi,

bitte die Spaltennummer in der der Dateiname in der CSV-Datei steht im Script eintragen, ebenso den Separator, der verwendet wird.

Ohne Originaldaten schwieritsch dass alles :)

Startpunkt ist eine geöffnete, für die Datenzusammenführung vorbereitete, Indesigndatei ...

Code
var fileNameColumn = 1;//Bitte hier die Spaltennummer eintragen, in der in der CSV der neue Dateiname hinterlegt ist. 
var csvSeparator = ','//Bitte hier den Separator der CSV-Datei eintragen

var destFolderPath = Folder.selectDialog('Zielordner wählen').absoluteURI + '/' ;
var csvFile = File.openDialog('CSV-Datei wählen');

//csv einlesen
var fileNames = new Array();
csvFile.open('r');
while (!csvFile.eof) {
fileNames.push(csvFile.readln().split(csvSeparator)[fileNameColumn-1]);
}
csvFile.close();


var currDoc = app.activeDocument;//vorbereitetes Dokument
currDoc.dataMergeOptions.createNewDocument = true;

var maxRange = currDoc.dataMergeProperties.dataMergePreferences.recordRange.split('-')[1];//Anzahl der Datensätze in der CSV
//schleife durch die Datensätze
for(var i = 0; i < maxRange; i++)
{
with(currDoc.dataMergeProperties.dataMergePreferences)
{
recordSelection = RecordSelection.ONE_RECORD;
recordNumber = i+1;
}

currDoc.dataMergeProperties.mergeRecords();
app.activeDocument.save(File(destFolderPath +fileNames[i+1] + '.indd'));
app.activeDocument.close();
}



als Antwort auf: [#513797]

INDesign Script für Datenzusammenführung

OnkelAndi
Beiträge gesamt: 4

20. Jul 2014, 17:48
Beitrag # 6 von 13
Beitrag ID: #529976
Bewertung:
(13371 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hans,

die folgende Schleife habe ich auch verwendet:
Code
var maxRange =  currDoc.dataMergeProperties.dataMergePreferences.recordRange.split('-')[1];//Anzahl der Datensätze in der CSV   
//schleife durch die Datensätze
for(var i = 0; i < maxRange; i++)
{
with(currDoc.dataMergeProperties.dataMergePreferences)
{
recordSelection = RecordSelection.ONE_RECORD;
recordNumber = i+1;
}

currDoc.dataMergeProperties.mergeRecords();
app.activeDocument.save(File(destFolderPath +fileNames[i+1] + '.indd'));
app.activeDocument.close();
}


Kennt jemand eine Lösung, um die Variable "i" und "maxRange" per Eingabe-Dialog zu ändern ?
Sprich, kann man aus der txt-Datei auch einen bestimmten Datensatz wählen? Ok, ich könnte die Excelliste filtern und ausgeben, aber das wäre nur eine Alternative.

Über Feedback freue ich mich.
Danke!


als Antwort auf: [#513807]

INDesign Script für Datenzusammenführung

OnkelAndi
Beiträge gesamt: 4

20. Jul 2014, 19:04
Beitrag # 7 von 13
Beitrag ID: #529978
Bewertung:
(13330 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hier mal mein Lösungsansatz:

Code
//EINGABE-DIALOG 
with(myDialog = app.dialogs.add({name:"DATENSÄTZE für AUSGABE", canCancel: true})){
with(dialogColumns.add()){
with(dialogRows.add()){
staticTexts.add({staticLabel:"Bitte wählen:"});
}
var myRangeButtons = radiobuttonGroups.add();
with(myRangeButtons){
radiobuttonControls.add({staticLabel:"Alle Datensätze ausgeben !", checkedState:true});
radiobuttonControls.add({staticLabel:"Folgende Datensätze ausgeben: "});
}
with(dialogRows.add()){
staticTexts.add({staticLabel:"von - bis: "});
var DatenSTART = realEditboxes.add();
var DatenENDE = realEditboxes.add();
}
}
var myResult = myDialog.show();
if(myResult == true){
var myAuswahl = myRangeButtons.selectedButton +1;
DatenSTART;
DatenENDE;
}
else{
myDialog.destroy();
}
}
//Variablen aus DIALOG
if (myAuswahl == [1]){
var maxRange = curDoc.dataMergeProperties.dataMergePreferences.recordRange.split('-')[1]; //Anzahl der Datensätze in der CSV
var i = 0;
}
if (myAuswahl == [2]){
var maxRange = DatenENDE; //Anzahl der Datensätze in der CSV
var i = DatenSTART;
}
//schleife durch die Datensätze
for(i; i < maxRange; i++){
with(curDoc.dataMergeProperties.dataMergePreferences){
recordSelection = RecordSelection.ONE_RECORD;
recordNumber = i+1;}

curDoc.dataMergeProperties.mergeRecords();
app.activeDocument.save(File(destFolderPath + fileNames[i+1] + '.indd'));


Hat jemand eine funktionierende Idee oder erkennt den Fehler?


als Antwort auf: [#529976]

INDesign Script für Datenzusammenführung

Hans Haesler
  
Beiträge gesamt: 5826

21. Jul 2014, 08:24
Beitrag # 8 von 13
Beitrag ID: #529982
Bewertung:
(13253 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo OnkelAndi,

herzlich willkommen in der Skriptwerkstatt auf HDS! :-)

Es hat mehr als einen Fehler ...

Für die öffnende Klammer von Zeile 38 hat es keine schliessende. Wenn diese eingefügt ist, dann wird der Dialog gezeigt.

Jetzt vor der Schleife am Schluss diese beiden Zeilen einfügen:

Code
alert (i); 
exit();

Dann im Dialog den zweiten Radiobutton wählen, im "von"-Eingabefeld eine Zahl tippen und "OK" klicken.

Das Ergebnis: Der Alert zeigt "[object RealEditbox]". Weil der Startwert für 'i' nicht zugewiesen wurde.

Das kann so geschehen:

Code
var startVal = DatenSTART.editContents*1; 

Anstelle des nackten 'i' wird eine Variable verwendet. Mit dem 'i' alleine würde es auch funktionieren. Wäre aber ungewöhnlich.
Das '*1' am Ende der Zeile wandelt den String in eine Zahl um.

Der Abschnitt "Variablen aus dem Dialog" kann weiter hinauf verschoben werden. Die Zeile 'myDialog.destroy()' muss ebenfalls eingefügt werden. Und für den Fall, dass der Anwender "Abbrechen" klickt, ein 'exit()', um die Ausführuung abzubrechen.

Hier mal eine korrigierte Version:

Code
var curDoc = app.documents[0]; 

// EINGABE-DIALOG
with (myDialog = app.dialogs.add({name:"DATENSÄTZE für AUSGABE", canCancel: true})) {
with (dialogColumns.add()) {
with (dialogRows.add()) {
staticTexts.add({staticLabel:"Bitte wählen:"});
}
var myRangeButtons = radiobuttonGroups.add();
with (myRangeButtons) {
radiobuttonControls.add({staticLabel:"Alle Datensätze ausgeben!", checkedState:true});
radiobuttonControls.add({staticLabel:"Folgende Datensätze ausgeben: "});
}
with (dialogRows.add()) {
staticTexts.add({staticLabel:"von - bis: "});
var DatenSTART = realEditboxes.add();
var DatenENDE = realEditboxes.add();
}
}
var myResult = myDialog.show();
if (myResult == true) {
var myAuswahl = myRangeButtons.selectedButton+1;
// Variablen aus DIALOG
if (myAuswahl == 1){
var startVal = 0;
var maxRange = curDoc.dataMergeProperties.dataMergePreferences.recordRange.split('-')[1]; //Anzahl der Datensätze in der CSV
}
if (myAuswahl == 2){
var startVal = DatenSTART.editContents*1;
var maxRange = DatenENDE.editContents*1; //Anzahl der Datensätze in der CSV
}
myDialog.destroy();
}
else {
myDialog.destroy();
exit();
}
}

// Schleife durch die Datensätze
for (i = startVal; i < maxRange; i++) {
with (curDoc.dataMergeProperties.dataMergePreferences) {
recordSelection = RecordSelection.ONE_RECORD;
recordNumber = i+1;
}
}

curDoc.dataMergeProperties.mergeRecords();
curDoc.save(File(destFolderPath + fileNames[i+1] + '.indd'));

Ob die Schleife durch die Datensätze und das Zusammenführen funktionieren, habe ich nicht getestet.

Gruss, Hans


als Antwort auf: [#529978]

INDesign Script für Datenzusammenführung

OnkelAndi
Beiträge gesamt: 4

21. Jul 2014, 12:01
Beitrag # 9 von 13
Beitrag ID: #530001
Bewertung:
(13208 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hans,

vielen Dank für die schnelle Reaktion und Hilfe.
Die schließende Klammer hatte ich vergessen.
Da das SCript noch einige andere Aufgaben innerhalb der Schleife ausführt.

Deine korrigierte Version habe ich eingebaut und sie funktioniert genauso, wie ich es mir vorgestellt habe. >>> GENIAL !!!

Der einzigste Haken ist der Startwert. Wenn ich 1 eingebe, startet die Schleife bei 2, wenn ich 0 eingebe, klappt es aber.
Korrektur: anstatt *1, -1.
Code
var startVal = DatenSTART.editContents-1; 


Vielen Dank Hans.
Das hilft mir sehr weiter :-)


als Antwort auf: [#529982]

INDesign Script für Datenzusammenführung

Hans Haesler
  
Beiträge gesamt: 5826

21. Jul 2014, 13:22
Beitrag # 10 von 13
Beitrag ID: #530005
Bewertung:
(13174 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo OnkelAndi,

bitte sehr. Ja, diese JavaScript-Zählweise ...

Zwei weitere Änderungsvorschläge:
– Eingabe auf ganze Zahlen beschränken (integer statt real);
– Minimum- und Maximumwerte definieren;

Code
			var DatenSTART = integerEditboxes.add({minimumValue:1, maximumValue:99}); 
var DatenENDE = integerEditboxes.add({minimumValue:1, maximumValue:99});

Beides ist nicht zwingend. Aber es kann helfen:
– Eingaben mit Dezimalstellen werden automatisch gerundet.
– Negative Zahlen sind nicht möglich.

Und auch noch:
– Prüfen der beiden Werte.

Code
	var myResult = myDialog.show(); 
if (myResult == true) {
var okay = true;
var myAuswahl = myRangeButtons.selectedButton+1;
// Variablen aus DIALOG
if (myAuswahl == 1){
var startVal = 0;
var maxRange = curDoc.dataMergeProperties.dataMergePreferences.recordRange.split('-')[1];
}
if (myAuswahl == 2){
var startVal = DatenSTART.editContents-1;
var maxRange = DatenENDE.editContents-1;
if ((maxRange-startVal) == 0) {
alert ("von- und bis-Wert sind gleich.", "Stop");
okay = false;
}
else if ((maxRange-startVal) < 0) {
alert ("Der bis-Wert ist kleiner als der von-Wert.", "Stop");
okay = false;
}
}
myDialog.destroy();
if (okay == false) {
exit();
}
}
else {
myDialog.destroy();
exit();
}
}

Die Variable 'okay' dient als "flag". Wenn ihr Wert 'false' ist, wird die Ausführung nach dem Entfernen des Dialoges abgebrochen.

Gruss, Hans


als Antwort auf: [#530001]

INDesign Script für Datenzusammenführung

OnkelAndi
Beiträge gesamt: 4

21. Jul 2014, 14:16
Beitrag # 11 von 13
Beitrag ID: #530010
Bewertung:
(13151 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hans,

danke für die weiteren Anregungen.
integer auf die Zahlenfelder anzuwenden macht in dem fall sinn.
den maximum Eintrag würde ich mal außenvor lassen, da die Anzahl der Datensätze offen ist. Zudem bin ich bisher der einzigste, der mit dem script arbeitet und somit weiß, was im hintergrund läuft.

den alert von gleichen werten benötigt es eigentlich nur, wenn man "var maxRange = DatenENDE.editContents-1" anstatt *1 nimmt. Da aber -1 für die Überschriftenzeile abgezogen wird, wende ich dies nur für den start an, dann passt es.
Und für das ende der datensätze eine niedrigere zahl einzugeben wäre ja auch unsinnig.

Ich Danke dir für deine Zeit und deine Vorschläge.

Viele Grüße,
Andi


als Antwort auf: [#530005]

INDesign Script für Datenzusammenführung

Hans Haesler
  
Beiträge gesamt: 5826

21. Jul 2014, 14:45
Beitrag # 12 von 13
Beitrag ID: #530017
Bewertung:
(13134 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Andi,

bitte sehr.

Nun, auch wenn man weiss was man macht :-), ist eine Prüfung der Werte
angebracht. Denn unsinnige Eingaben sind meistens Tippfehler.

Gruss, Hans


als Antwort auf: [#530010]

INDesign Script für Datenzusammenführung

NEU!
Beiträge gesamt: 180

12. Jun 2018, 11:47
Beitrag # 13 von 13
Beitrag ID: #564318
Bewertung:
(6608 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hier auch nochmal: Cole can do! Super hilfreich:

https://colecandoo.com/2015/09/04/data-merge-from-indesign-to-unique-filenames-now-a-reality/


als Antwort auf: [#530017]
X