Вопрос по – Как я могу создать многостраничный текстовый документ из одного шаблона страницы в google-apps-script?

5

Я должен создать ярлыки из списка пользовательских данных, хранящихся в электронной таблице. Прямо сейчас у меня все работает хорошо, за исключением того, что, когда я вывожу более 16 элементов (количество меток на страницу), у меня есть более одного документа, каждый из которых представляет собой одну страницу. Каждый документ имеет уникальное имя, поэтому его не очень сложно использовать, но скучно открывать так много документов, чтобы их напечатать. Поскольку я не хочу создавать шаблон из 500 элементов (или любого другого числа), мне было интересно, смогу ли я повторить этот одностраничный шаблон в многостраничном документе в любой степени, чтобы я получил все метки в одном документе. Это было бы гораздо удобнее печатать ;-) Я до сих пор не смог найти никакой подсказки ... какая-нибудь блестящая идея? Вот код, который я использую для создания документов (немного долго, извините за это):

и ... большое спасибо за любую помощь.

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

Ваш Ответ

2   ответа
0

Спросите о создании «старомодного» почтового слияния с помощью Google Apps Script) что я спросил пару недель назад.Лучши способ, которым мне сказали создать документ, состоял в том, чтобы создать всю вещь через скрипт и не использовать шаблон документа.

Спасибо за ваш ответ, но я не думаю, что возможно создать печатный документ, совместимый с этикетками, без использования шаблона ... меры должны быть достаточно точными, чтобы соответствовать предварительно подготовленным листам: - /. Если вы правы и у вас нет другого выбора, я буду продолжать генерировать множество новых листов. Или, может быть, я мог бы попытаться объединить документы в один на втором этапе? Serge insas
@ поблагодарит вас за ваш ответ: можете ли вы уточнить, что вы имеете в виду, создавая весь объединенный документ по сценарию - есть ли у вас какой-либо код и т. д., который помогает это сделать? BKSpurgeon
10

appendParagraph и другие приложения DocumentBodySection?

Я бы сделал это так:

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);
    }
  }
}
Спасибо Энрике, я думал, что слияние документа будет следом, но я признаю, что мне не слишком удобно с документами и elementType ... С твоим кодом я уверен, что получу то, что хотел; -) Serge insas
Это работало для абзацев и элементов списка, но элементы таблицы потеряли свое форматирование. David

Похожие вопросы