2015-01-22 1 views

ответ

0

Я пробовал, и его всегда ложь, по какой-то причине метод возвращает разные объекты.

В этом случае вы сравниваете объекты, а не содержимое объектов, которые действительно отличаются друг от друга. Вы можете получить содержимое объекта с помощью .getText(), тогда это сравнение вернет true.

+0

Я стараюсь избегать сравнения текста абзацев, потому что разные абзацы могут иметь один и тот же текст. Обычно я сравниваю, если элементы имеют один и тот же родительский элемент и они находятся в одном и том же индексе. – filipeglfw

+0

Не будет ли у вас такой же проблемы с родительскими объектами? p1 == p2 ниже всегда false.Это явно недостаток в GAS, по крайней мере, каждый элемент должен обеспечить getUniqueId(), чтобы сделать это возможным. var p1 = doc.getBody(). GetParagraphs() [0] .getParent(); var p2 = doc.getBody(). GetParagraphs() [0] .getParent(); Logger.log (p1 == p2); –

+0

Извините, я не очень хорошо объяснил. Я сравниваю тип родителей, чтобы избежать сравнения первого абзаца в таблице, и первый абзац в разделе тела возвращает то же самое. Если необходимо, вы можете повторить процесс родителям, так что, если оба абзаца находятся в пределах таблиц, вы знаете, что таблицы одинаковы или нет ... И это может быть сделано до самого Тела, которое является уникальным в документ. – filipeglfw

0

В конце концов я придумал решение для сравнения элементов.

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

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; 
}; 

Этот метод оказался довольно быстрым. Любые дополнения приветствуются!

0

Я не совсем уверен, сравниваете ли вы содержимое или позицию. Предположим, вы можете сравнить содержимое с 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 .... и т.д.

Если дорожкам два элементы одинаковы, они отображаются в одном и том же положении в документе и, следовательно, являются одним и тем же элементом.

В качестве примера использования этого (в данном случае для сортировки закладок) см

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; 
    } 
} 
Смежные вопросы