2016-05-13 10 views
1

Ich habe ein Apps-Skript, das den Inhalt einer Vorlagedatei an das Ende eines Dokuments kopiert. Es funktioniert mit einem kleinen Ärgernis: Die nummerierte Liste wird von einer Kopie zur nächsten fortgesetzt.Nummerierte Listen werden fortgesetzt, wenn das Apps-Skript den Vorlageninhalt an das Dokument anfügt

Ich habe viele verschiedene Vorlagen, die Benutzer an das Ende des Dokuments anhängen können. Jede Vorlage ist in einem eigenen Dokument gespeichert.

function addSub(template_id){ 
     var mainBody = DocumentApp.getActiveDocument().getBody(); 
     var tempBody = DocumentApp.openById(template_id).getBody(); 
     for(var i = 0;i<tempBody .getNumChildren();i++){ 
     var element = tempBody .getChild(i); 
     if(element.getType() == DocumentApp.ElementType.TABLE) 
      mainBody.appendTable(element.copy()); 
     else if(element.getType() == DocumentApp.ElementType.PARAGRAPH) 
      mainBody.appendParagraph(element.copy()); 
     else if(element.getType() == DocumentApp.ElementType.LIST_ITEM) 
      mainBody.appendListItem(element.copy()); 
     else if(element.getType() == DocumentApp.ElementType.PAGE_BREAK) 
      mainBody.appendPageBreak(element.copy()); 
     } 
    } 

Es könnte wie folgt aussehen: (Ich möchte die Liste für jede neue Kopie der Vorlage zurücksetzen)

Tabelle dieser Vorlage mit dem Namen

einige Rohtext

  1. Liste item1
  2. Liste item2

Tabelle mit dem Namen dieser Vorlage

einige Rohtext

  1. Liste item1
  2. Liste item2

Antwort

1

Nach Richard Gantz es gelöst wurde es durch diesen Code korrigiert:

var listItemDictionary = {};//top 

...

else if(element.getType() == DocumentApp.ElementType.LIST_ITEM){ 
    var listCopy = element.copy().asListItem() 
    var lcID = listCopy.getListId(); 
    if (listItemDictionary[lcID] == null){ 
    var tempLI = mainBody.appendListItem("temp") 
    listItemDictionary[lcID] = tempLI; 
    } 
    Logger.log(lcID) 
    mainBody.insertListItem(childIndex+j, listCopy.setListId(listItemDictionary[lcID])); 
} 

...

if(listItemDictionary){//bottom 
    mainBody.appendParagraph(""); 
    for(var key in listItemDictionary){ 
    listItemDictionary[key].clear().removeFromParent() 
    } 
} 
+0

Hat mich ein bisschen verstanden, was dieser Code macht: Jedes Mal, wenn der Code eine neue listId sieht, erstellt er ein neues, temporäres listItem im Zieldokument, um eine neue listId für dieses Dokument zu erhalten (das temporäre listItem wird gespeichert, so dass die ID nicht existiert) wird nicht wiederverwendet) und weist dem kopierten Element die neue listId zu. Das Wörterbuch speichert alle listIds der kopierten Elemente in den erstellten temporären Elementen und ermöglicht die Zuordnung von listIds von Elementen, die in dasselbe temporäre Element kopiert wurden. Der Code am Ende räumt dann alle temporären listItems auf. – Von

1

Haben Sie jetzt, ListItems haben eine ID, die ein STRING ist, und Sie können darauf über myListItem.getListId() zugreifen.

Es scheint, dass alle Ihre ListItems die gleiche ID haben. Wenn dies der Fall ist, muss die Nummerierung wie beschrieben erfolgen.

Warum haben sie die gleiche ListID? Ich weiß es nicht. Scheint, dass die Methode body.appendListem immer dieselbe listId auswählt.

Ich habe es noch nicht getestet, aber Sie könnten versuchen, die listID des neu angehängten ListItem auf die des Originaldokuments zu setzen, wenn sie unterschiedlich sind.

Ja, ich weiß, die .copy() - Methode sollte diese Informationen einschließen, aber die body.appendListItem-Methode ist möglicherweise nicht wichtig.

So könnten Sie versuchen, zuerst die getrennte Kopie des listItem zu speichern. Dann an den neuen Körper anhängen. Und dann legen Sie die ID des neu angehängten listItem auf die der gelösten Kopie. Es ist dumm, ich weiß, aber es kann helfen. Habe es noch nicht probiert.

Und ich habe wenig Erfahrung mit listItems, was ich bis jetzt gesehen habe ist, dass es scheint nur eine ListId im Körper eines Dokuments zu sein, wenn Sie listItems anhängen oder einfügen.

Dies könnte die Ursache des Problems sein.

Hoffe, das hilft.

+0

Sie haben Recht. Sie teilen ID. Ich nehme an, dass es aus dem Vorlagedokument kopiert wurde. –

0

Basierend auf der Antwort von Niklas Ternvall/Richard Gantz, ich fand eine einfachere Lösung für den Fall, dass jede Vorlage nicht mehr als eine Liste hat.

function addSub(template_id) { 
    var mainBody = DocumentApp.getActiveDocument().getBody(); 
    var tempBody = DocumentApp.openById(template_id).getBody(); 
    var listID = null;       
    for(var i = 0;i<tempBody.getNumChildren();i++){ 
    var element = tempBody.getChild(i).copy(); 
    var type = element.getType();     
    if(type == DocumentApp.ElementType.TABLE) 
     mainBody.appendTable(element); 
    else if(type == DocumentApp.ElementType.PARAGRAPH) 
     mainBody.appendParagraph(element); 
    else if(type == DocumentApp.ElementType.LIST_ITEM){ 
     if(listID==null)         // First list item 
     listID = mainBody.appendListItem('temp');  // Define new listID 
     mainBody.appendListItem(element).setListId(listID); // Apply to copy 
    } 
    else if(type == DocumentApp.ElementType.PAGE_BREAK) 
     mainBody.appendPageBreak(element); 
    } 
    mainBody.removeChild(listID);    // Delete temporary list item 
} 

Jedes Mal, wenn Sie die Funktion aufrufen, ist listID=null der Indikator dafür, ob oder nicht irgendwelche Listenelemente in der Vorlage haben. Wenn Sie zum ersten Listenelement gelangen, erzwingt das Anhängen des Textes 'temp' eine neue Liste und damit eine neue listID, die Sie auf die Listenelemente aus der Vorlage anwenden können. Nachdem Sie die Vorlage durchlaufen haben, entfernt mainBody.removeChild(listID) "temp" vom Anfang Ihrer Liste.

Diese Lösung funktionierte für mich, wenn Sie eine Vorlage 100 Mal in einem Dokument verwendeten, im Wesentlichen als Seriendruck. Ich bin ziemlich neu in Apps Script, daher würde ich mich über Feedback freuen, wenn es einen Grund gibt, warum dies nicht für eine Single-List-Vorlage funktionieren würde.