3

我正在使用一些标题结构动态创建文档

doc = DocumentApp.create("My Document");
doc.appendParagraph("Main").setHeading(DocumentApp.ParagraphHeading.HEADING1);
var section = doc.appendParagraph("Section 1");
section.setHeading(DocumentApp.ParagraphHeading.HEADING2);

我可以在线打开它,插入目录,并可以通过 url 直接访问“第 1 节”,例如: https ://docs.google.com/document/d/1aA...FQ/edit#heading=h.41bpnx2ug57j

问题是:如何在运行时获得与代码中的“第 1 节”类似的 url/id 并稍后将其用作链接?

如果我不能 - 有没有办法设置锚/书签之类的东西并获取它的网址?

谢谢!

4

4 回答 4

3

开始深入测试 Google Apps 时,我遇到了与目录管理相关的有限功能的问题。我碰到了您提出的代码,并以此为起点编写了我自己的函数来格式化目录: - 应用适当的标题样式, - 对不同部分进行编号。

我希望这可以帮助你们中的一些人改进 Google 文档模板:

/**
* Used to properly format the Table of Content object
*/
function formatToc() {

  //Define variables
  var level1 = 0;
  var level2 = 0;

  // Define custom paragraph styles.
  var style1 = {};
  style1[DocumentApp.Attribute.FONT_FAMILY] = DocumentApp.FontFamily.ARIAL;
  style1[DocumentApp.Attribute.FONT_SIZE] = 18;
  style1[DocumentApp.Attribute.BOLD] = true;
  style1[DocumentApp.Attribute.FOREGROUND_COLOR] = '#ff0000';

  var style2 = {};
  style2[DocumentApp.Attribute.FONT_FAMILY] = DocumentApp.FontFamily.ARIAL;
  style2[DocumentApp.Attribute.FONT_SIZE] = 14;
  style2[DocumentApp.Attribute.BOLD] = true;
  style2[DocumentApp.Attribute.FOREGROUND_COLOR] = '#007cb0';

  // Search document's body for the table of contents (assuming there is one and only one).
  var toc = doc.getBody().findElement(DocumentApp.ElementType.TABLE_OF_CONTENTS).getElement().asTableOfContents();

  //Loop all the table of contents to apply new formating
  for (var i = 0; i < toc.getNumChildren(); i++) {

    //Search document's body for corresponding paragraph & retrieve heading
    var searchText = toc.getChild(i).getText();
    for (var j=0; j<doc.getBody().getNumChildren(); j++) {
      var par = doc.getBody().getChild(j);
      if (par.getType() == DocumentApp.ElementType.LIST_ITEM) {
        var searchcomp = par.getText();
        if (par.getText() == searchText) {
          // Found corresponding paragrapg and update headingtype.
          var heading = par.getHeading();
          var level = par.getNestingLevel();
        }
      }
    }

    //Insert Paragraph number before text
    if (level==0) {
      level1++;
      level2=0;
      toc.getChild(i).editAsText().insertText(0,level1+". ");
    }
    if (level==1) {
      level2++;
      toc.getChild(i).editAsText().insertText(0,level1+"."+level2+". ");
    }

    //Apply style corresponding to heading
    if (heading == DocumentApp.ParagraphHeading.HEADING1) {
      toc.getChild(i).setAttributes(style1);
    }
    if (heading == DocumentApp.ParagraphHeading.HEADING2) {
      toc.getChild(i).setAttributes(style2);
    }

  }
}
于 2013-10-11T15:38:59.503 回答
2

现在,如果没有 TOC,就不可能获得文档部分(部分、段落等)链接。也没有办法从 GAS 管理书签。问题跟踪器存在问题。您可以为该问题加注星标以进行宣传。

有一个使用 TOC 的解决方法。以下代码显示了如何从 TOC 获取 URL。它仅在目录存在时才有效,如果删除它,链接将不再有效。

function testTOC() {
  var doc = DocumentApp.openById('here is doc id');
  for (var i = 0; i < doc.getNumChildren(); i++) {
    var p = doc.getChild(i);
    if (p.getType() == DocumentApp.ElementType.TABLE_OF_CONTENTS) {
      var toc = p.asTableOfContents();
      for (var ti = 0; ti < toc.getNumChildren(); ti++) {
        var itemToc = toc.getChild(ti).asParagraph().getChild(0).asText();
        var itemText = itemToc.getText();
        var itemUrl = itemToc.getLinkUrl();
      }
      break;
    }
  }
}

该函数迭代所有文档部分,找到第一个 TOC,迭代它和变量itemText,并itemUrl包含一个 TOC 项目文本和 URL。URL 有#heading=h.uuj3ymgjhlie格式。

于 2012-09-03T08:19:30.567 回答
1

自从编写接受的答案以来,就引入了在 Google Apps 脚本代码中管理书签的功能。因此可以获得类似的URL,尽管与示例中的 URL 不完全相同。您可以在节标题处手动插入书签,并使用该书签链接到节标题。就问题而言,似乎就足够了。这是一些示例代码(包括对问题代码的轻微修改):

var doc = DocumentApp.getActiveDocument();
var body = doc.getBody();
body.appendParagraph("Main").setHeading(DocumentApp.ParagraphHeading.HEADING1);
var section = body.appendParagraph("Section 1");
section.setHeading(DocumentApp.ParagraphHeading.HEADING2);

// create and position bookmark
var sectionPos = doc.newPosition(section, 0);
var sectionBookmark = doc.addBookmark(sectionPos);

// add a link to the section heading
var paragraph = body.appendParagraph("");
paragraph.appendText("Now we add a ");
paragraph.appendText("link to the section heading").setLinkUrl('#bookmark=' + sectionBookmark.getId());
paragraph.appendText(".");  
于 2017-08-25T00:24:39.333 回答
0

该文档是否必须是原生 Google 文档类型(即 application/vnd.google-apps.document)?

如果您将文档存储为 text/html,您将更好地控制如何组装文档以及如何公开它,例如使用锚点。

于 2012-09-05T11:39:00.130 回答