我正在使用一些标题结构动态创建文档
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”并稍后将其用作链接?
如果我不能 - 有没有办法设置类似锚/书签的东西并得到它的网址?
谢谢!
答案 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,迭代它,变量itemText
和itemUrl
包含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,您可以更好地控制文档的组装方式以及如何使用锚点进行曝光。