2012-05-21 4 views
5

Ich muss Etiketten aus einer Liste von Benutzerdaten generieren, die in einer Tabelle gespeichert sind. Im Moment bekomme ich alles gut funktioniert, außer wenn ich mehr als 16 Elemente (die Anzahl der Etiketten pro Seite) ausgibt habe ich mehr als ein Dokument, jedes von ihnen eine einzelne Seite. Jedes Dokument hat einen eindeutigen Namen, so dass es nicht sehr schwer zu benutzen ist, aber es ist langweilig, so viele Dokumente zu öffnen, um sie zu drucken. Da ich keine Vorlage von 500 Elementen (oder welcher Zahl) erstellen möchte, habe ich mich gefragt, ob ich diese einzelne Seitenvorlage in einem mehrseitigen Dokument beliebig wiederholen könnte, damit ich alle Etiketten in einem einzigen Dokument bekomme. Das wäre viel bequemer zu drucken ;-) Ich konnte bis jetzt keine Ahnung finden ... keine geniale Idee? Hier ist der Code, den ich verwende, um die Dokumente zu generieren (ein bisschen lang, tut mir leid):Wie kann ich ein mehrseitiges Textdokument aus einer einzelnen Seitenvorlage in Google-Apps-Skript generieren?

und ... vielen Dank für jede Hilfe.

function print(e){ 
    var app = UiApp.getActiveApplication(); 
    var selrangerow = sh.getActiveSelection().getRowIndex(); 
    var selrangeheight = sh.getActiveSelection().getNumRows(); 
    var selrangeend = selrangerow+selrangeheight-1 
    var selrange = sh.getRange(selrangerow,1,selrangeheight,7).getValues(); 
    var feuilles = Math.ceil(selrangeheight/16); 
    for (ff=1;ff<=feuilles*16;++ff){ 
    if(ff>selrange.length){selrange.push([" "," "," "," "," "," "," "])} ;// remplit selrange jusqu'à multiple de 16 (nbre de feuille) 
    } 
//Logger.log(selrange) 
//Logger.log(e.parameter.mode) ;// gauche=true, centre = false 
    if(e.parameter.mode=='false'){ 
    var doctemplate = DocsList.getFileById(labeltemplatedoc);// false >> centre 
    }else{ 
    var doctemplate = DocsList.getFileById(labeltemplatedocleft);// true >> gauche 
    } 
//Logger.log("File name: " + doctemplate.getName()); 
    var FUS1=new Date().toString().substr(25,8);// FUS1 gets the GMT+0200 or GMT+0100 string 
    if (FUS1!="GMT+0200"){FUS1="GMT+0100"};// and takes care of summer time ! 
    for(page=0;page<feuilles;++page){ 
     var today=Utilities.formatDate(new Date(),FUS1,"dd-MM-yyyy")+"__"+Utilities.formatDate(new Date(),FUS1,"HH:mm") 
     if (Number(page+1)<10){var docnb="0"+Number(page+1)}else{var docnb=Number(page+1)} 
     var docname="IMPRESSION_page_"+docnb+"_"+today; 
     var docId=DocsList.copy(doctemplate,docname).getId(); 
//Logger.log(selrange) 
     var doc = DocumentApp.openById(docId);; 
     var lib=["titre","nom","prénom","rue","code","ville","pays"] 
     for(nn=1;nn<=16;++nn){ 
      for(ll=0;ll<lib.length;++ll){ 
      var olditem = ("#"+lib[ll]+nn+"#"); 
      var newitem = selrange[nn-1+page*16][ll]; 
      if (newitem!=""){newitem=newitem+" "} 
//Logger.log(olditem + " *"+newitem+"*") 
       doc.replaceText(olditem,newitem); 
     } 
     } 
     Utilities.sleep(300); // pause entre les feuilles 
    } 
    app.getElementById("end").setText(feuilles+" feuille(s) se trouve(nt) dans vos documents Google prête(s) à être imprimée(s)."); 
    var doclist=DocsList.getRootFolder().getFilesByType("document",0,2000); 
    var names = new Array(); 
     for (nn=0;nn<doclist.length;++nn){ 
     if(doclist[nn].getName().match("IMPRESSION_page_")=="IMPRESSION_page_"){ 
     names.push([doclist[nn].getName(),doclist[nn].getId()]); 
     } 
     } 
    names.sort(); 
for(nn=0;nn<names.length;++nn){ 
app.getElementById("Dlb").addItem(names[nn][0]) 
} 
    app.getElementById("clock").setVisible(false); 
    app.getElementById("Dlb").setVisible(true); 
    return app 
} 
// 

Antwort

10

Nun Serge, haben Sie nicht versucht, die appendParagraph und andere Anhänge der DocumentBodySection?

ich es so tun würde:

function mergeDocs() { 
    var docIDs = ['list-of','documents','ids','you should have somehow']; 
    var baseDoc = DocumentApp.openById(docIDs[0]); 
    var body = baseDoc.getActiveSection(); 

    for(var i = 1; i < docIDs.length; ++i) { 
    var otherBody = DocumentApp.openById(docIDs[i]).getActiveSection(); 
    var totalElements = otherBody.getNumChildren(); 
    for(var j = 0; j < totalElements; ++j) { 
     var element = otherBody.getChild(j).copy(); 
     var type = element.getType(); 
     if(type == DocumentApp.ElementType.PARAGRAPH) 
     body.appendParagraph(element); 
     else if(type == DocumentApp.ElementType.TABLE) 
     body.appendTable(element); 
     else if(type == DocumentApp.ElementType.LIST_ITEM) 
     body.appendListItem(element); 
     else 
     throw new Error("According to the doc this type couldn't appear in the body: "+type); 
    } 
    } 
} 
+0

Danke Henrique, ich dachte, dass das Zusammenführen eines Dokuments ein Track wäre, dem ich folgen sollte, aber ich gebe zu, dass ich mich nicht mit Docs und elementType auskenne ... Mit deinem Code werde ich sicher bekommen, was ich wollte ;-) –

+0

arbeitete für Absätze und Listenelemente, aber die Tabellenelemente verloren ihre Formatierung. – David

0

Ihre Frage klingt ähnlich wie ein (Issue with creating an “old-fashioned” mail merge with Google Apps Script), die ich vor ein paar Wochen gefragt. Die beste Weise, die mir gesagt wurde, um das Dokument zu erstellen, war die gesamte Sache über Skript zu erstellen und keine Dokumentvorlage zu verwenden.

+0

Vielen Dank für Ihre Antwort, aber ich glaube nicht, seine möglich, eine druckbare doc kompatibel mit Etiketten zu erstellen, ohne eine Vorlage mit ... Maßnahmen haben recht sein genau passend zu den vorgeschnittenen Blechen: - /. Wenn Sie Recht haben und keine andere Möglichkeit haben, werde ich weiterhin viele neue Blätter erstellen. Oder vielleicht könnte ich versuchen, Dokumente in einem zweiten Schritt zu einem zu verschmelzen? –

+0

@willw Vielen Dank für Ihre Antwort: Können Sie näher erläutern, was Sie meinen, indem Sie das gesamte kombinierte Dokument per Skript erstellen - haben Sie einen Code usw., der Ihnen dabei hilft? – BKSpurgeon

Verwandte Themen