Поскольку это всегда ложь:Приложения-Script: равенство элементов?
doc.getBody().getParagraphs()[0] == doc.getBody().getParagraphs()[0]
Как вы тестируете элемент равенства в Apps-Script?
Поскольку это всегда ложь:Приложения-Script: равенство элементов?
doc.getBody().getParagraphs()[0] == doc.getBody().getParagraphs()[0]
Как вы тестируете элемент равенства в Apps-Script?
Я пробовал, и его всегда ложь, по какой-то причине метод возвращает разные объекты.
В этом случае вы сравниваете объекты, а не содержимое объектов, которые действительно отличаются друг от друга. Вы можете получить содержимое объекта с помощью .getText(), тогда это сравнение вернет true.
В конце концов я придумал решение для сравнения элементов.
прежде всего позвольте мне отметить, что этот код работает и возвращает истину:
var paragraphs = doc.getBody().getParagraphs();
Logger.log(paragraphs[0] == paragraphs[0]);
это потому, что вы сравниваете один и тот же элемент из массива. Как вы это делали в вопросе, у вас было два разных массива абзацев.
Однако есть ситуации, когда вы не можете этого сделать, потому что вы не можете сравнивать параграфы или вы даже не знаете, какие у вас есть элементы.
Что я делаю, это создать путь к элементам вплоть до части тела документа. Если пути равны, у вас одни и те же элементы.
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;
};
Этот метод оказался довольно быстрым. Любые дополнения приветствуются!
Я не совсем уверен, сравниваете ли вы содержимое или позицию. Предположим, вы можете сравнить содержимое с 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 .... и т.д.
Если дорожкам два элементы одинаковы, они отображаются в одном и том же положении в документе и, следовательно, являются одним и тем же элементом.
В качестве примера использования этого (в данном случае для сортировки закладок) см
я написал рекурсивное решение, чтобы избежать сравнения строк и короткое замыкание пути ходьбы. Обратите внимание, что вы всегда можете преобразовать в циклы, если вас не устраивает зависимость рекурсии от стека.
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;
}
}
Я стараюсь избегать сравнения текста абзацев, потому что разные абзацы могут иметь один и тот же текст. Обычно я сравниваю, если элементы имеют один и тот же родительский элемент и они находятся в одном и том же индексе. – filipeglfw
Не будет ли у вас такой же проблемы с родительскими объектами? p1 == p2 ниже всегда false.Это явно недостаток в GAS, по крайней мере, каждый элемент должен обеспечить getUniqueId(), чтобы сделать это возможным. var p1 = doc.getBody(). GetParagraphs() [0] .getParent(); var p2 = doc.getBody(). GetParagraphs() [0] .getParent(); Logger.log (p1 == p2); –
Извините, я не очень хорошо объяснил. Я сравниваю тип родителей, чтобы избежать сравнения первого абзаца в таблице, и первый абзац в разделе тела возвращает то же самое. Если необходимо, вы можете повторить процесс родителям, так что, если оба абзаца находятся в пределах таблиц, вы знаете, что таблицы одинаковы или нет ... И это может быть сделано до самого Тела, которое является уникальным в документ. – filipeglfw