I've been trying to get this one to work, but the way I found it to work, using regex makes it run out of memory and/or it gives me the error: Uncaught SyntaxError: Invalid regular expression: \b \b : Nothing to repeat.
This is the function:
function countSearchTerms() {
const filteredTerms = nGramsSht.getRange(6, 2, nGramsSht.getLastRow() - 5, 1).getValues().filter(e => e != '');
const searchTermData = nGramFinalDataSht.getRange(1, 1, nGramFinalDataSht.getLastRow(), 1).getValues().filter(e => e != '');
let occurrences = [];
for (let r = 0; r < filteredTerms.length; r ) {
let count = 0;
for (let a = 0; a < searchTermData.length; a ) {
if ((new RegExp("\\b" filteredTerms[r].toString() "\\b").test(searchTermData[a]))) {
count ;
}
}
occurrences.push([count])
}
if (occurrences.length > 0) {
nGramsSht.getRange(6, 3, nGramsSht.getLastRow() - 5, 1).clearContent();
nGramsSht.getRange(6, 3, occurrences.length, 1).setValues(occurrences);
}
}
I'd use this answer's approach, but how to count the words in a occurring in b?
function wordcount() {
const ss = SpreadsheetApp.getActive();
const sh = ss.getSheetByName("Sheet0");
sh.clearContents();
const a = [["A"], ["earth"], ["20"], ["tunnel"], ["house"], ["earth A"], ["$100"], ["house $100"]];
const b = [["A"], ["A Plane is expensive"], ["peaceful earth"], ["20 years"], ["tunnel"], ["tiny house"], ["earth B612"], ["$100"], ["house $100"]]
sh.getRange(1, 1, a.length, a[0].length).setValues(a);
let o = [... new Set(a.slice().flat().join(' ').split(' '))].map(w => [w, sh.createTextFinder(w).matchCase(true).findAll().length]);
o.unshift(["Words","Count"]);
sh.getRange(sh.getLastRow() 2,1,o.length,o[0].length).setValues(o);
}
Thanks a lot!
CodePudding user response:
Try it this way:
function wordcount() {
const ss = SpreadsheetApp.getActive();
const sh = ss.getSheetByName("Sheet0");
sh.clearContents();
const a = [["A"], ["earth"], ["20"], ["tunnel"], ["house"], ["earth A"], ["$100"], ["house $100"]];
const b = [["A"], ["A Plane is expensive"], ["peaceful earth"], ["20 years"], ["tunnel"], ["tiny house"], ["earth B612"], ["$100"], ["house $100"]]
sh.getRange(1, 1, b.length, b[0].length).setValues(b);
let o = [... new Set(a.slice().flat().join(' ').split(' '))].map(w => [w, sh.createTextFinder(w).matchCase(true).findAll().length]);
o.unshift(["Words", "Count"]);
sh.getRange(sh.getLastRow() 2, 1, o.length, o[0].length).setValues(o);
}
| Search | |
|---|---|
| A | |
| A Plane is expensive | |
| peaceful earth | |
| 20 years | |
| tunnel | |
| tiny house | |
| earth B612 | |
| $100 | |
| house $100 | |
| Words | Count |
| A | 2 |
| earth | 2 |
| 20 | 1 |
| tunnel | 1 |
| house | 2 |
| $100 | 2 |
CodePudding user response:
Maybe your data makes the regexp fail. You should escape it for regexp and check if not empty. I hope it helps
function escapeRegExp(string) {
return string.replace(/([.* ?^=!:${}()|\[\]\/\\])/g, "\\$1");
}
var term = escapeRegExp(filteredTerms[r].toString().trim())
if (term && (new RegExp("\\b" term "\\b").test(searchTermData[a]))) {
count ;
}
