如何在Google-apps-script中使用单个页面模板生成多页文本文档?
我必须从存储在电子表格中的用户数据列表中生成标签。 现在我得到一切正常工作,除了当我输出超过16个项目(每页标签的数量),我有不止一个文件,每个文件是一个单一的页面。 每个文档都有一个独特的名字,所以它不是很难使用,但打开这么多的文档来打印它们是无聊的。 由于我不想创build500个项目(或任何数量)的模板,我想知道如果我可以在一个多页文档中重复这个单页面模板到任何扩展,所以我在一个单一的文档中获得所有的标签。 这将是打印更舒适;-)我找不到任何线索到现在…任何好主意? 这里是我用来生成文档的代码(有点长,抱歉):
和…非常感谢您的帮助。
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 } //
那么Serge,你还没有试过DocumentBodySection的appendParagraph
和其他附加内容吗?
我会这样做:
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); } } }
您的问题听起来很像我之前几周提到的问题( 与创build与Google Apps脚本“老式”邮件合并有关的问题 )。 我被告知创build文档的最佳方式是通过脚本创build整个事物,而不使用文档模板。