因为这总是假的:
doc.getBody().getParagraphs()[0] == doc.getBody().getParagraphs()[0]
如何在Apps-Script中测试元素相等性?
答案 0 :(得分:1)
我不完全确定你是在比较内容还是位置。假设您可以将内容与getAsText()进行比较。
要比较位置,创建元素索引(元素在文档中出现的路径)相当容易。
/**
* create a path in document serial for an element
* @param {Document.Element} element an element
* @param {string} [path=''] the path so far
* @return {string} the path
*/
function pathInDocument (element,path) {
path = path || "" ;
var parent = element.getParent();
if (parent) {
path = pathInDocument( parent , Utilities.formatString ( '%04d.%s', parent.getChildIndex(element),path ));
}
return path;
};
可以像这样调用
var path = pathInDocument(element);
并将返回类似
的内容0000.0001.0004 ....等
如果两个元素的路径相同,则它们出现在文档中的相同位置,因此是相同的元素。
有关使用此功能的示例(在本例中为书签排序),请参阅http://ramblings.mcpher.com/Home/excelquirks/docs/sortbookmarks
答案 1 :(得分:0)
我尝试了它并且它总是假的,由于某种原因,该方法返回不同的对象。
在这种情况下,您要比较对象而不是对象的内容,这些对象确实是不同的。您可以使用.getText()获取对象的内容,然后此比较将返回true。
答案 2 :(得分:0)
最终我想出了一个比较元素的解决方案。
首先让我指出这段代码有效并返回true:
var paragraphs = doc.getBody().getParagraphs();
Logger.log(paragraphs[0] == paragraphs[0]);
这是因为您正在比较数组中的相同元素。你在问题中的方式,你有两个不同的段落数组。
然而,有些情况下你不能这样做,因为你可能没有比较段落,或者你甚至不知道你有什么元素。
我所做的是创建一直到元素的路径,一直到Document的body部分。如果路径相同,则具有相同的元素。
function bodyPath(el, path) {
path = path? path: [];
var parent = el.getParent();
var index = parent.getChildIndex(el);
path.push(index);
var parentType = parent.getType();
if (parentType !== DocumentApp.ElementType.BODY_SECTION) {
path = bodyPath(parent, path);
} else {
return path;
};
return path;
};
function isSameElement(element1, element2) {
var path1 = bodyPath(element1);
var path2 = bodyPath(element2);
if (path1.length == path2.length) {
for (var i=0; i<path1.length; i++) {
if (path1[i] !== path2[i]) {
return false;
};
};
} else {
return false;
};
return true;
};
这种方法证明自己很快。欢迎任何添加!
答案 3 :(得分:0)
我编写了一个递归解决方案,以避免字符串比较和路径短路。请注意,如果您对递归的堆栈依赖性不满意,则可以始终转换为循环。
function isSameElement(elem1, elem2) {
if (!elem1 && !elem2) return true;
if (!elem1 || !elem2) return false;
var p1=elem1.getParent();
var p2=elem2.getParent();
if (!p1 && !p2) {
return true;
} else if (!p1 || !p2) {
return false;
} else if (p1.getChildIndex(elem1)==p2.getChildIndex(elem2)){
return isSameElement(p1,p2);
} else {
return false;
}
}