如何在Google-apps-script中的单个页面模板中生成多页文本文档? [英] How can I generate a multipage text document from a single page template in google-apps-script?

查看:86
本文介绍了如何在Google-apps-script中的单个页面模板中生成多页文本文档?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我必须从存储在电子表格中的用户数据列表中生成标签。
现在我可以很好地工作,除了输出超过16个项目(每页标签数量)时,我有多个文档,每个文档都是一个页面。
每个文档都有一个唯一的名称,所以它不是很难使用,但打开如此多的文档来打印它们是一件无聊的事情。
因为我不想创建一个包含500个项目(或任何数字)的模板,所以我想知道是否可以在多页文档中重复使用这个单页模板来扩展所有的标签单一文件。
这样打印会更加舒适;-)
到目前为止我还找不到任何线索......任何绝妙的主意?
这里是我用来生成文档的代码(有点长,对此感到抱歉):

...非常感谢您的帮助。 / p>

  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); (ff> 1; ff< = feuilles * 16; ++ ff){
if(ff> selrange.length){selrange.push([,,, ),])}; // remplit selrangejusqu'àmultiple de 16(nbre de feuille)
}
//Logger.log (selrange)
//logger.log(e.parameter.mode); // gauche = true,center = false
if(e.parameter.mode =='false'){
var doctemplate = DocsList.getFileById (labeltemplatedoc); // false>> center
} else {
var doctemplate = DocsList.getFileById(labeltemplatedocleft); // true>> gauche
}
//Logger.log(文件名:+ doctemplate.getName()); (FUS1!=GMT + 0200)
var FUS1 = new Date()。toString()。substr(25,8); // FUS1获取GMT + 0200或GMT + 0100字符串
){FUS1 =GMT + 0100}; //照顾夏令时! (新页面= 0;页面< feuilles; ++页面){
var today = Utilities.formatDate(new Date(),FUS1,dd-MM-yyyy)+__+
+ (Number(page + 1)< 10){var docnb =0+ Number(page + 1)}其他{ 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);; (nn = 1; nn <= 16)的
var lib = [titre,nom,prénom,rue,code,ville,pays]
; ++ nn){
for(ll = 0; ll var olditem =(#+ lib [ll] + nn +#);
var newitem = selrange [nn-1 + page * 16] [ll]; (newitem!=){newitem = newitem +}
//Logger.log(olditem +*)
doc.replaceText(olditem,新物品);
}
}
Utilities.sleep(300); //暂停entle les feuilles
}
app.getElementById(end)。setText(feuilles +feuille(s)se trouve(nt)dans vos documents Googleprête(s)àêtreimprimée(s ));
var doclist = DocsList.getRootFolder()。getFilesByType(document,0,2000);
var names = new Array(); $($ n = 0; nn if(doclist [nn] .getName()。match(IMPRESSION_page _)==IMPRESSION_page _){
b $ b names.push([doclist [nn] .getName(),doclist [nn] .getId()]);
}
}
names.sort();
for(nn = 0; nn app.getElementById(Dlb)。addItem(names [nn] [0])
}
app.getElementById(clock)。setVisible(false);
app.getElementById(Dlb)。setVisible(true);
return app
}
//


解决方案

好,Serge,你没有试过 appendParagraph DocumentBodySection



我会这样做:

  function mergeDocs(){
var docIDs = ['list-of','documents','ids','您应该有某种方式'] ;
var baseDoc = DocumentApp.openById(docIDs [0]);
var body = baseDoc.getActiveSection(); (var i = 1; i< docIDs.length; ++ i){
var otherBody = DocumentApp.openById(docIDs [i])。getActiveSection();


var totalElements = otherBody.getNumChildren(); (var j = 0; 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
抛出新错误(根据文档,这种类型不能出现在主体中:+ type);
}
}
}


I have to generate labels from a list of user data stored in a spreadsheet. Right now I get everything working nicely except that when I output more than 16 items (the number of labels per page) I have more than one document, each of them being a single page. Each doc has a unique name so it's not very hard to use but it's kind of boring to open so many documents to print them. Since I don't want to create a template of 500 items (or whatever number) I was wondering if I could repeat this single page template in a multi-page document to any extend so I get all the labels in one single document. This would be far more comfortable to print ;-) I couldn't find any clue up to now... any brilliant idea ? here is the code I use to generate the docs ( a bit long, sorry about that) :

and ... many thanks for any help.

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

解决方案

Well Serge, haven't you tried the appendParagraph and other appends of the DocumentBodySection?

I'd do it like this:

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);
    }
  }
}

这篇关于如何在Google-apps-script中的单个页面模板中生成多页文本文档?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