Google Apps Script - Документы. Преобразование ячеек таблицы с форматированием в HTML - PullRequest
0 голосов
/ 12 ноября 2018

Я создаю надстройку Google Script в Docs (не Sheets), которая позволяет людям вводить контент в предопределенные ячейки таблицы, которые затем мне понадобится для анализа и преобразования в HTML.

Я почти готов, благодаря этому ответу: https://stackoverflow.com/a/47313357/2586977 и скрипту GoogleDoc2HTML , о котором он упоминает. Я могу получить все, что мне нужно, кроме простого форматирования, которое потребуется для некоторого контента - жирный, курсив и ссылки.

Метод, описанный в связанной статье, использует getTextAttributeIndices() для определения местоположения этих изменений атрибутов, а затем вставляет соответствующие HTML-теги в выходные данные для репликации форматирования. Это довольно скучно, но работает!

У меня проблема в том, что getTextAttributeIndices() будет работать только на [Text][2] элементах, и я пытаюсь получить индексы содержимого в элементе [TableCell][3].

Консоль выдает мне сообщение об ошибке:

TypeError: Не удается найти функцию getTextAttributeIndices в объекте TableCell.

Если сначала сделать myTableCell.getText(), я потеряю все форматирование.

Ответы [ 2 ]

0 голосов
/ 13 ноября 2018

@ axemonkey Ваше решение будет работать, но оно хрупкое, поскольку документация не гарантирует, что элемент абзаца всегда будет дочерним элементом с индексом 0. Перерыл документацию и нашел этот метод:

TabelCell::findElement(elementType)

Вы можете использовать этот метод для извлечения дочерних элементов данного типа.Он возвращает RangeElement, который охватывает дочерний элемент, поэтому вам нужно вызвать следующий метод:

RangeElement::getElement()


Таким образом, используя вышеизложенное, более надежный способ получить элемент абзаца:

var paragraph = tableCell.findElement(DocumentApp.ElementType.PARAGRAPH).getElement();

Чтобы получить элемент Text в абзаце, вы можете использовать findElement() наЭкземпляр абзаца также:

var text = paragraph.findElement(DocumentApp.ElementType.TEXT).getElement();

Итак, собрав все это вместе, вы получите:

var paragraph = tableCell.findElement(DocumentApp.ElementType.PARAGRAPH).getElement();
var text = paragraph.findElement(DocumentApp.ElementType.TEXT).getElement();

var indices = text.getAttributeIndices();

Там есть больше кода для написания, но у вас будет больше читаемого кода и меньшескорее всего сломается, так как он не зависит от дочерних индексов.


PS: когда вы вызываете метод getElement() для RangeElement, он возвращает элемент, но что касается графического интерфейса приложения Scriptвы получаете автозаполнение только для свойств, связанных с интерфейсом Element.Если вы хотите получить автозаполнение для свойств и методов, специфичных для данного типа элемента, используйте один из многих методов приведения типов, определенных в интерфейсе Element.Эти методы всегда имеют префикс as.Таким образом, чтобы получить завершение кода для текстового элемента, вы можете написать код так:

var text = paragraph.findElement(DocumentApp.ElementType.TEXT).getElement().asText();
0 голосов
/ 13 ноября 2018

Я наконец взломал его, поэтому я делюсь ответом на случай, если кто-то еще столкнется с этим.

getTextAttributeIndices() работает только на Text элементах, а не TableCell элементах.

НО оказывается, что когда вы создаете элемент TableCell и вводите в него контент, он неявно создает элемент Paragraph, который содержит элемент Text.

Поэтому это НЕ работает:

myTableCell.getTextAttributeIndices()

но это РАБОТАЕТ:

myTableCell.getChild(0).getChild(0).getTextAttributeIndices()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...