Итак, я занимался небольшой поисковой системой для Google Sheets и не хотел, чтобы она чувствительна к регистру, поэтому я заставляю ее объявлять «RealComments» как фактический контент для извлечения, а затем переходить к строчным буквам «Комментарии». массив строка за строкой в главном цикле.
Мне кажется, что это должно работать, это разные переменные, и я возвращаю RealComments, а не Комментарии. Но в моем коде происходит какая-то странная квантовая запутанность, потому что независимо от того, как я это объявляю, каждый раз, когда я применяю метод toLowecase () к обоим массивам RealComments или Comments, оба модифицируются.
Понятия не имею, почему это или как это исправить. Вот полный код:
/**
* Searches for relevant questions and answers
*
* @param {cell} Keywords Cell with comma separated list
* @param {cell} Query Cell with text in question format
* @param {cell} Type Validation cell with options, leave "Any" for no filter
* @param {column} TypeOfComment Array with the type of question column
* @param {array} Comments Array with the questions and answers in two columns
* @param {column} ScreenshotLinks Array with the screenshot link column
* @return Your answer. :)
* @customfunction
*/
function SearchQuery(Keywords,Query,Type,TypeOfComment,Comments,ScreenshotLinks) {
if(Keywords==""){
return "Please type your query/keywords above for results to be displayed here."
}
var ResultArray = [];
var Score = 0;
var MinimumScore = 2;
var MinimumScorePosition = 0;
var keywords = [];
var querywords = [];
var RealComments = Comments;
for(rows in RealComments){
RealComments[rows].push(ScreenshotLinks[rows][0]);
}
var RemaneingKeywords = CleanPunctuation(Keywords);
var RemaneingQuery = CleanPunctuation(Query);
var NextSpace = RemaneingKeywords.indexOf(' ');
while(NextSpace != -1){
keywords.push(RemaneingKeywords.substr(0,NextSpace));
RemaneingKeywords = RemaneingKeywords.substr(NextSpace+1,RemaneingKeywords.length);
NextSpace = RemaneingKeywords.indexOf(' ');
}
keywords.push(RemaneingKeywords);
NextSpace = RemaneingQuery.indexOf(' ');
while(NextSpace != -1){
querywords.push(RemaneingQuery.substr(0,NextSpace));
RemaneingQuery = RemaneingQuery.substr(NextSpace+1,RemaneingQuery.length);
NextSpace = RemaneingQuery.indexOf(' ');
}
querywords.push(RemaneingQuery);
for(rows in Comments){
Comments[rows][0] = Comments[rows][0].toLowerCase(); //Investigate lowercase glitch
Comments[rows][1] = Comments[rows][1].toLowerCase();
if(Type=="Any"||TypeOfComment[rows]==Type){
Score = 0;
for(keyword in keywords){
if(Comments[rows][0].indexOf(keywords[keyword])!=-1||Comments[rows][1].indexOf(keywords[keyword])!=-1){
Score = Score+10;
}
}
for(words in querywords){
if(Comments[rows][0].indexOf(querywords[words])!=-1||Comments[rows][1].indexOf(querywords[words])!=-1){
Score = Score+1;
}
}
if(ResultArray.length<20 && Score>2){
ResultArray.push(RealComments[rows]);
ResultArray.push(Score);
MinimumScore = FindMinimumScore(ResultArray);//Math.min.apply(null,ResultArray);
}
else{if(Score>MinimumScore){
MinimumScorePosition = ResultArray.indexOf(MinimumScore);
ResultArray.splice(MinimumScorePosition-1,2);
ResultArray.push(RealComments[rows]);
ResultArray.push(Score);
MinimumScore = FindMinimumScore(ResultArray);
}}
}
}
var ScoresForSorting = []; //Sorting the responses here
for(i=0;i<10;i++){
if(ResultArray[i+1]==undefined){ScoresForSorting.push(-2);}
else{ScoresForSorting.push(parseInt(ResultArray.splice(i+1,1)));}
}
var ResponseOrder = [];
for(i=0;i<10;i++){
MinimumScorePosition = ScoresForSorting.indexOf(Math.max(ScoresForSorting[0],ScoresForSorting[1],ScoresForSorting[2],ScoresForSorting[3],ScoresForSorting[4],ScoresForSorting[5],ScoresForSorting[6],ScoresForSorting[7],ScoresForSorting[8],ScoresForSorting[9]));
ResponseOrder.push(MinimumScorePosition);
ScoresForSorting[MinimumScorePosition]=-3;
}
var SortedResultArray = [];
for(results in ResponseOrder){
SortedResultArray.push(ResultArray[ResponseOrder[results]]);
}
if(SortedResultArray[0]==undefined){SortedResultArray = []; SortedResultArray.push("Sorry, No Result Was Found To Your Search. ) : ");}
return SortedResultArray
}
function FindMinimumScore(ResultArray){
return Math.min(ResultArray[1],ResultArray[3],ResultArray[5],ResultArray[7],ResultArray[9],ResultArray[11],ResultArray[13],ResultArray[15],ResultArray[17],ResultArray[19])
}
function CleanTwoLetterWords(words){
var badwords = ["do","in","at","it","of","as","be","if","or","we","by","an","or","no","my","vs"];
for(badword in badwords){words = words.replace(badwords[badword],"");}
return words
}
function CleanThreeLetterWords(words){
if(parseInt(words)>9){return ""} //remove numbers
var badwords = ["and","for"];
for(badword in badwords){words = words.replace(badwords[badword],"");}
return words
}
function CleanPunctuation(words){
words = words.toLowerCase();
var badlettergroup = ["{","}",",",":","+","-","™","®","?","!","(",")","'"];
for(letter in badlettergroup){while(words.indexOf(badlettergroup[letter]) != -1){words = words.replace(badlettergroup[letter]," ");}}
return words
}
function MakeThingsSingular(words){
var exceptions = ["this"];
if(exceptions.indexOf(words) != -1){return words}
var wordl = words.length;
if(words.substr(wordl-1,wordl) == "s" && words.substr(wordl-2,wordl) != "ss"){return words.substr(0,wordl-1)}
return words
}
Я написал все сам, но я не думаю, что все это особенно блестяще, поэтому не стесняйтесь копировать. Кроме того, предложить улучшения, если у вас есть. Но самое главное, если у вас есть идея, почему строки, составляющие массив комментариев, будут влиять на RealComments и / или как это исправить, пожалуйста, дайте мне знать.
EDIT:
Итак, после еще нескольких исследований и полезных ответов я попытался объявить RealComments следующим образом:
var RealComments = [];
for(rows in Comments){
RealComments.push(Comments[rows]);
}
В этом случае сбой сохраняется.
var RealComments = [...Comments];
Что возвращает синтаксическую ошибку.
var RealComments = Comments.slice();
В этом случае глюк все еще сохраняется.
...
В общем, я до сих пор не понимаю, что не так с кодом, комментирование одной из строчных букв влияет на столбец, который вы ожидаете в RealComments, как если бы они все еще были связаны.
Comments[rows][0] = Comments[rows][0].toLowerCase();
Comments[rows][1] = Comments[rows][1].toLowerCase();
Так что я думаю, этот пост, если еще не решен ... Но спасибо за все ответы до сих пор.