我在我的文档中搜索一个占位符,该占位符是一个列表项(例如body.findText('{{list}}')
。我有一系列要插入此列表的项目。
一旦我有了listItem元素,我该如何向它添加更多listItems?我希望有类似foundListItem.getParent().appendListItem(items[i])
我已经搜索了这个问题的答案,并且看到了一些需要一些艰巨的努力才能完成的答案。 必须是一种更简单的方法!例如,将它们附加到底部并确定将其移动到哪里是一个荒谬的答案。
答案 0 :(得分:1)
这看起来很麻烦,列表由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"]);
适用于编号列表和项目符号列表。如果有两个或更多占位符,它将只替换最后一个占位符。
如果有人可以批评这一点,我会有兴趣听到更有效的方法来查找和操纵给定的元素,因为看起来我的解决方案比我预期的要多得多。
答案 1 :(得分:0)
我能够使用以下代码实现所需的行为:
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
})
}
请注意,不使用模板字符串,这次对我来说没问题;但是,要找到模板字符串&#39; {{list}}&#39;并用我发现的数据替换它:
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)
})
}