我希望目录仅包含标题1,而不包含其他任何标题。有没有一种方法可以将表格设置为不包含某些标题的内容?

#1 楼

不幸的是,Google文档不支持隐藏特定的标题级别。

唯一的“解决方案”是将要隐藏的标题更改为“普通”样式,然后手动设置每个标题的字体格式。


避免将所有标题添加到目录中的唯一方法是手动应用所需的样式,而不使用设置的样式。通过分别选择每个标题并按Ctrl + \(Ctrl +反斜杠键),将这些标题更改为“普通”样式。这将删除格式。然后手动添加所需的磅值,字体和粗体。

要轻松地将格式从一个地方复制到另一个地方,可以使用“绘制工具”。因此,一旦您手动更改了一个标题,就可以使用“绘画工具”来更改其他与相同标题相同的标题。

-来源:Google文档论坛:如何仅在目录中显示标题1 br />

#2 楼

前面的答案建议将标题的样式设置为“ Normal”,并手动将其样式设置为类似于标题。如果这样做,您将无法从文档中链接到该标头。

看起来您实际上可以从目录中手动删除项目。我认为这是一种更简单的方法。

评论


但是,每次更新目录时,您都必须这样做。

–罗伊
17年9月27日在16:53

另外,插入目录时,将计算页码。因此,如果带有额外标题的目录在四处移动,则删除多余的行后,页码将是错误的。

–劳拉
17-10-11在19:24

#3 楼

我为解决可能是特定于文档的问题而做了的工作,但是我使用的是H1到H3,我不想在TOC中显示H4。我将所有H4都转换为字幕,然后按照我想要的方式设置了字幕的样式。

字幕没有出现在目录中。

如何将所有标题转换为另一个标题标题:

评论


我必须屏住呼吸来对此表示赞同,因为它是如此骇人听闻,但似乎没有更好的选择。谢谢@donnoman!

– yoyo
20-2-6在18:06

为什么选择Google?为什么!!! 1!11 !! 1one !!?

–阿德里安
20年4月21日在21:44

#4 楼

据我所知,正如其他答案所述,在Google Docs上无法执行此操作。但是,似乎可以使用另一种方法来访问Microsoft Word:
将文档从Google云端硬盘导出到.docx文件中,这可以在选择希望以何种格式下载文档时完成。在Word中打开它,并使用以下指南更改目录:https://support.office.com/en-us/article/format-or-customize-a-table-of-contents-9d85eb9c-0b55-4795 -8abb-a49885b3a58d#layout

指南概述:

从顶部栏中的References>Table of Contents中选择下拉列表。
从列表中选择Custom Table of Contents...
要更改目录中显示的级别数,请单击Show levels,然后单击所需的级别数。


我尚未对此进行测试,因此我将对其进行编辑答案有更多反馈。

评论


该黑客是只是转储谷歌文档!爱它!

–阿德里安
20-04-21在22:08

#5 楼

是的,有一个解决方法,您可以保持标题结构。


在文档顶部,写出要显示在目录中的文本。例如,第1章,第2章
选择第一个短语,并使其成为超链接。
您将看到该链接的选项,包括选择现有的标题。


#6 楼

Google文档中的目录确实是半熟的。
选择表头级别或将格式更改为默认值的唯一方法是在每次更新表后手动重做任何此类操作。但是,在此线程前面的“ Laura”提出的观点上,这也不起作用,因为页码是在目录插入后立即计算的,并因此受到其默认格式的表格高度的影响。因此,这是(可悲的)您需要做的,以使您对Google Docs目录有一个可控制的外观,据我所知:

完成文字。
在文档的所需位置插入一个空白页以用作目录的占位符。
在文档的最后一个字符后添加空白页,然后在其中插入目录
对目录进行必要的修改(手动)
从最后一页上手动剪切更新后的目录并将其粘贴到先前创建的占位符页面上。

