2012-05-21 13 views
5

Muszę wygenerować etykiety z listy danych użytkownika przechowywanych w arkuszu kalkulacyjnym. Teraz wszystko jest ładnie działające, z tym wyjątkiem, że gdy wyprowadzam więcej niż 16 elementów (liczba etykiet na stronę), mam więcej niż jeden dokument, z których każdy jest pojedynczą stroną. Każdy dokument ma unikatową nazwę, więc nie jest trudny w użyciu, ale nudne jest otwierać tak wiele dokumentów, aby je wydrukować. Ponieważ nie chcę tworzyć szablonu z 500 pozycji (lub dowolnej liczby) zastanawiałem się, czy mogę powtórzyć ten szablon pojedynczej strony w wielostronicowym dokumencie w jakimkolwiek zakresie, więc otrzymam wszystkie etykiety w jednym dokumencie. Byłoby znacznie wygodniej drukować ;-) Nie mogłem znaleźć żadnej wskazówki do tej pory ... żadnego genialnego pomysłu? tutaj jest kod, którego używam do generowania dokumentów (trochę długo, przepraszam za to):Jak wygenerować wielostronicowy dokument tekstowy z jednego szablonu strony w skryptach google-apps?

i ... wielkie dzięki za pomoc.

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 
} 
// 

Odpowiedz

10

Cóż Serge, czy nie wypróbowałeś appendParagraph i innych dodatków do DocumentBodySection?

zrobiłbym to tak:

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

Dzięki Henrique, myślałem, że dokument scalający będzie ścieżką do naśladowania, ale przyznaję, że nie czuję się zbyt komfortowo z dokumentami i elementType ... Z twoim kodem jestem pewien, że dostanę to, co chciałem ;-) –

+0

To pracował dla akapitów i elementów listy, ale elementy tabeli straciły formatowanie. – David

0

Twoje pytanie brzmi podobnie do jednego (Issue with creating an “old-fashioned” mail merge with Google Apps Script), które zadałem kilka tygodni temu. Najlepszym sposobem, w jaki kazano mi stworzyć dokument był , aby utworzyć całość za pomocą skryptu i nie używać szablonu dokumentu.

+0

Dzięki za odpowiedź, ale nie sądzę, jego możliwości do tworzenia wydruku dokumentu zgodnego z etykietami bez korzystania z szablonu ... środki muszą być dość Dokładne dopasowanie do wstępnie przyciętych arkuszy samoprzylepnych: - /. Jeśli masz rację i nie ma innej opcji, będę generował mnóstwo nowych arkuszy. A może mógłbym spróbować scalić dokumenty w jeden w drugim etapie? –

+0

@willw dziękuję za odpowiedź: czy możesz rozwinąć to, co masz na myśli, tworząc cały połączony dokument przez skrypt - czy masz jakiś kod itp., Który pomaga to zrobić? – BKSpurgeon

Powiązane problemy