如何判断我添加到文档中的段落是否会导致分页?

时间:2018-03-19 17:49:20

标签: google-apps-script google-docs

我正在浏览谷歌工作表并从中创建一个谷歌文档。

到目前为止,文字很好。但是 - 我希望有一种方法可以测试我要添加的段落是否会导致分页。我想保留我在一页上附加所有内容的段落。 (IE - 如果我要添加的段落将导致分页,然后添加分页符然后再写段落)

我不想在循环的每次迭代之后创建分页符以将其全部保存在一个页面上。有任何想法吗?

body.clear();
var values = result.values;
for (var i = 1; i < numRows; i++) {
    // Insert text at the end of the document.
    if (values[i][3] != 'N') {
        body.appendParagraph(values[i][0]);
    }
}

1 个答案:

答案 0 :(得分:1)

我提出了一个部分解决方案,它受到严重限制,可能不适用于您的情况,特别是因为您以编程方式获得了段落。

鸟瞰该过程如下:

  1. 计算文档页面的高度。
  2. 计算您要追加的段落的高度。
  3. 调用 body.appendParagraph(段落)并从页面高度中减去段落高度。继续重复,直到 pageHeight&lt; paragraphHeight 即可。
  4. 插入分页符,重置 pageHeight 的值。
  5. 第1步是最简单的。只需从页面的高度值中减去顶部和底部边距即可计算可用空间量。

    var marginTop = body.getMarginTop();
    var marginBottom = body.getMarginBottom();
    var pageHeight =  body.getPageHeight() - marginTop - marginBottom;
    

    第2步 - 痛苦来了。 Google不会为您提供任何方法来计算段落高度。所以我的想法是计算单个线的数量并使用公式近似高度

    height = numberOfLines * (fontSize + lineSpacing);
    

    然而,这个公式非常不准确 - 由于单位测量的差异,它高估了高度。因此,我将pageHeight设置为:

      pageHeight -= templateHeight;
    

    请注意,如果您尝试通过调用 paragraph.getAttributes()来获取段落的样式,则生成的对象的所有属性都将为“NULL”,除非您按如下方式明确设置它们:

     var style = {};
      style[DocumentApp.Attribute.FONT_SIZE] = 11;
      style[DocumentApp.Attribute.LINE_SPACING] = 0.5;
      paragraph.setAttributes(style);
    

    这将我们带到潜在的交易破坏者 - 无论您的方法是什么,似乎都没有办法计算单个行的数量。 请参阅此处的评论Counting the number of lines in Google Document

    所以,目前,除了确保所有段落的行数相同之外,没有其他解决方案可以解决这个问题。 如果你继续这个假设,步骤3和4很容易。

    在下面的代码中,我使用'doc'中的段落作为模板并将其粘贴到目标文档中。一切都按预期工作,但上述限制可能会使解决方案对您的案例无用,除非您找到解决方法。

    var doc = DocumentApp.getActiveDocument();
    var body = doc.getBody();
    var targetDoc = DocumentApp.openById("YOUR_ID");
    var targetBody = targetDoc.getBody();
    
    //explicitly set styles for the template paragraph
      var template = body.getParagraphs()[0];         
      var numLines = 11; //hard-coded value
      var fontSize = 11;
      var lineSpacing = 0.5;
      var style = {};
      style[DocumentApp.Attribute.FONT_SIZE] = fontSize;
      style[DocumentApp.Attribute.LINE_SPACING] = lineSpacing;
    
      template.setAttributes(style);
    
    var marginTop = body.getMarginTop();
    var marginBottom = body.getMarginBottom();
    var pageHeight =  body.getPageHeight() - marginTop - marginBottom;
    
      var templateHeight = numLines*(fontSize + numLines);
      pageHeight -= templateHeight;
    
      var pageSpaceLeft = pageHeight;
    
      for (var i=0; i < 20; i++) {
    
      var newPar = template.copy();
    
        if (pageSpaceLeft < templateHeight) { 
          targetBody.appendPageBreak(); 
          pageSpaceLeft = pageHeight;
        }
    
      pageSpaceLeft -= templateHeight;
      targetBody.appendParagraph(newPar);
    
      }