使用应用脚本检测Google文档中的PAGE_BREAK元素

时间:2019-04-12 10:49:05

标签: javascript google-apps-script google-docs google-docs-api add-on

问题陈述:

我有一个N页的Google文档。要求将每个页面转换为单独的Google文档。

尝试过的解决方案:

试图通过解析正文来查找PAGE_BREAK元素,并在检测到PAGE_BREAK时创建范围,复制内容,然后创建新的Google文档。

问题:

使用第1页上的一行文本和第2页上的一行文本创建了示例文档。解析文档时,无法检测到PAGE_BREAK元素。我期望当内容流到第2页时,应该有PAGE_BREAK,在这种情况下应该是PARAGRAPH元素的子级。 以下是我尝试过的示例Google应用脚本代码段:

min(x for x in itertools.chain.from_iterable(lst) if x != 0)

关于如何解决此问题的任何建议。

日志:

var activeDocument = DocumentApp.getActiveDocument();
var body = activeDocument.getBody();

function resetDoc() {
  body.clear(); 
  // When PAGE BREAK is added via script, I am able to detect the PAGE_BREAK element using findElement method only.
  // body.appendParagraph("Page 1");
  // body.appendPageBreak();
  // body.appendParagraph("Page 2");
}


function init() {
  const tree = extractTree(body);
  Logger.log(tree);
}


function extractTree(element) {
  const node = {
    element: element,
  };
  if (element.getNumChildren) {
    var numChildren = element.getNumChildren();

    var children = [];

    for (var i = 0; i < numChildren; i++) {
      var child = element.getChild(i);
      var found = findBreak(element);
      if(found)
      {
        Logger.log("Found page break at" + i );
      }
      var childNode = extractTree(child);
      Logger.log(child.getType());
      children.push(childNode);
    }

    node["children"] = children;
  }

  return node;
};


function findBreak(element) {
  var searchType = DocumentApp.ElementType.PAGE_BREAK;
  var breakElement = body.findElement(searchType);
  if(breakElement) {
    Logger.log("Found page break");
    return true;
  } else {
    Logger.log("No page break");
    return false;
  }
}

[19-04-12 15:46:32:706 IST] PARAGRAPH应该是PAGE_BREAK,但它是一个PARAGRAPH。

示例Google文档:
https://docs.google.com/document/d/1bs_Jcfs-n1VEx65Ew5buBpsf_JCHgX0A7NHYIY8mAqw/edit?usp=sharing

参考链接:
1. Google应用脚本文档
   https://developers.google.com/apps-script/reference/document/page-break

1 个答案:

答案 0 :(得分:0)

首先,我不确定是否正确理解该任务,因为通常情况下,拥有N个可视页面并不意味着拥有N-1个显式分页符。我建议您只使用显式分页符,因为您已经尝试过查找它们。

在这种情况下,用于复制文档片段的最有用的单元(对象)是Paragraph。以下函数采用所有文档段落,并检查每个段落以包含PAGE_BREAK元素。如果找到PAGE_BREAK,则表示一页的结尾,另一页的开头。当然,我们应该在此时创建一​​个新的目标文档以继续复制。

function copyPartsByPageBreaks() {
  var activeDoc = DocumentApp.getActiveDocument();
  var pars = activeDoc.getBody().getParagraphs();
  var pageIndex = 0;
  var targetBody = DocumentApp.create('PageBreak.' + pageIndex).getBody();
  while (pars.length > 0) {
    var p = pars.shift();
    targetBody.appendParagraph(p.copy());
    if (p.findElement(DocumentApp.ElementType.PAGE_BREAK) != null) {
      pageIndex++;  // Prepare a new target place for coping
      targetBody = DocumentApp.create('PageBreak.' + pageIndex).getBody();
    }
  }
}