/Users/johnr/Desktop/IA pdf Downloads/Criteria__P__-_Coding_Project_Upload_all_2022-05-03/Product_Henri_05_01/Server/ServerSideCode.txt
  1 let DEBUG = true;
  2 var ss = SpreadsheetApp.openById("1BaL53vnfuDmTZHE2HEGs1PaN7XyqfPu0JdUjkw5wXu0"); //This links the database to the server
  3 
  4 function doGet(e){  //This gets the searchString through th URL
  5 
  6   Logger.log(e);
  7 
  8   const searchString = e.parameter.searchString;  //This extracts the searchString from the URL
  9 
 10   var JSONResponse = respondToRequest(searchString, e.parameter);
 11   Logger.log(JSONResponse);
 12   return ContentService
 13     .createTextOutput(e.parameter.callback + "(" + JSONResponse + ")")
 14     .setMimeType(ContentService.MimeType.JAVASCRIPT); //This converts the code to JSONP to skip through the same-origin-policy of google
 15 }
 16 
 17 function doPost(e){ //This returns the information to the website
 18 
 19   const searchString = e.parameter.searchString;  //This extracts the searchString from the URL
 20 
 21   var JSONResponse = respondToRequest(searchString, e.parameter); //This calls the main search function which integrates security
 22 
 23   return ContentService.createTextOutput(JSONResponse).setMimeType(ContentService.MimeType.JSON); //This converts the code to JSONP to skip through the same-origin-policy of google
 24 
 25 }
 26 
 27 
 28 function respondToRequest(searchString, parameter){   //Main search function
 29   if (DEBUG){ console.info(searchString + ":" + parameter );}
 30   var originalSearchString=searchString;
 31   searchString=getSearchString(searchString);
 32   
 33   var statement;
 34   var statementDef=false;   //This variable swictehs to true when the statement is filled to ensure that the value isn't overwritten
 35   //The following code checks if a quick search button was chosen
 36   if (searchString=="<FREQUENT-SEARCHES-1>"){
 37     statement=ss.getSheetByName("Data").getRange("Y26").getValue();
 38     statementDef=true;
 39     return prematureReturn(statement);
 40   }else if (searchString=="<FREQUENT-SEARCHES-2>"){
 41     statement=ss.getSheetByName("Data").getRange("Y27").getValue();
 42     statementDef=true;
 43     return prematureReturn(statement);
 44   }else if (searchString=="<LAST-ADDED>"){
 45     statement=ss.getSheetByName("Data").getRange("Y28").getValue();
 46     statementDef=true;
 47     return prematureReturn(statement);
 48   }else if (searchString=="<MOST-VIEWED-1>"){
 49     statement=ss.getSheetByName("Data").getRange("Y29").getValue();
 50     statementDef=true;
 51     return prematureReturn(statement);
 52   }else if (searchString=="<MOST-VIEWED-2>"){
 53     statement=ss.getSheetByName("Data").getRange("Y30").getValue();
 54     statementDef=true;
 55     return prematureReturn(statement);
 56   }else{                                 //NOT A BUTTON TERM
 57   
 58     var isDate;
 59     var keyword=[];                                       //THE KEYORD THAT WILL BE LOOKED FOR ON THE SHEETS
 60     Logger.log("Start month test "+checkForMonth(searchString));
 61     if(checkForMonth(searchString)!="None"){              //IS THERE A MONTH
 62       isDate=true;
 63       keyword.push(checkForMonth(searchString));
 64       Logger.log("Keyword "+keyword);
 65       if((findDate(searchString).length)!=0){             //IS THERE A MONTH+YEAR
 66         Logger.log("MY");
 67         isDate=true;
 68         var arrayAA=[];
 69         arrayAA=findDate(searchString);
 70         for(var k=0;k<arrayAA.length;k++){
 71           keyword.push(arrayAA[k]);
 72         }
 73       }
 74     }else if((findDate(searchString).length)!=0){         //IS THERE A YEAR
 75       Logger.log("Y");
 76       isDate=true;
 77       var arrayBB=[];
 78       arrayBB=findDate(searchString);
 79       for(var k=0;k<arrayBB.length;k++){
 80         keyword.push(arrayBB[k]);
 81       }
 82     }else{                                                 //NO DATE
 83       Logger.log("Has no date");
 84       isDate=false;
 85       var keywordConversion = searchString;
 86       keyword=keywordConversion.split(" ");                //CREATE SEPERATE ARRAY SLOTS FOR EACH WORD
 87     }
 88   }
 89 
 90   var counter=0;
 91   var cellCount=[];
 92   var points=[];
 93   var mar="";
 94   Logger.log("Points Logic Commenced. isDate: "+isDate);
 95   if(isDate==false){                                                            //CHECKING WORDS
 96     while(counter<ss.getSheetByName("Data").getRange("P11").getValue()){        //LOOP THROUGH STORIES
 97       mar="L"+(2+counter);                                                      //CURRENT CELL
 98       cellCount[counter]=mar;                                                   //NAME OF CELL
 99       points[counter]=keywordTest(mar, keyword);                                //ADD POINTS
100       counter++;
101       Logger.log(points);
102     }Logger.log("isdate is false. mar="+mar+" counter="+counter+" cellCount="+cellCount);
103   }else{                                                                        //CHECKING DATES... IS IT THE SAME THING AS ABOVE
104     while(counter<ss.getSheetByName("Data").getRange("P11").getValue()){        //LOOP THROUGH STORIES
105       mar="M"+(2+counter);                                                      //CURRENT CELL
106       cellCount[counter]=mar;                                                   //NAME OF CELL
107       points[counter]=keywordTest(mar, keyword);                                //ADD POINTS
108       counter++;
109       Logger.log(points);
110     }Logger.log("isdate is true. mar="+mar+" counter="+counter+" cellCount="+cellCount);
111   }
112   
113   //LOAD CHAMBER WITH HIGHEST POINT STORY
114   var highestCell;
115   var highestPoints=-1;
116   var highestPoint;
117   for(var pointsLoop=0;pointsLoop<points.length;pointsLoop++){
118     if(points[pointsLoop]>highestPoints){
119       highestCell=cellCount[pointsLoop];                               //highestCell is cell name of cell with highest points
120       highestPoints=points[pointsLoop];
121       highestPoint=pointsLoop;
122     }
123   }
124   var secondHighestCell;
125   var secondHighestPoints=-1;
126   var secondHighestPoint;
127   points[highestPoint]=-1;                                             //removes the highest point from array so that the second highest is highest to find the second story
128   for(var pointsLoop=0;pointsLoop<points.length;pointsLoop++){
129     if(points[pointsLoop]>secondHighestPoints){
130       secondHighestCell=cellCount[pointsLoop];                         //secondHighestCell is cell name of cell with second highest points
131       secondHighestPoints=points[pointsLoop];
132       secondHighestPoint=pointsLoop;
133     }
134   }
135   var thirdHighestCell;
136   var thirdHighestPoints=-1;
137   points[secondHighestPoint]=-1;                                        //removes the second highest point from array so that the third highest is highest
138   for(var pointsLoop=0;pointsLoop<points.length;pointsLoop++){
139     if(points[pointsLoop]>thirdHighestPoints){
140       thirdHighestCell=cellCount[pointsLoop];                           //secondHighestCell is cell name of cell with third highest points
141       thirdHighestPoints=points[pointsLoop];
142     }
143   }
144   Logger.log("Loading Chamber");
145   
146   var startOfRow=1;
147 
148   var secondCoordIsChar = (/[a-zA-Z]/).test(highestCell.substring(1,2)) //REGEX equation to find where the row number is in the google sheet coordinates. E.G. A1 vs AA1
149   Logger.log("secondCoordIsChar="+secondCoordIsChar);
150   if(secondCoordIsChar==true){
151     startOfRow=2
152   }
153 
154   //This code finds out when the row, which becomes story number starts so that two character xCoords dont break it.
155   var storyRow=highestCell.substring(startOfRow,(highestCell.length));                                               //GET ROW OF STORY
156   Logger.log("storyRow"+storyRow);
157   Logger.log(ss.getSheetByName("Data").getRange("D"+storyRow).getValue());
158   ss.getSheetByName("Data").getRange("W21").setValue(ss.getSheetByName("Data").getRange("C"+storyRow).getValue());   //AUTHOR
159   ss.getSheetByName("Data").getRange("V21").setValue(ss.getSheetByName("Data").getRange("F"+storyRow).getValue());   //ARTICLE
160   ss.getSheetByName("Data").getRange("U21").setValue(ss.getSheetByName("Data").getRange("AB"+storyRow).getValue());  //DATE PUBLISHED
161   ss.getSheetByName("Data").getRange("T21").setValue(ss.getSheetByName("Data").getRange("AC"+storyRow).getValue());  //DATE
162   ss.getSheetByName("Data").getRange("S21").setValue(ss.getSheetByName("Data").getRange("D"+storyRow).getValue());   //TITLE
163   ss.getSheetByName("Data").getRange("X21").setValue(ss.getSheetByName("Data").getRange("I"+storyRow).getValue());   //Notes
164   
165   var secondStoryRow=secondHighestCell.substring(1,(secondHighestCell.length));                                      //GET ROW OF SECOND STORY
166   Logger.log(ss.getSheetByName("Data").getRange("D"+secondStoryRow).getValue());
167   ss.getSheetByName("Data").getRange("W22").setValue(ss.getSheetByName("Data").getRange("C"+secondStoryRow).getValue());   //AUTHOR
168   ss.getSheetByName("Data").getRange("V22").setValue(ss.getSheetByName("Data").getRange("F"+secondStoryRow).getValue());   //ARTICLE
169   ss.getSheetByName("Data").getRange("U22").setValue(ss.getSheetByName("Data").getRange("AB"+secondStoryRow).getValue());  //DATE PUBLISHED
170   ss.getSheetByName("Data").getRange("T22").setValue(ss.getSheetByName("Data").getRange("AC"+secondStoryRow).getValue());  //DATE
171   ss.getSheetByName("Data").getRange("S22").setValue(ss.getSheetByName("Data").getRange("D"+secondStoryRow).getValue());   //TITLE
172   ss.getSheetByName("Data").getRange("X22").setValue(ss.getSheetByName("Data").getRange("I"+secondStoryRow).getValue());   //Notes
173 
174   var thirdStoryRow=thirdHighestCell.substring(1,(thirdHighestCell.length));                                            //GET ROW OF SECOND STORY
175   Logger.log(ss.getSheetByName("Data").getRange("D"+thirdStoryRow).getValue());
176   ss.getSheetByName("Data").getRange("W23").setValue(ss.getSheetByName("Data").getRange("C"+thirdStoryRow).getValue());   //AUTHOR
177   ss.getSheetByName("Data").getRange("V23").setValue(ss.getSheetByName("Data").getRange("F"+thirdStoryRow).getValue());   //ARTICLE
178   ss.getSheetByName("Data").getRange("U23").setValue(ss.getSheetByName("Data").getRange("AB"+thirdStoryRow).getValue());  //DATE PUBLISHED
179   ss.getSheetByName("Data").getRange("T23").setValue(ss.getSheetByName("Data").getRange("AC"+thirdStoryRow).getValue());  //DATE
180   ss.getSheetByName("Data").getRange("S23").setValue(ss.getSheetByName("Data").getRange("D"+thirdStoryRow).getValue());   //TITLE
181   ss.getSheetByName("Data").getRange("X23").setValue(ss.getSheetByName("Data").getRange("I"+thirdStoryRow).getValue());   //Notes
182   
183   var cellValue=ss.getSheetByName("Data").getRange("Y21").getValue();
184   var secondCellValue=ss.getSheetByName("Data").getRange("Y22").getValue();
185   var thirdCellValue=ss.getSheetByName("Data").getRange("Y23").getValue();
186   increaseViewed(storyRow);                                                                //CREATES MOST VIEWED
187   frequentSer(searchString);                                                               //CREATES MOST SEARCHED(FREQUENT SEARCHES)
188   if (statementDef==false){
189     statement=cellValue+"<>SECOND<>"+secondCellValue+"<>THIRD<>"+thirdCellValue;
190   }
191   Logger.log("Statement: "+statement+"<>SECURITY<>"+securityTest(getEmail(originalSearchString))+"<>SECURITY<>");
192 
193 
194   var myJSON = JSON.stringify(statement+"<>SECURITY<>"+securityTest(getEmail(originalSearchString))+"<>SECURITY<>");
195   Logger.log("qqqq "+myJSON);
196 
197   return myJSON;
198 
199 }
200 
201 
202 function increaseViewed(cell){
203   SpreadsheetApp.getSheetByName("Data").getRange(cell).setValue(findCell(cell)+1);
204 }
205 
206 function findDate(searchString){
207   searchString = searchString.replace(/[^0-9]/g, "#"); //REGEX equation to replace all non digits. 
208   var array=searchString;
209   var arrayA=array.split("#");
210 
211   var matches = 0;
212   var values = [];
213   var s=0
214   while(s<arrayA.length){
215     if(arrayA[s].match(/\d{4}/)){
216       matches=matches+1;
217       values.push(arrayA[s]);
218     }
219     s=s+1;
220   }
221   return(values);
222 }
223 
224 function keywordTest(mar, keyword){
225   var splitVar1=ss.getSheetByName("Data").getRange(mar).getValue();
226   var data = splitVar1.split(" ");
227   Logger.log("In the keyword test, this is the data being tested: "+data);
228   var counter=0;
229   var points=0;
230   for(var i=0;i<keyword.length;i++){ 
231     if(data[0].toLowerCase()==keyword[i].toLowerCase()){           //FIRST SET
232       points=points+3;
233     }
234   }
235   counter=1;                                                       //SKIP FIRST SET
236 
237   while(counter<data.length){                                      //LOOP THE STORY WORDS
238     for(var j=0;j<keyword.length;j++){                             //LOOP THE SHEET WORDS
239       if(data[counter].toLowerCase()==keyword[j].toLowerCase()){
240         points=points+1;
241       }
242     }
243     counter=counter+1;
244   }
245   return points;
246 }
247 
248 function prematureReturn(statement){
249   var myJSON = JSON.stringify(statement);
250   return myJSON;
251 }
252 
253 function increaseViewed(row){
254   var views=ss.getSheetByName("Form Responses").getRange("K"+row).getValue();
255   ss.getSheetByName("Form Responses").getRange("K"+row).setValue(views+1);
256 
257   //Load most viewed for next time
258   Logger.log(getMostViewedRow());
259   ss.getSheetByName("Data").getRange("W29").setValue(ss.getSheetByName("Data").getRange("C"+getMostViewedRow()).getValue());   //AUTHOR
260   ss.getSheetByName("Data").getRange("V29").setValue(ss.getSheetByName("Data").getRange("F"+getMostViewedRow()).getValue());   //ARTICLE
261   ss.getSheetByName("Data").getRange("U29").setValue(ss.getSheetByName("Data").getRange("AB"+getMostViewedRow()).getValue());  //DATE PUBLISHED
262   ss.getSheetByName("Data").getRange("T29").setValue(ss.getSheetByName("Data").getRange("AC"+getMostViewedRow()).getValue());  //DATE
263   ss.getSheetByName("Data").getRange("S29").setValue(ss.getSheetByName("Data").getRange("D"+getMostViewedRow()).getValue());   //TITLE
264   ss.getSheetByName("Data").getRange("X29").setValue(ss.getSheetByName("Data").getRange("I"+getMostViewedRow()).getValue());   //Notes
265 
266   //Load second most viewed for next time
267   Logger.log(getSecondMostViewedRow());
268   ss.getSheetByName("Data").getRange("W30").setValue(ss.getSheetByName("Data").getRange("C"+getSecondMostViewedRow()).getValue());   //AUTHOR
269   ss.getSheetByName("Data").getRange("V30").setValue(ss.getSheetByName("Data").getRange("F"+getSecondMostViewedRow()).getValue());   //ARTICLE
270   ss.getSheetByName("Data").getRange("U30").setValue(ss.getSheetByName("Data").getRange("AB"+getSecondMostViewedRow()).getValue());  //DATE PUBLISHED
271   ss.getSheetByName("Data").getRange("T30").setValue(ss.getSheetByName("Data").getRange("AC"+getSecondMostViewedRow()).getValue());  //DATE
272   ss.getSheetByName("Data").getRange("S30").setValue(ss.getSheetByName("Data").getRange("D"+getSecondMostViewedRow()).getValue());   //TITLE
273   ss.getSheetByName("Data").getRange("X30").setValue(ss.getSheetByName("Data").getRange("I"+getSecondMostViewedRow()).getValue());   //Notes
274 }
275 
276 function getMostViewedRow(){
277   var storyNum=ss.getSheetByName("Data").getRange("P11").getValue();
278   var highest=0;
279   var highestRow=0;
280   for(var i=0;i<storyNum;i++){
281     if((ss.getSheetByName("Data").getRange("K"+(i+2)).getValue())>highest){
282       highest=ss.getSheetByName("Data").getRange("K"+(i+2)).getValue();
283       highestRow=i;
284     }
285   }
286   return highestRow+2;
287 }
288 
289 function getSecondMostViewedRow(){
290   var storyNum=ss.getSheetByName("Data").getRange("P11").getValue();
291   var highest=0;
292   var secondHighestRow=0;
293   var array=[];
294   var highestRow=0;
295   for(var i=0;i<storyNum;i++){
296     array[i]=ss.getSheetByName("Data").getRange("K"+(i+2)).getValue();
297   }
298   for(var j=0;j<storyNum;j++){
299     if(array[j]>highest){
300       highest=array[j];
301       highestRow=j;
302     }
303   }array[highestRow]=0;                                                          //Remove Highest
304   highest=0;
305   for(var j=0;j<storyNum;j++){
306     if(array[j]>highest){
307       highest=array[j]
308       secondHighestRow=j;
309     }
310   }
311   return secondHighestRow+2;
312 }
313 
314 function firstWord(searchString){
315   var word=searchString;
316   var array=[];
317   array=word.split(" ");
318   return array[0];
319 }
320 
321 function frequentSer(searchString){                                                                   //NEEDS TO BE FINISHED. CHAMBER NEEDS TO BE LOADED.
322   var search=firstWord(searchString);
323   var serNum=ss.getSheetByName("Data").getRange("AG3").getValue();                                    //NUM of terms on sheet
324   var flag=false;                                                                                     //Is the word already there?
325   for(var j=0;j<serNum;j++){
326     if(search.toLowerCase()==(ss.getSheetByName("Data").getRange("AD"+(j+2)).getValue()).toLowerCase()){
327       flag=true;
328       ss.getSheetByName("Data").getRange("AE"+(j+2)).setValue(ss.getSheetByName("Data").getRange("AE"+(j+2)).getValue()+1);
329     }
330   }if(flag==false){
331       ss.getSheetByName("Data").getRange("AE"+(serNum+2)).setValue(1);
332       ss.getSheetByName("Data").getRange("AD"+(serNum+2)).setValue(searchString);
333     }
334 
335   //Load  most frequent for next time
336   //WARNING: The code below is commented out but can be used to automatically jump to the story related to the most frequent term in future updates if the client requests it.
337   //The code below also makes reference to html code in the string. This willl be parsed as html on the website instead of text.
338 
339   //ss.getSheetByName("Data").getRange("W26").setValue(ss.getSheetByName("Data").getRange("C"+getFrequentSer()).getValue());   //AUTHOR
340   ss.getSheetByName("Data").getRange("V26").setValue("This is the most searched term: <br></br>"+ss.getSheetByName("Data").getRange("AD"+getFrequentSer()).getValue());   //ARTICLE
341   //ss.getSheetByName("Data").getRange("U26").setValue(ss.getSheetByName("Data").getRange("AB"+getFrequentSer()).getValue());  //DATE PUBLISHED
342   //ss.getSheetByName("Data").getRange("T26").setValue(ss.getSheetByName("Data").getRange("AC"+getFrequentSer()).getValue());  //DATE
343   //ss.getSheetByName("Data").getRange("S26").setValue(ss.getSheetByName("Data").getRange("D"+getFrequentSer()).getValue());   //TITLE
344   //ss.getSheetByName("Data").getRange("X26").setValue(ss.getSheetByName("Data").getRange("I"+getFrequentSer()).getValue());   //Notes
345 
346   //Load second most frequent for next time
347   //ss.getSheetByName("Data").getRange("W27").setValue(ss.getSheetByName("Data").getRange("C"+getSecondFrequentSer()).getValue());   //AUTHOR
348   ss.getSheetByName("Data").getRange("V27").setValue("This is the second most searched term: <br></br>"+ss.getSheetByName("Data").getRange("AD"+getSecondFrequentSer()).getValue());   //ARTICLE
349   //ss.getSheetByName("Data").getRange("U27").setValue(ss.getSheetByName("Data").getRange("AB"+getSecondFrequentSer()).getValue());  //DATE PUBLISHED
350   //ss.getSheetByName("Data").getRange("T27").setValue(ss.getSheetByName("Data").getRange("AC"+getSecondFrequentSer()).getValue());  //DATE
351   //ss.getSheetByName("Data").getRange("S27").setValue(ss.getSheetByName("Data").getRange("D"+getSecondFrequentSer()).getValue());   //TITLE
352   //ss.getSheetByName("Data").getRange("X27").setValue(ss.getSheetByName("Data").getRange("I"+getSecondFrequentSer()).getValue());   //Notes
353 }
354 
355 
356 function getFrequentSer(){          //Function to get the most frequent search
357   var serNum=ss.getSheetByName("Data").getRange("AG3").getValue();
358   var highest=0;
359   var freqRow=0;
360   for(var i=0;i<serNum;i++){
361     if((ss.getSheetByName("Data").getRange("AE"+(i+2)).getValue())>highest){
362       highest=ss.getSheetByName("Data").getRange("AE"+(i+2)).getValue();
363       freqRow=i;
364     }
365   }
366   return freqRow+2;
367 }
368 
369 function getSecondFrequentSer(){    //Function to get the second most frequent search
370   var serNum=ss.getSheetByName("Data").getRange("AG3").getValue();
371   var highest=0;
372   var secondFreqRow=0;
373   var array=[];
374   var highestRow=0;
375   for(var i=0;i<serNum;i++){
376     array[i]=ss.getSheetByName("Data").getRange("AE"+(i+2)).getValue();
377   }
378   for(var j=0;j<serNum;j++){
379     if(array[j]>highest){
380       highest=array[j];
381       highestRow=j;
382     }
383   }
384   array[highestRow]=0;                                                          //Remove highest to get the second highest
385   highest=0;
386   for(var j=0;j<serNum;j++){
387     if(array[j]>highest){
388       highest=array[j]
389       secondFreqRow=j;
390     }
391   }
392   return secondFreqRow+2;
393 }
394 
395 function checkForMonth(searchString){       //Function to check if the user searchd for a month
396   var shortMon=["jan", "feb", "mar", "apr", "may", "jun", "jul", "aug", "sep", "oct", "nov", "dec"];
397   var longMon=["january", "febuary", "march", "april", "may", "june", "july", "august", "september", "october", "november", "december"];
398   var search=searchString.toLowerCase();
399   var month="none";
400   for(var i=0; i<12;i++){
401     if((search.indexOf(shortMon[i])!=-1) || (search.indexOf(longMon[i])!=-1)){  //Checks for different ways of writing months
402       month=shortMon[i];
403     }
404   }
405   return capitalizeFirstLetter(month);
406 }
407 
408 function capitalizeFirstLetter(word){
409   return word.toString().substring(0, 1).toUpperCase() + word.toString().slice(1);
410 }
411 
412 function getEmail(searchString){          //Function to gextract the user's email from the searchstring
413   return searchString.slice(searchString.indexOf("<>USER<>")+8,searchString.length);
414 }
415 
416 function getSearchString(searchString){   //Function to get the most searchString without the user's email
417   return searchString.slice(0,searchString.indexOf("<>USER<>"));
418 }
419 
420 function securityTest(email){             //Function to check if the user is authorised to acess the stories
421   var runs=ss.getSheetByName("Data").getRange("AG5").getValue();
422   var flag=false;
423   for(var i=0;i<runs;i++){
424     Logger.log("SEC-CHECK-01: Runs-"+runs);
425     Logger.log("SEC-CHECK-02: Email-"+email+" Data-"+ss.getSheetByName("Data").getRange("AI"+(i+1)).getValue());
426     if(JSON.stringify(ss.getSheetByName("Data").getRange("AI"+(i+1)).getValue())==JSON.stringify(email)){
427       flag=true;
428     }
429     Logger.log("SEC-CHECK-03: Flag-"+flag);
430   }return flag;
431 }