Apps-Script:元素相等?

时间:2015-01-22 23:09:10

标签: google-apps-script google-docs

因为这总是假的:

doc.getBody().getParagraphs()[0] == doc.getBody().getParagraphs()[0]

如何在Apps-Script中测试元素相等性?

4 个答案:

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