вставить элементы в список - PullRequest
0 голосов
/ 18 мая 2018

Я ищу заполнитель в моем документе, который является единственным элементом списка (например, body.findText('{{list}}'). У меня есть массив элементов, которые я хочу вставить в этот список.

Как только у меня есть элемент listItem, как мне добавить больше listItems к нему? Я ожидаю, что будет что-то вроде foundListItem.getParent().appendListItem(items[i])

Я искал ответ на этот вопрос и видел несколько ответов, которые требуют каких-то Herculean усилий, чтобы осуществить* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * <*> <1007 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * <…> <1008> * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - «Смешение их до дна и выяснение того, куда его переместить» - нелепый ответ.

Ответы [ 2 ]

0 голосов
/ 22 мая 2018

Мне удалось реализовать желаемое поведение с помощью этого кода:

function updateList(){
  var listItem = DocumentApp.getActiveDocument().getBody().getListItems()[0]
  var list = listItem.getParent()
  var index = list.getChildIndex(listItem)
  debug && Logger.log('ListItem ['+index+'] parent: '+list.getType()) // debug=true logging

  // remove listItem
  list.removeChild(listItem)

  // add new children
  var names = getList() // function retrieves a list of rows from spreadsheet.
  names.forEach(function (v){
    list.insertListItem(index++, v[1]) // the second element is the name
  })
}

Обратите внимание, что это не делает это со строкой шаблона, что хорошо для меня на этот раз; однако, чтобы найти строку шаблона '{{list}}' и заменить ее данными, я обнаружил, что это работает:

function findListItem(str) {
  if (str == undefined) str = '{{list}}'
  debug && Logger.log(str)
  var a = ['one', 'two', 'three']
  var body = DocumentApp.getActiveDocument().getBody()
  var match = body.findText(str)
  if (match == null) {
    debug && Logger.log('No match')
    return
  }
  var listItem = match.getElement().getParent()
  var list = listItem.getParent()
  var idx = list.getChildIndex(listItem)
  listItem.removeFromParent()
  a.forEach(function(s) {
    list.insertListItem(idx++, s)
  })
}
0 голосов
/ 19 мая 2018

Кажется довольно громоздким, списки составлены из ListItems, но, похоже, нет объекта List.Существует ListId, но он, похоже, не имеет никакой реальной функции, кроме того, что вы можете разделить свой список и продолжить номера.Похоже, вы можете только добавить ListItem к телу, но, похоже, нет простого способа получить индекс для ListItem, чтобы вы могли добавить после него.

Я написал функциюон будет перебирать все элементы в теле, чтобы найти ListItem с некоторым текстом-заполнителем и вернуть его индекс.

function findListItemWithText(text) {

  var doc = DocumentApp.getActiveDocument();
  var body = doc.getBody();
  var index = -1;

  for (var i=0; i<body.getNumChildren(); i++) {
    var child = body.getChild(i);

    if (child.getType() ==  DocumentApp.ElementType.LIST_ITEM) {

      var listItem = child.asListItem();
      if (listItem.getText() == text) {
         index = i;
      }
    }
  }
  return index;
}

Затем я написал функцию, которая заменит ListItem на элементы в массиве:

function replaceListItem (placeholder, list) {

  var index = findListItemWithText(placeholder);
  var doc = DocumentApp.getActiveDocument();
  var body = doc.getBody();

  var listItem = body.getChild(index).asListItem();

  // replace the text in the placeholder ListItem
  listItem.setText(list[0]);

  // append the rest of the list after the placeholder ListItem
  for (var i=1; i<list.length; i++) {
    body.insertListItem(index + i, list[i]);  
  }
}

Затем вы можете вызвать эту функцию с заполнителем и списком, и если естьэто ListItem с этим текстом, он добавит ListItems список в этой точке.

replaceListItem("{{list}}", ["One", "Two", "Three"]);

Работает для нумерованных и маркированных списков.Если будет два или более заполнителя, он просто заменит последний.

Если кто-то может критиковать это, мне было бы интересно услышать о более эффективных способах поиска и манипулирования данным элементом, как это кажется моим решением.гораздо больше усилий, чем я ожидал.

...