我是一名小说作家,我曾经用MS Word写作。我写了一些宏来帮助我编辑小说文本,其中一个检查段落并标记(红色(重复(或一式三份等(。例:
"I came **home**. And while at **home** I did this and that."
"家"这个词被使用了两次,值得检查我是否真的无法更改句子。
现在我主要使用谷歌文档进行写作,但我仍然必须在MS Word中进行编辑,主要是因为这个宏 - 我无法在谷歌脚本中对其进行编程。
function PobarvajBesede() {
var doc = DocumentApp.getActiveDocument();
var cursor = DocumentApp.getActiveDocument().getCursor();
var surroundingText = cursor.getSurroundingText().getText();
var WordsString = WORDS(surroundingText);
Logger.log(WordsString);
//so far, so good. But this doesn't work:
var SortedWordsString = SORT(WordsString[1],1,False);
// and I'm lost.
}
function WORDS(input) {
var input = input.toString();
var inputSplit = input.split(" ");
// Logger.log(inputSplit);
inputSplit = inputSplit.toString();
var punctuationless = inputSplit.replace(/[.,/#!$%?^&*;:{}=-_`~()]/g," ");
var finalString = punctuationless.replace(/s{2,}/g," ");
finalString = finalString.toLowerCase();
return finalString.split(" ") ;
}
如果我只能得到一个单词列表(大写,超过 3 个字符(,按它们在记录器中的出现次数排序,这将对我有很大帮助:
HOME (2)
AND (1)
...
谢谢。
流:
- 将字符串转换为大写,并清理所有非 ascii 字符的字符串
- 将字符串拆分为单词数组后,将数组简化为 word:count 的对象
- 将缩小的对象映射到 2D 数组
[[word,count of this word],[..],...]
并按内部数组的计数对数组进行排序。
片段:
function wordCount(str) {
str = str || 'I came **home**. And while at **home** I did this and that.';
var countObj = str
.toUpperCase() //'I CAME **HOME**...'
.replace(/[^A-Z ]/g, '') //'I CAME HOME...'
.split(' ') //['I', 'CAME',..]
.reduce(function(obj, word) {
if (word.length >= 3) {
obj[word] = obj[word] ? ++obj[word] : 1;
}
return obj;
}, {}); //{HOME:2,DID:1}
return Object.keys(countObj)
.map(function(word) {
return [word, countObj[word]];
}) //[['HOME',2],['CAME',1],...]
.sort(function(a, b) {
return b[1] - a[1];
});
}
console.info(wordCount());
阅读和练习:
- 对象
- 数组方法
这是TheMaster答案和我的一些工作的组合。 我需要更多地了解他的做法,所以我今天花了一些时间学习。 此功能消除了我在回车时遇到的一些问题,并且还删除了仅出现一次的项目。 您可能应该选择TheMasters解决方案,因为如果没有他的工作,我无法做到这一点。
function getDuplicateWords() {
var str=DocumentApp.getActiveDocument().getBody().getText();
var countObj = str
.toUpperCase()
.replace(/n/g,' ')
.replace(/[^A-Z ]/g, '')
.split(' ')
.reduce(function(obj, word) {
if (word.length >= 2) {
obj[word] = obj[word] ? ++obj[word] : 1;
}
return obj;
}, {});
var oA=Object.keys(countObj).map(function(word){return [word, countObj[word]];}).filter(function(elem){return elem[1]>1;}).sort(function(a,b){return b[1]-a[1]});
var userInterface=HtmlService.createHtmlOutput(oA.join("<br />"));
DocumentApp.getUi().showSidebar(userInterface);
}
function onOpen() {
DocumentApp.getUi().createMenu('MyMenu')
.addItem('Get Duplicates','getDuplicateWords' )
.addToUi();
}
是的,我在上一个解决方案中更改结果时遇到了问题。