Более эффективный способ добавить элемент списка после некоторого текста в Документах Google

1

Итак, на данный момент у меня есть код, который позволяет мне вставлять 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")

Любая помощь очень ценится!

Теги:
google-apps-script

1 ответ

3
Лучший ответ

Текстовые объекты представляют текст, самый низкий уровень структуры документа. В тексте не может быть других элементов, таких как элемент списка. Вот почему объекты 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 более одного раза, пока не дойдете до Тела. Я не пытался реализовать этот дополнительный цикл, потому что

  • не ясно, что вы хотите, чтобы элементы списка были в случайных местах, таких как уравнения;
  • это было бы более сложным, чем подход, который вы уже имеете в отношении циклов над детьми.
  • 0
    Является ли «Если вставка должна быть глобальной, запустить цикл while с помощью findText:», означает ли это, что он находит все экземпляры «Это тест» и вставляет «Тестовый маркер» под каждым из них?
  • 1
    Да, это то, что он делает. findText предыдущий результат поиска в findText в качестве второго параметра, можно получить другой результат поиска (или null если его больше нет).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню