2017-11-27 3 views
0

Ich schreibe ein Add-on für Google Text & Tabellen, damit Benutzer aus Listen mit vordefinierten Textbeispielen auswählen können, die sie in ihr Dokument einfügen möchten. Ich möchte den Text wie folgt eingefügt:Wie kann ich den Cursor mit Google Apps Script for Docs an das Ende des eingefügten Textes bewegen?

1st_text_insertion

2nd_text_insertion

3rd_text_insertion

jedoch meinen Code führt zu folgendem:

3rd_text_insertion

2nd_text_insertion

1st_text_insertion

Die umgekehrte Reihenfolge tritt auf, weil die Cursorposition an der gleichen Stelle verbleibt und nicht bis zum Ende der letzten Texteinfügung aktualisiert wird.

Hier ist der Code, den ich mit:

function insertText(text) { 
    var doc = DocumentApp.getActiveDocument(); 
    var cursor = doc.getCursor(); 
    newPosition = cursor.insertText(text + '\r'); 
    doc.setCursor(newPosition); 
} 

Der Code muss flexibel genug sein, Text eingefügt werden, wo sich der Cursor platziert wird und dann neue Einträge nach einer Rückkehr Charakter. Wenn beispielsweise der Benutzer seine Cursor auf einer Leerzeile zwischen bestehenden Textpositionen B und C gesetzt, sollte der eingefügte Text erscheint auf neue Linien zwischen Elementen B und C.

Beispiel vor Texteinblendung:

existing_text_A

existing_text_B

existing_text_C

gewünschter Ausgang nach Texteinblendung:

existing_text_A

existing_text_B

1st_text_insertion

2nd_text_insertion

3rd_text_insertion

existing_text_C

Ich habe verschiedene Ansätze ausprobiert, wie appendText oder getNextSibling verwenden, aber sie tun es nicht produzieren Sie die gewünschte Ausgabe. Danke für jede Hilfe!

+0

Überprüfen Sie [diese Antwort] (https://stackoverflow.com/a/28419565/7215091). – Cooper

Antwort

1

Text einfügen und setzen Cursor am Ende der eingefügten Text

Dadurch wird der Cursor am Ende des eingefügten Text setzen.

function insertTextAtCursor(txt){ 
    var doc=DocumentApp.getActiveDocument(); 
    var body=doc.getBody(); 
    var t=doc.getCursor().insertText('\n' + txt); 
    var txtEl=doc.getCursor().getElement(); 
    var txtOff=doc.getCursor().getOffset(); 
    var pos=doc.newPosition(txtEl, txtOff + 1);//I can't actually explain this. I figured out based upon the error I was getting in the console log 
    doc.setCursor(pos); 
} 
0

Cooper, danke! Deine Antwort hat funktioniert.

Ich fand, dass ich Sonderfälle mit Absätzen und Listenelementen behandeln musste. Ich habe Ihren Code erweitert und teile diese Lösung, um anderen zu helfen.

function insertText(txt){ 
// Summary: Locates the user's cursor, then inserts new text as either a 
    // new paragraph or a new list item, and then updates the cursor position 
    // after the inserted text. 
    var doc=DocumentApp.getActiveDocument(); 
    var txtPos=doc.getCursor(); 
    var txtElement=txtPos.getElement(); 
    var txtElementType=txtElement.getType(); 
    parentElement = txtElement.getParent(); 
    childIndex = parentElement.getChildIndex(txtElement); 
    // Determines if text is within a paragraph and adds a new paragraph 
    if (txtElementType == DocumentApp.ElementType.PARAGRAPH) { 
    var t = parentElement.insertParagraph(childIndex + 0,txt); 

    // Determines if text is within a list item and adds a new list item 
    } else if (txtElementType == DocumentApp.ElementType.LIST_ITEM) { 
    txtGlyphType = txtElement.getGlyphType(); 
    var t = parentElement.insertListItem(childIndex + 0, txt).setGlyphType(txtGlyphType); 

    // Determines if text is within a text element (e.g., within a multi-word block of text) 
    // and then determines whether the text element is within a paragraph or a list item. 
    } else if (txtElementType == DocumentApp.ElementType.TEXT) { 
    parentElementType = parentElement.getType(); 
    parentparentElement = parentElement.getParent(); 
    parentparentIndex = parentparentElement.getChildIndex(parentElement); 

    // Adds a new paragraph if text element is within a paragraph 
    if (parentElementType == DocumentApp.ElementType.PARAGRAPH) { 
    var t = parentparentElement.insertParagraph(parentparentIndex + 0,txt); 

     // Adds a new list item if text element is within a list item 
    } else if (parentElementType == DocumentApp.ElementType.LIST_ITEM) { 
     parentGlyphType = parentElement.getGlyphType(); 
     var t = parentparentElement.insertListItem(parentparentIndex + 0, txt).setGlyphType(parentGlyphType); 
    } 
    } 
    // Updates the position of the cursor to follow the inserted text 
    newPosition = parentElement.getChild(childIndex + 1); 
    var pos = doc.newPosition(newPosition, 0); 
    doc.setCursor(pos); 
} 
Verwandte Themen