将 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);
}
}
参考
我想要做的不是 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);
}
}
参考