如何在Google Docs / Drive文档中给标题编号?

167

在谷歌文档/云端硬盘文档中,是否可以对标题进行编号?


95
它为什么仍然没有本地支持? - Janusz Skonieczny
12
2022年时仍然没有支持它的想象。 - Francesco Cariaggi
我期待着有一天,谷歌文档能够与Word 95达到同等水平。 - undefined
7个回答

142

如果你想要更加容易一些的方法,可以使用一个名为“目录”的Google插件来给你的标题编号。

安装这个插件:

  1. 点击“插件”>“获取插件”
  2. 点击“目录”图标或搜索此插件以安装它

然后你的目录应该会出现在侧边栏中。点击“标题编号格式”菜单,并选择1.2.3。

如果你的文档是旧的,需要重新格式化才能“刷新”编号,但实际上这个插件非常好用。

我在这个论坛看到了答案。


5
如果侧边栏没有显示,请转到“附加组件->目录表->在侧边栏中显示”。 - Steven Jeuris
3
我认为任何人都可以将他们的插件称为“目录”。因此,提供实际插件的链接会很有帮助。我猜你指的是这个:https://chrome.google.com/webstore/detail/table-of-contents/ickpeaanccmmabadbfiknbobkmkdnnaj - nealmcb
1
很遗憾,这个插件似乎出了问题。由于授权问题,它无法安装。其他人是否也遇到了同样的结果? - gavdotnet
@gavdotnet 你说得对,看起来谷歌目前已经禁用了这个插件/扩展.. :/ - Aitor
1
@gavdotnet 对我来说它有效,所以他们一定已经修复了它。 - codefreak
显示剩余4条评论

58

更新:现在可以在GitHub找到。

更新2:由于GitHub上的2个拉取请求,现在可以处理空标题和空行。

更新3:已修复GitHub和下面的代码以处理新的“文档标题”标识。


我修改了Mikko Ohtamaa提到的脚本,并创建了一个Google Apps脚本,添加了一个标题工具文档菜单,允许您:

  • 自动编号标题
  • 清除标题编号

如何自动编号Google文档标题:

  1. 打开您的文档 > 工具 > 脚本编辑器...
  2. 开始一个空项目
  3. 粘贴下面的代码并使用您喜欢的名称保存
  4. 选择运行 > onOpen并在第一次授权时授权脚本
  5. 选择运行 > onOpen
  6. 切换到您的文档并尝试在创建的标题工具自定义菜单上运行功能。

~~免责声明:您可能会遇到空标题的问题...但是您可以随时修复它们并再次运行操作。~~

要复制和粘贴的代码:

function onOpen() {
  DocumentApp.getUi().createMenu('Headings Tools')
  .addItem('Auto Number Headings', 'numberHeadingsAdd')
  .addItem('Clear Heading Numbers', 'numberHeadingsClear')
  .addToUi();
}

function numberHeadingsAdd(){
  numberHeadings(true);
}

function numberHeadingsClear(){
  numberHeadings(false);
}

function numberHeadings(add){
  var document = DocumentApp.getActiveDocument();
  var body = document.getBody();
  var paragraphs = document.getParagraphs();
  var numbers = [0,0,0,0,0,0,0];
  for (var i in paragraphs) {
    var element = paragraphs[i];
    var text = element.getText()+'';
    var type = element.getHeading()+'';

    // exclude everything but headings
    if (!type.match(/HEADING\d/)) {
      continue;
    }

    // exclude empty headings (e.g. page breaks generate these)
    if( text.match(/^\s*$/)){
      continue;
    }

    if (add == true) {
      var level = new RegExp(/HEADING(\d)/).exec(type)[1];
      var numbering = '';

      numbers[level]++;
      for (var currentLevel = 1; currentLevel <= 6; currentLevel++) {
        if (currentLevel <= level) {
          numbering += numbers[currentLevel] + '.';
        } else {
          numbers[currentLevel] = 0;
        }
      }
      Logger.log(text);
      var newText = numbering + ' ' + text.replace(/^[0-9\.\s]+/, '');
      element.setText(newText);
      Logger.log([newText]);
    } else {
      Logger.log(text);
      element.setText(text.replace(/^[0-9\.\s]+/, ''));
    }
  }

}

我很高兴认识@IvanCachicatari。我计划制作一个改进版,作为附加组件发布,这样我们就不需要每次都打开脚本编辑器了... - Luciano
2
@IvanCachicatari,好主意,这是您需要的!https://github.com/lpanebr/autoNumberHeadings - Luciano
2
@MrGravity 实现这个的方法是将脚本转换为Google Drive的附加组件。我计划这样做,但现在时间不够了。 - Luciano
1
哇!我感觉好像又回到了90年代。我们真的需要一个脚本来完成像标题编号这样基本的事情吗?现在我明白为什么有这么多编程倡议——我们的孩子们真的需要知道JavaScript才能写任何工作文档;P - Janusz Skonieczny
1
@Luciano 那 有点 有效。我看到了一件奇怪的事情发生。如果我从git中剪切和粘贴代码,我会得到两种结果之一:什么也不会发生或在第38行出现正则表达式解析错误。为了让它工作,我必须1)从10/16/17剪切并粘贴git代码,2)保存,3)手动进行nsof建议的更改,4)保存并按上面列出的方式运行。我注意到一个细微的区别:你版本中的第38行删除了\d周围的括号。 - Ginger McMurray
显示剩余11条评论

