2012-05-21 11 views
5

Elektronik tabloda saklanan kullanıcı verileri listesinden etiketler oluşturmalıyım. Şu anda her şey güzel çalışıyor, ancak 16'dan fazla öğe çıktı aldığımda (sayfa başına etiket sayısı) birden fazla belgem var, bunların her biri tek bir sayfa. Her bir dokümanın benzersiz bir adı vardır, bu yüzden kullanımı zor değildir, ancak bunları yazdırmak için çok fazla belge açmak sıkıcıdır. 500 öğeden oluşan bir şablon oluşturmak istemediğimden (ya da herhangi bir sayıdan) dolayı, bu tek sayfa şablonunu çok sayfalı bir belgede herhangi bir ekilde tekrarlayabilir miyim diye merak ettim, böylece tüm etiketleri tek bir belgede aldım. Yazdırmak çok daha rahat olurdu ;-) Şimdiye kadar hiçbir ipucu bulamadım ... parlak bir fikir? Burada dokümanlar oluşturmak için kullandığım kod (biraz uzun, bu konuda üzgünüm):Google-apps-script'te tek bir sayfa şablonundan nasıl bir çok sayfalı metin belgesi oluşturabilirim?

ve ... herhangi bir yardım için çok teşekkürler.

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

cevap

10

Peki Serge, appendParagraph ve DocumentBodySection diğer eklerini denemediniz mi?

böyle yapardım: Cevabınız için

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

Teşekkürler Henrique, Birleştirilen belgenin takip edilmesi gereken bir parça olacağını sanıyordum ama itiraf etmeliyim ki, docs ve elementType ile çok rahat değilim ... Kodunuzla, istediğimi alacağım eminim ;-) –

+0

Bu Paragraflar ve Liste Öğeleri için çalıştı, ancak Tablo öğeleri biçimlendirmelerini kaybetti. – David

0

Sorunuz Ben birkaç hafta önce sorulan birinin (Issue with creating an “old-fashioned” mail merge with Google Apps Script) benzer sesler. Belgeyi oluşturmam gerektiği söylenen en iyi yolu, tüm şeyi komut dosyasıyla oluşturmak ve belge şablonu kullanmamaktı.

+0

Teşekkür ama bir şablon kullanmadan etiketleri ile uyumlu yazdırılabilir doc oluşturmak onun mümkün sanmıyorum ... tedbirlerin alınması oldukça zorunda Öncelikli adesive sayfalarını eşleştirmek için doğru: - /. Eğer haklıysanız ve başka seçenek yoksa, yeni sayfalar üretmeye devam edeceğim. Ya da belki doktorları ikinci adımda bir araya getirmeyi deneyebilirim? –

+0

@willw cevabınız için teşekkür ederiz: Kombine belgeyi komut dosyasıyla oluşturarak ne demek istediğinizi ayrıntılı olarak açıklayabilir misiniz? – BKSpurgeon

İlgili konular