代码之家  ›  专栏  ›  技术社区  ›  VorganHaze

Google文档中的节字数

  •  7
  • VorganHaze  · 技术社区  · 7 年前

    Google Docs插件是否可以按标题(部分)计算单词数?下图显示了我想要的内容。

    screenshot

    有没有办法在侧边栏或其他方式中显示此类字数信息?

    2 回复  |  直到 7 年前
        1
  •  4
  •   user6655984 user6655984    7 年前

    这里有一个脚本可以实现这一点。在谷歌文档中,标题是一种段落,其区别在于 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)");
        }
      }
    }
    
        2
  •  1
  •   Christina Lewis    4 年前

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

    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\\)', "");
    }