Google文档中的字词计数

时间:2017-12-23 17:03:28

标签: google-apps-script google-docs

Google文档插件是否可以计算每个标题(部分)的字数?下图显示了我想要的内容。

screenshot

有没有办法在侧边栏或任何其他方式显示这种字数信息?

2 个答案:

答案 0 :(得分:1)

这是一个执行此操作的脚本。在Google文档中,标题是一种以getHeading()属性区分的段落。因此有9个级别的段落:标题,副标题,h1 ...... h6和正常。

该脚本首先查找每个段落的级别和每个段落的字数。然后,对于每个段落,它会遍历所有后续的"正常"段落,加上他们的字数;当达到相同或更高级别的另一段时,这将停止。

我的理解是标题中的单词本身不应包括在字数中,但如果需要可以改变。

由于这不是附加组件,因此没有侧边栏来显示信息。我只是在最后附加结果,复制每个标题并在其文本中附加(X字)。它看起来像这样:

Book title (108 words)
 Chapter 1 (54 words)
  Section 1 (15 words)
  Section 2 (20 words)
 Chapter 2 (54 words)
  Section 1 (54 words)
   Subsection 1 (31 words)
   Subsection 2 (13 words)

在我的示例文本中,第1章有一些"介绍"正常文本在其第一部分之前,这就是为什么它的字数高于其两个部分的字数之和。

脚本:

function countPerSection() {                
  var body = DocumentApp.getActiveDocument().getBody();
  var para = body.getParagraphs();
  var levels = para.map(function(p) {
    return [DocumentApp.ParagraphHeading.TITLE, 
            DocumentApp.ParagraphHeading.SUBTITLE, 
            DocumentApp.ParagraphHeading.HEADING1,
            DocumentApp.ParagraphHeading.HEADING2,
            DocumentApp.ParagraphHeading.HEADING3,
            DocumentApp.ParagraphHeading.HEADING4,
            DocumentApp.ParagraphHeading.HEADING5,
            DocumentApp.ParagraphHeading.HEADING6,
            DocumentApp.ParagraphHeading.NORMAL].indexOf(p.getHeading());
  });
  var paraCounts = para.map(function (p) {
    return p.getText().split(/\W+/).length;
  });

  var counts = [];
  for (var i = 0; i < para.length; i++) {
    var count = 0;
    for (var j = i+1; j < para.length; j++) {
      if (levels[j] <= levels[i]) {
        break;
      }
      if (levels[j] == 8) {
        count += paraCounts[j];
      }
    }
    counts.push(count);
  }

  for (var i = 0; i < para.length; i++) {
    if (levels[i] < 8) {
      body.appendParagraph(para[i].copy()).appendText(" (" + counts[i] + " words)");
    }
  }
}

答案 1 :(得分:0)

我编辑了上一个答案,将字数放在每个标题旁边,而不是全部放在底部,您也会在大纲中看到它。我还添加了一个可以删除所有计数的函数,因此您可以保留它们而不必担心 CTRL-Z 'ing 或手动删除它们。希望这对其他人有用!

function countPerSection() {                
  var body = DocumentApp.getActiveDocument().getBody();
  var para = body.getParagraphs();
  var levels = para.map(function(p) {
    return [DocumentApp.ParagraphHeading.TITLE, 
            DocumentApp.ParagraphHeading.SUBTITLE, 
            DocumentApp.ParagraphHeading.HEADING1,
            DocumentApp.ParagraphHeading.HEADING2,
            DocumentApp.ParagraphHeading.HEADING3,
            DocumentApp.ParagraphHeading.HEADING4,
            DocumentApp.ParagraphHeading.HEADING5,
            DocumentApp.ParagraphHeading.HEADING6,
            DocumentApp.ParagraphHeading.NORMAL].indexOf(p.getHeading());
  });
  var paraCounts = para.map(function (p) {
    return p.getText().split(/\W+/).length;
  });

  // var counts = [];
  for (var i = 0; i < para.length; i++) {
    var count = 0;
    for (var j = i+1; j < para.length; j++) {
      if (levels[j] <= levels[i]) {
        break;
      }
      if (levels[j] == 8) {
        count += paraCounts[j];
      }
    }
    if (levels[i] < 8) {
      para[i].appendText(" (" + count + " words)");
    }
  }
}

function removeCountPerSection(){
  var docBody = DocumentApp.getActiveDocument().getBody();
  docBody.replaceText('\\([0123456789]* words\\)', "");
}