bgoodr
bgoodr

Reputation: 2930

How to copy ListItems from one Google Document to another while preserving numbering?

The accepted answer to How to copy content and formatting between Google Docs? indicates that we have to add conditional code just to copy elements. But I cannot get it to work for ListItem types, because the target document shows the list items without the original numbering.

var source_doc = DocumentApp.getActiveDocument();
var selection = source_doc.getSelection();
if (!selection) {
    var ui = DocumentApp.getUi();
    ui.alert('Please make a selection first.');
    return;
}

var target_doc = DocumentApp.create('CopyOf'+DocumentApp.getActiveDocument().getName());
var target_body = target_doc.getBody();

var elements = selection.getRangeElements();
for (var i = 1; i < elements.length; i++) {
    var source_element = elements[i].getElement();
    var copy_element = source_element.copy();
    if (copy_element.getType() == DocumentApp.ElementType.PARAGRAPH) {
        target_body.appendParagraph(copy_element);
    } else if (copy_element.getType() == DocumentApp.ElementType.LIST_ITEM) {
        // This does not keep the numbering on the list item. Why?
        target_body.appendListItem(copy_element);

        // And playing games with setListId doesn't work either:
        // copy_element.setListId(source_element);
        // target_body.appendListItem(copy_element);
    }
    // TODO: Handle the other elements here.
}

The source document displays like this:

source document

Target document renders like this:

bad rendering

How do I preserve ListItem formatting?

This seems much much harder than it should be: What I really want is to copy the users selection verbatim into a new document preserving all formatting, and from a google script.

It would seem that this could be done at a higher level. I can manually copy and paste and preserve the formatting, just not from the script.

Upvotes: 1

Views: 1486

Answers (2)

ems
ems

Reputation: 742

I was having a similar problem (but not using a selection). It was being copied as a list but without any actual bullets. I just re-set the bullets manually like this:

target_body.appendListItem(copy_element).setGlyphType(DocumentApp.GlyphType.NUMBER)

Upvotes: 1

SwagBomb
SwagBomb

Reputation: 604

I'm guessing that the cause of this is that there's a problem with using a Selection. Reading from a document directly seems to work fine.

Try appending the ListItem as text as a workaround.

target_body.appendListItem(copy_element.getText());

This will only copy the text though, not the formatting. You can also try to implement it by making a new list instead of copying the element directly. Here's a sample SO that might help.

Upvotes: 1

Related Questions