此方法有效,但它使你哭... :(

#7 楼

我真的试图为此寻求更好的解决方案,并且走得更远。我认为,如果没有Google适当解决这些缺陷,您将可以做到。我的解决方案不是很好,但并不完全令人震惊。定制的TOC是在单独的Google文档(如模板)中设计的,并通过数据实现,并通过脚本添加到实际文档中。
共享了一个google文档,其中说明了解决方案,也可用于测试解决方案。
https://docs.google.com/document/d/1mlJ3rI04isifgncHHP0VWhO8NEmt395Re8lapuTcG3w
此处的代码(也在文档中):
function onOpen() {
  DocumentApp.getUi()
    .createMenu('My menu')
    .addItem('Custom Table of Contents', 'customTableOfContents')
    .addToUi();
}

function customTableOfContents(){
  var ui = DocumentApp.getUi();  

  //fetch content for the toc
  var textDoc = DocumentApp.getActiveDocument();
  var tocData = getTocData(textDoc);
  if (!tocData.content) {
    ui.alert(tocData.alert);
    return;
  }
  
  //fetch the "style sheet" for the toc and render the content accordingly
  var styleDoc = DocumentApp.openById('1chKuIuJDpQJEcHqn2AW1-W6exDyiknKLrmBXX-3KEDs');
  var renderResult = renderToc(textDoc,styleDoc,tocData.content);
  if (!renderResult.success) {
    ui.alert(renderResult.alert);
    return;    
  }

  //clean up empty rows at document end
  var textDocBody = textDoc.getBody();
  var lastElement = textDocBody.getChild(textDocBody.getNumChildren()-2);
  while (lastElement.getText() == "") {
    textDocBody.removeChild(lastElement);
    lastElement = textDocBody.getChild(textDocBody.getNumChildren()-2);
  }

  if (tocData.dataCollectionStep == 1) {
  //position cursor at the end of the document, prompt user to insert a native table of content
  //and to run the function again.
    var position = textDoc.newPosition(textDocBody.getChild(textDocBody.getNumChildren()-1), 0);
    textDoc.setCursor(position);    
    ui.alert(tocData.alert);
    return;
  }
  
  //we are done!
  if (renderResult.customTocPosition > 0) {
    var position = textDoc.newPosition(textDocBody.getChild(renderResult.customTocPosition), 0);
    textDoc.setCursor(position);
  }
}

function getTocData(doc){
  //build an array of data for the toc
  var docBody = doc.getBody();
  var paragraphs = docBody.getParagraphs();
  var statusMessage;
  var nativeToc;
  var dataCollectionStep = 0;
  try {
    //if a native table of contents exists we assume we are running the function for the second time
    dataCollectionStep = 2;
    nativeToc = docBody.findElement(DocumentApp.ElementType.TABLE_OF_CONTENTS).getElement().asTableOfContents();
  } catch(e) {
    //if no native table of content exists we assume we are running the function for the first time
    dataCollectionStep = 1;
    statusMessage = 'Table of content has been generated but is missing page references and interactive links.' + String.fromCharCode(10) + 
      'To add the missing parts, please select "Table of content" from the "Insert" menu.' + String.fromCharCode(10) + 
      'Then run the "Custom table of content" again.';
  }
  
  var customTocData = [];
  for(var i=0;i<paragraphs.length;i++) { 
    if (paragraphs[i].getText().trim() == "") continue;
    if (paragraphs[i].getHeading() == DocumentApp.ParagraphHeading.NORMAL) continue;
    if (paragraphs[i].getHeading() == DocumentApp.ParagraphHeading.SUBTITLE) continue;
    if (paragraphs[i].getHeading() == DocumentApp.ParagraphHeading.TITLE) continue;

    if (dataCollectionStep == 2) {
      //extracting url-data and page numbers from the native table of contents 
      var nativeTocRecord = nativeToc.getChild(customTocData.length).asParagraph();
      var textAndPage = nativeTocRecord.getText().split(String.fromCharCode(9));        
      if (paragraphs[i].getText().trim() != textAndPage[0]) {
        statusMessage = "Error at row " + i + String.fromCharCode(10) + 'Please manually refresh the table of contents and try again!';
        return {
          content: null,
          dataCollectionStep : dataCollectionStep,
          alert: statusMessage
        };
      }
    }
    customTocData.push({
      heading : paragraphs[i].getHeading(),
      description : paragraphs[i].getText(),
      hyperlink : (dataCollectionStep == 2) ? nativeTocRecord.getChild(0).asText().getLinkUrl(2) : "",
      page : (dataCollectionStep == 2) ? textAndPage[1] : "N/A"
    });
  }
  //removing the native table of contents
  if (dataCollectionStep == 2) docBody.removeChild(nativeToc);
  return {
    content: customTocData,
    dataCollectionStep : dataCollectionStep,
    alert: statusMessage
  };
}

function renderToc(textDoc,styleDoc,tocData){
  var textDocBody = textDoc.getBody();
  var styleHeaderText = styleDoc.getBody().getChild(0).getText().trim().toUpperCase();
  var styleTable = styleDoc.getBody().getChild(1).asTable();
  var customToc;
  var tocIdx = -1;
  
  var featuredHeadings = [];
  for (var i=0;i<styleTable.getNumRows();i++){
    var str = styleTable.getRow(i).getCell(0).getText().trim().toUpperCase();
    switch(str){
      case "FIRST LEVEL" : featuredHeadings.push(DocumentApp.ParagraphHeading.HEADING1);break;
      case "SECOND LEVEL" : featuredHeadings.push(DocumentApp.ParagraphHeading.HEADING2);break;
      case "THIRD LEVEL" : featuredHeadings.push(DocumentApp.ParagraphHeading.HEADING3);break;
      case "FOURTH LEVEL" : featuredHeadings.push(DocumentApp.ParagraphHeading.HEADING4);break;
      case "FIFTH LEVEL" : featuredHeadings.push(DocumentApp.ParagraphHeading.HEADING5);break;
      case "SIXTH LEVEL" : featuredHeadings.push(DocumentApp.ParagraphHeading.HEADING6);break;
    }
  }
  //locate where to insert the custom Table of Contents, delete the current of if there is one and add an empty table element.
  //then copy the attributes from the table element in the style doc
  for(var i=0;i<textDocBody.getParagraphs().length;i++){
    //the below assumes that the text doc has a header paragraph with the same text (i.e "Table of content") as the header for the table in the style doc 
    if (textDocBody.getParagraphs()[i].getText().trim().toUpperCase() == styleHeaderText) {
      tocIdx = i+1;
      if (textDocBody.getChild(tocIdx).getType() == DocumentApp.ElementType.TABLE) textDocBody.removeChild(textDocBody.getChild(tocIdx))
      customToc = textDocBody.insertTable(tocIdx).asTable();
      break;
    }
  }
  if (!customToc){
    var errorMessage = "Can not figure out where to insert the Table of Contents. Please check that there is a header for it in the text document.";
    return {
      success : false,
      customTocPosition : tocIdx,
      alert : errorMessage
    }
  }
  customToc.setAttributes(styleTable.getAttributes());

  for (var i=0;i<tocData.length;i++){
    var templateRowIdx = featuredHeadings.indexOf(tocData[i].heading);
    if (templateRowIdx < 0) continue;

    var styleRow = styleTable.getRow(templateRowIdx);    
    var destinationRow = customToc.appendTableRow(styleRow.copy());

    var destinationCell1 = destinationRow.getCell(0);
    destinationCell1.setText(tocData[i].description);
    //tablerow.copy() does not include the cell width of the copied child cells. Below is a hack to work around that...
      destinationCell1.setWidth(styleRow.getCell(0).getWidth());
    //setLinkUrl forces blue color and underline to text. Below is a hack to work around that...
      var underline = destinationCell1.isUnderline();
      var foregroundColor = destinationCell1.getForegroundColor();
      destinationCell1.setLinkUrl(tocData[i].hyperlink);
      destinationCell1.setUnderline(underline);
      destinationCell1.setForegroundColor(foregroundColor);

    var destinationCell2 = destinationRow.getCell(1);
    destinationCell2.setText(tocData[i].page);
    //tablerow.copy() does not include the cell width of the copied child cells. Below is a hack to work around that...
      destinationCell2.setWidth(styleRow.getCell(1).getWidth());
  }
  return {
    success : true,
    customTocPosition : tocIdx,
    comment : ''
  }
}