将 wordcount 放入 Google Docs table 单元格的宏或脚本?

Macro or script that will put a wordcount into a Google Docs table cell?

我想要做的不是 Google 表格,而是常规的 Google 文档文字处理器。我正在使用一个包含一堆 table 的文本文档,每个 table 下方都有一段、两段、三段文本,而不是 table 本身的一部分。 table 有包含各种信息的列,但其中之一是“单词”,目前我必须手动突出显示下面的该部分,转到“工具”找到“字数统计”,然后查看它是什么。然后,如果我编辑下面的部分,我会重复该过程。

其中一些文档有几十个甚至数百个这样的单独部分(table,文本在下一个 table 之前),因此有一些方法可以自动更新该字段将是不可思议的。

有没有办法让 table 的单元格查看下面的文本并计算字数?

每个 table 上面都有一个 H3 标题,所以我的想法是以某种方式识别和计算 table 末尾和下一个 H3 之间的单词。

结构是:

H3 level title
Table
Text
Text
Text

H3 level title
Table
Text
Text

等等

这是一份 link 文档,显示了我希望做的事情:link

还有一些小的额外事项需要考虑,但只要知道这是否可行就更好了。

我是 运行 Lubuntu 20.04LTS,使用 Chrome 作为浏览器,如果有区别的话。

描述

我已经为您的具体情况开发了一个脚本。字数统计可能不准确,因为此脚本仅使用 space 作为字词之间的分隔符。如果有制表符或其他一些字符,计数可能会关闭。字数统计的主题以前在 Whosebug 上出现过,但没有万无一失的计数器。

基本上它会跳过 header,跟踪后面的 table 来填充字数,然后计算 table 和下一个 header 之间的字数。

如果单词以黄色突出显示,我已经编辑了脚本以从计数中省略。但是,我观察到,如果一个单词以标点符号结尾并且没有突出显示,它就算作一个单词。所以你再次看到在字数统计中需要考虑很多事情。

修复了段落以突出显示开头的情况。

脚本

function countWords() {
  try {
    var doc = DocumentApp.getActiveDocument();
    var body = doc.getBody();
    var child = null;
    var i = 0;
    var j = 0;
    var count = 0;
    var text = null;
    var table = null;
    var length = 0;
    var startOffset = -1;
    var endOffset = -1;
    for( i=0; i<body.getNumChildren(); i++ ) {
      child = body.getChild(i);
      if( child.getType() === DocumentApp.ElementType.PARAGRAPH ) {
        var atts = child.getAttributes();
        var heading = atts[DocumentApp.Attribute.HEADING].toString();
        if( heading.indexOf("HEADING") < 0 ) {
          length = child.asParagraph().getText().length;
          text = child.asParagraph().copy().editAsText();
          for( j=length-1; j>=0; j-- ) {  // have to delete from end first
            if( text.getBackgroundColor(j) == "#ffff00" ) {  // yellow
              if( endOffset < 0 ) {
                endOffset = j;
              }
              else {
                startOffset = j;
              }
            }
            else if( endOffset >= 0 ) {
              console.log("offset = "+startOffset+" "+endOffset);
              text.deleteText(startOffset,endOffset);
              if( startOffset === 0 ) break; // if the paragraph starts with highlight
              startOffset = -1;
              endOffset = -1;
            }
          }
          text = text.getText().split(" ");
          count = count + text.length;
          if( text.length > 0 ) text.forEach( word => { if( word == '' ) count--; } ); // incase of double spaces
        }
        else {
          if( table ) table.asTable().getCell(1,5).setText(count);
          // start a new count
          count = 0;
        }
      }
      else if( child.getType() === DocumentApp.ElementType.TABLE ) {
        table = child;
      }
    }
    // fill in the last table
    table.asTable().getCell(1,5).setText(count);
  }
  catch(err) {
    console.log(err);
  }
}

参考