2012-05-21 6 views
5

Tengo que generar etiquetas a partir de una lista de datos de usuario almacenados en una hoja de cálculo. Ahora tengo todo funcionando bien, excepto que cuando imprimo más de 16 elementos (el número de etiquetas por página) tengo más de un documento, cada uno de ellos en una sola página. Cada documento tiene un nombre único, por lo que no es muy difícil de usar, pero es un poco aburrido abrir tantos documentos para imprimirlos. Como no quiero crear una plantilla de 500 elementos (o el número que sea), me preguntaba si podría repetir esta plantilla de una página en un documento de varias páginas en cualquier extensión, así que obtengo todas las etiquetas en un solo documento. Esto sería mucho más cómodo de imprimir ;-) No pude encontrar ninguna pista hasta ahora ... ¿alguna idea brillante? aquí está el código que uso para generar los documentos (un poco largo, perdón por eso):¿Cómo puedo generar un documento de texto de varias páginas a partir de una única plantilla de página en google-apps-script?

y ... muchas gracias por cualquier ayuda.

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

Respuesta

10

Bien Serge, ¿no has probado el appendParagraph y otras adiciones de DocumentBodySection?

lo haría así:

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

Gracias Henrique, pensé que fusionar documentos sería una pista para seguir, pero admito que no estoy muy cómodo con los documentos y elementType ... Con tu código, estoy seguro de que obtendré lo que quería ;-) –

+0

This funcionó para Párrafos y Elementos de la Lista, pero los elementos de la Tabla perdieron su formato. – David

0

Su pregunta suena similar a uno (Issue with creating an “old-fashioned” mail merge with Google Apps Script) que pedí hace un par de semanas. La mejor forma de que me pidieron que creara el documento fue para crear todo mediante script y no usar una plantilla de documento.

+0

Gracias por su respuesta, pero no creo que es posible crear un documento imprimible compatible con las etiquetas sin necesidad de utilizar una plantilla ... medidas tienen que ser bastante preciso para hacer coincidir las hojas adesivas precortadas: - /. Si tienes razón y no hay otra opción, seguiré generando muchas hojas nuevas. ¿O tal vez podría intentar fusionar documentos en uno en un segundo paso? –

+0

@willw gracias por su respuesta: ¿puede dar más detalles sobre lo que quiere decir con la creación de todo el documento combinado por script? ¿Tiene algún código, etc. que ayuda a hacer esto? – BKSpurgeon

Cuestiones relacionadas