在段落中查找并标记相同单词的脚本



我是一名小说作家,我曾经用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();
}

是的,我在上一个解决方案中更改结果时遇到了问题。

相关内容

最新更新