如何获取文档的一部分链接(标题,段落,部分......)

时间:2012-09-02 11:18:41

标签: google-apps-script

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

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

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

问题是:如何在运行时将相似的url / id添加到代码中的“Section 1”并稍后将其用作链接?

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

谢谢!

4 个答案:

答案 0 :(得分: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);
    }

  }
}

答案 1 :(得分:2)

现在不可能在没有TOC的情况下获得文档部分(部分,段落等)链接。此外,无法管理GAS中的书签。问题跟踪器上有issue。您可以将问题加以解决,以宣传它。

使用TOC有一种解决方法。以下代码显示了如何从TOC获取URL。它仅在TOC存在时有效,如果删除它,则链接不再起作用。

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,迭代它,变量itemTextitemUrl包含TOC项目文本和URL。网址格式为#heading=h.uuj3ymgjhlie

答案 2 :(得分: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(".");  

答案 3 :(得分:0)

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

如果您将文档存储为text / html,您可以更好地控制文档的组装方式以及如何使用锚点进行曝光。