hilfdirselbst.ch
Facebook Twitter gamper-media
Bonsai
Beiträge: 98
12. Jun 2013, 14:47
Beitrag #1 von 13
Bewertung:
(8216 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

INDesign Script für Datenzusammenführung


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
___________________________________________________________

Techniker: Ja, das könnte natürlich auch ein Bug sein ... ^^ Top
 
X
WernerPerplies
Beiträge: 2189
12. Jun 2013, 15:11
Beitrag #2 von 13
Beitrag ID: #513776
Bewertung:
(8201 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

INDesign Script für Datenzusammenführung


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.

Einen schönen Tag wünscht

Werner Perplies
Auftragsprogrammierung und Skripte für Adobe InDesign
neu: WpsProjectHandler jetzt mit Vollwaschgang
Aktuelles
XING
als Antwort auf: [#513775] Top
 
-hans-
Beiträge: 737
12. Jun 2013, 18:25
Beitrag #3 von 13
Beitrag ID: #513791
Bewertung: ||
(8148 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

INDesign Script für Datenzusammenführung


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.
Lieben Gruß

Hans-Gerd Claßen
als Antwort auf: [#513775] Top
 
Bonsai
Beiträge: 98
13. Jun 2013, 06:55
Beitrag #4 von 13
Beitrag ID: #513797
Bewertung:
(8090 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

INDesign Script für Datenzusammenführung


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
___________________________________________________________

Techniker: Ja, das könnte natürlich auch ein Bug sein ... ^^
als Antwort auf: [#513791] Top
 
-hans-
Beiträge: 737
13. Jun 2013, 11:08
Beitrag #5 von 13
Beitrag ID: #513807
Bewertung:
(8040 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

INDesign Script für Datenzusammenführung


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();
}

Lieben Gruß

Hans-Gerd Claßen
als Antwort auf: [#513797] Top
 
OnkelAndi
Beiträge: 4
20. Jul 2014, 17:48
Beitrag #6 von 13
Beitrag ID: #529976
Bewertung:
(6857 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

INDesign Script für Datenzusammenführung


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] Top
 
OnkelAndi
Beiträge: 4
20. Jul 2014, 19:04
Beitrag #7 von 13
Beitrag ID: #529978
Bewertung:
(6816 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

INDesign Script für Datenzusammenführung


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] Top
 
Hans Haesler  M  p
Beiträge: 5581
21. Jul 2014, 08:24
Beitrag #8 von 13
Beitrag ID: #529982
Bewertung:
(6739 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

INDesign Script für Datenzusammenführung


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] Top
 
OnkelAndi
Beiträge: 4
21. Jul 2014, 12:01
Beitrag #9 von 13
Beitrag ID: #530001
Bewertung:
(6694 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

INDesign Script für Datenzusammenführung


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] Top
 
Hans Haesler  M  p
Beiträge: 5581
21. Jul 2014, 13:22
Beitrag #10 von 13
Beitrag ID: #530005
Bewertung:
(6660 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

INDesign Script für Datenzusammenführung


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] Top
 
OnkelAndi
Beiträge: 4
21. Jul 2014, 14:16
Beitrag #11 von 13
Beitrag ID: #530010
Bewertung:
(6637 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

INDesign Script für Datenzusammenführung


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] Top
 
Hans Haesler  M  p
Beiträge: 5581
21. Jul 2014, 14:45
Beitrag #12 von 13
Beitrag ID: #530017
Bewertung:
(6620 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

INDesign Script für Datenzusammenführung


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] Top
 
NEU!
Beiträge: 174
12. Jun 2018, 11:47
Beitrag #13 von 13
Beitrag ID: #564318
Bewertung:
(92 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

INDesign Script für Datenzusammenführung


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] Top
 
X