25
自2020年4月撰写起,许多提出的应用程序已经过时或不再可用。
我发现使用编号标题的方法如下:
  1. 转到“获取附加组件”
  2. 搜索并安装 Markdown Tools
Markdown Tools有一个选项可用于使用编号标题。它可以与Google内置目录完美配合使用。
要创建目录:
  1. 转到菜单项插入并选择目录

1
这非常有用!我从没想过一个简单的目录编号功能会在一个Markdown工具中,但它运行得很好,谢谢! - prrao
1
起初我不喜欢每次想要一个标题编号都必须选择菜单项。但是,我们可以直接输入标题编号,只有在非连续的标题编号开始变得烦人时才使用菜单项。我现在很欣赏这种“管道式”的实现方式。 - Axel Bregnsbo

20

你所要做的就是复制/粘贴先前的标题。

如果你复制并粘贴任何一个编号列表项,则它会保留其编号,并自动更改相关情况下的数字。


2
这个解决方案是多么实用,却被低估了。 - somethis
2
确实,这是最简单的、本地化的解决方案(如果你仍然处于编辑阶段)! - Demis
1
据我所知,这要求您在每个标题级别下降时缩进。是这样吗?还是有其他方法? - gavdotnet
5
问题是:你需要从同一文档中复制标题。例如,如果你从另一个HTML文档中复制“标题1”,尽管保留了“标题x”的格式,但它不会有编号。这意味着,如果你已经有另一个带有大量文本要复制粘贴的文档,那么你的解决方案将需要太多手动工作。或者更确切地说:如果你已经有一个文档,只是想在其中排列标题,这也是一样的。 - Hi-Angel
这确实是正确的答案,我良心上不能安装这个插件,因为它需要访问权限来读取您正在使用的任何文档! - Oliver Gray

3

我写了一个版本来处理 Markdown 的标题,但它也支持普通的标题编号。源代码在这里 https://github.com/jordan2175/markdown-tools,并可通过 G Suite Marketplace 名称为“Markdown Tools”获取。


嗨@jordan2175,这个插件很棒。如果生成的目录有页码会更好。 - David Lopez

1

之前提到的“目录”插件今天不可用。 我安装了一个叫做“Markdown Tools”的插件。 安装完成后,您必须应用原生标题样式,然后转到附加组件>Markdown工具>标题编号并选择所需的编号样式,该样式将应用于文档中的所有标题。


请注意,该扩展将使用基于Markdown的格式,例如,它将更改标题以像 ## 4.1 Foo。标题和ToC也是静态的,必须手动重新生成。 ToC也采用Markdown样式格式化。另一方面,该扩展开源且在客户端上工作,因此您的文档是私有的。 - crypdick

0

首先感谢Luciano的分享。

我修改了代码,使其在标题以数字开头时也保留数字。

例如:

标题: 1000欧元,应税门槛?

旧脚本:

  1. 欧元,应税门槛?

新脚本:

  1. 1000欧元,应税门槛?

代码:

function onOpen() {
  DocumentApp.getUi().createMenu('Numérotation des titres')
  .addItem('Ajouter / Mettre à jours Numérotation', 'numberHeadingsAdd')
  .addItem('Supprimer Numérotation', 'numberHeadingsClear')
  .addToUi();
}

function numberHeadingsAdd(){
  numberHeadings(true);
}

function numberHeadingsClear(){
  numberHeadings(false);
}

function numberHeadings(add){
  var document = DocumentApp.getActiveDocument();
  var body = document.getBody();
  var paragraphs = document.getParagraphs();
  var numbers = [0,0,0,0,0,0,0];
  for (var i in paragraphs) {
    var element = paragraphs[i];
    var text = element.getText()+'';
    var type = element.getHeading()+'';

    // exclude everything but headings
    if (!type.match(/HEADING\d/)) {
      continue;
    }

    // exclude empty headings (e.g. page breaks generate these)
    if( text.match(/^\s*$/)){
      continue;
    }

    if (add == true) {
      var level = new RegExp(/HEADING(\d)/).exec(type)[1];
      var numbering = '';

      numbers[level]++;
      for (var currentLevel = 1; currentLevel <= 6; currentLevel++) {
        if (currentLevel <= level) {
          numbering += numbers[currentLevel] + '.';
        } else {
          numbers[currentLevel] = 0;
        }
      }
      Logger.log(text);
      var newText = numbering + ' ' + text.replace(/^[0-9\.\s]+[.]/, '');
      element.setText(newText);
      Logger.log([newText]);
    } else {
      Logger.log(text);
      element.setText(text.replace(/^[0-9\.\s]+[.]/, ''));
    }
  }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接