Итак, на данный момент у меня есть код, который позволяет мне вставлять ListItem после абзаца в Google Docs. Единственная проблема, с которой я сталкиваюсь, заключается в том, что это кажется чрезмерно сложным для того, что я пытаюсь выполнить. Вот мой код...
var search = "This is a test"
var body = DocumentApp.getActiveDocument().getBody()
var regExp = new RegExp("("+search+")", "g");
var text;
for (var i = body.getNumChildren() - 1; i >= 0; i--) {
text = body.getChild(i).asText().getText()
if (regExp.test(text)) {
body.insertListItem(i + 1, "This is a test bullet.").setGlyphType(DocumentApp.GlyphType.BULLET).setBold(false)
}
}
Строка 1: здесь вы помещаете текст туда, куда вы хотите добавить ListItems в
Строка 2: это просто захватывает все в теле документа
Строка 3: создает регулярное выражение с текстом, введенным в строке 1
Строка 4: просто устанавливает переменную "текст"
Строка 5: Проходит все дочерние элементы элемента тела
Строка 6: Получает текст каждого из дочерних элементов
Строка 7: проверьте, находится ли текст в переменной "поиск" в каком-либо тексте в теле документа где-то и хватает этого ребенка
Строка 8: Вставляет пулю один ребенок под дочерним элементом, который находится в строке 7
Этот код ниже - это то, что, как я думал, сделает это для меня, добавьте ListItem ниже некоторого текста
var search = "This is a test"
var body = DocumentApp.getActiveDocument().getBody()
body.findText(search).getElement().asText().appendListItem("Test bullet")
Я хотел, чтобы это выглядело примерно так:
Это тест
Но вместо этого с кодом непосредственно выше я просто получил эту ошибку TypeError: Cannot find function appendListItem in object Text. (line 116, file "Code")
TypeError: Cannot find function appendListItem in object Text. (line 116, file "Code")
Дело в том, что я просто очень смущен, когда я запускаю код, который выглядит так, как будто он работает без ошибок, но, очевидно, добавляет его в самую верхнюю часть документа. Итак, почему мой код непосредственно выше работает и как я могу заставить его работать?:
var body = DocumentApp.getActiveDocument().getBody()
body.appendListItem("Test bullet")
Любая помощь очень ценится!
Текстовые объекты представляют текст, самый низкий уровень структуры документа. В тексте не может быть других элементов, таких как элемент списка. Вот почему объекты Text не имеют метода appendListItem
; они имеют метод appendText
.
Фактически, единственными частями документа, которые могут содержать ListItem, являются элементы Body и header/footer/footnote: см. Структуру документа. Поэтому необходимо добавить ListItem в Body, и это нужно сделать с помощью body.insertListItem(index, text)
чтобы он правильно позиционировался.
Если вы хотите добавить только один элемент списка после первого результата поиска, выполните следующее задание:
var search = "This is a test";
var body = DocumentApp.getActiveDocument().getBody();
var found = body.findText(search);
if (found) {
var elem = found.getElement().getParent();
var index = body.getChildIndex(elem);
body.insertListItem(index+1, "Test bullet");
}
Обратите внимание, что элемент, который вы получаете с помощью found.getElement()
является Text, который не является дочерним элементом Body: он будет находиться внутри чего-то другого, вероятно, Paragraph. Следовательно, призыв getParent
получить что-то, что, вероятно, является ребенком тела.
Если вставка была глобальной, запустите цикл while с помощью findText
:
var search = "This is a test";
var body = DocumentApp.getActiveDocument().getBody();
var found = body.findText(search);
while (found) {
var elem = found.getElement().getParent();
var index = body.getChildIndex(elem);
body.insertListItem(index+1, "Test bullet");
found = body.findText(search, found);
}
* Важно: это не будет работать, если поисковый термин будет погружен глубже, скажем, в абзаце в таблице или в уравнении. Затем нужно называть getParent более одного раза, пока не дойдете до Тела. Я не пытался реализовать этот дополнительный цикл, потому что
findText
предыдущий результат поиска вfindText
в качестве второго параметра, можно получить другой результат поиска (илиnull
если его больше нет).