Returns undefined variable

I get undefined for a variable named: names Any help on why it doesn't display results. It will appear in the log, but not on index.html or on the web side after clicking on the search.

code:

// var names =[]; //I tried using a global variable but with no luck function SearchFiles(searchTerm) { var searchFor = "title contains '" + searchTerm + "'"; var owneris = "and ' Email@email.com ' in Owners"; var names = []; var fileIds = []; Logger.log(searchFor + " " + owneris); var files = DriveApp.searchFiles(searchFor + " " + owneris); while (files.hasNext()) { var file = files.next(); var fileId = file.getId(); // To get FileId of the file fileIds.push(fileId); var name = file.getName(); names.push(name); } for (var i = 0; i < names.length; i++) { //this is showing in the Logger Logger.log(names[i]); Logger.log("https://drive.google.com/uc?export=download&id=" + fileIds[i]); } } function returnNames(names) { return '<h3><b>returnNames has ran.!</b></h3> <br>' + names; // Why does this names variable return undefined??? } function doGet(e) { var template = HtmlService.createTemplateFromFile('Index'); return template.evaluate() .setTitle('Search Drive') .setSandboxMode(HtmlService.SandboxMode.IFRAME); } function processForm(searchTerm) { var resultToReturn; Logger.log('processForm was called! ' + searchTerm); resultToReturn = SearchFiles(searchTerm); Logger.log('resultToReturn: ' + resultToReturn) // shows as undefined in the logger return resultToReturn; } 
 <!DOCTYPE html> <html> <head> <base target="_top"> <script> function displayMessage() { var searchTerm; searchTerm = document.getElementById('idSrchTerm').value; console.log('searchTerm: ' + searchTerm); google.script.run.processForm(searchTerm); google.script.run.withSuccessHandler(handleResults).returnNames(); } function handleResults(searchTerm) { console.log('Handle Results was called! '); document.writeln(searchTerm); } </script> </head> <body> <input type="text" id="idSrchTerm" name="search"> <input type="button" value="submitButton" name="submitButton" onclick="displayMessage()" /> </body> </html> 
+5
source share
2 answers

I think you are doing it wrong. It will work if you return returnNames(names) at the end of SearchFiles , and you simply call google.script.run.withSuccessHandler(handleResults).processForm(searchTerm); inside its index.html as follows:

Code.gs

 function SearchFiles(searchTerm) { var searchFor = "title contains '" + searchTerm + "'"; var owneris = "and ' Email@email.com ' in Owners"; var names = []; var fileIds = []; Logger.log(searchFor + " " + owneris); //Logger.log(searchFor); var files = DriveApp.searchFiles(searchFor + " " + owneris); //var files = DriveApp.searchFiles(searchFor); while (files.hasNext()) { var file = files.next(); var fileId = file.getId(); // To get FileId of the file fileIds.push(fileId); var name = file.getName(); names.push(name); } for (var i = 0; i < names.length; i++) { //this is showing in the Logger Logger.log(names[i]); Logger.log("https://drive.google.com/uc?export=download&id=" + fileIds[i]); } return returnNames(names); // Here call directly returnNames and get the wanted result } function returnNames(names) { var result = '<h3><b>returnNames has ran.!</b></h3> <br>'; // + names; // Why does this names variable return undefined??? result += '<div>names.length = '+names.length+'</div>'; for(var i=0; i<names.length; i++) { result += '<div>'+names[i]+'</div>'; } return result; } function doGet(e) { var template = HtmlService.createTemplateFromFile('Index'); return template.evaluate() .setTitle('Search Drive') .setSandboxMode(HtmlService.SandboxMode.IFRAME); } function processForm(searchTerm) { var resultToReturn; Logger.log('processForm was called! ' + searchTerm); resultToReturn = SearchFiles(searchTerm); Logger.log('resultToReturn: ' + resultToReturn) // shows as undefined in the logger return resultToReturn; } 

Index.html

 <!DOCTYPE html> <html> <head> <base target="_top"> <script> function displayMessage() { var searchTerm; searchTerm = document.getElementById('idSrchTerm').value; console.log('searchTerm: ' + searchTerm); //google.script.run.processForm(searchTerm); //google.script.run.withSuccessHandler(handleResults).returnNames(); google.script.run.withSuccessHandler(handleResults).processForm(searchTerm); } function handleResults(searchTerm) { console.log('Handle Results was called! '); document.writeln(searchTerm); } </script> </head> <body> <input type="text" id="idSrchTerm" name="search"> <input type="button" value="submitButton" name="submitButton" onclick="displayMessage()" /> </body> </html> 

The result of a screenshot of my files using the term "test" :

Screenshot

+3
source

You can try this to pass the names into your google script.

In SearchFiles (searchTerm) you return names (which can be either an empty array or a valuable array with the names in it).

 // var names =[]; //I tried using a global variable but with no luck var Logger = { log: function(){ console.log(arguments[0]); } }; function SearchFiles(searchTerm) { var searchFor = "title contains '" + searchTerm + "'"; var owneris = "and ' Email@email.com ' in Owners"; var names = ["file1","file2","file3"]; var fileIds = []; Logger.log(searchFor + " " + owneris); /* var files = DriveApp.searchFiles(searchFor + " " + owneris); while (files.hasNext()) { var file = files.next(); var fileId = file.getId(); // To get FileId of the file fileIds.push(fileId); var name = file.getName(); names.push(name); }*/ for (var i = 0; i < names.length; i++) { //this is showing in the Logger Logger.log(names[i]); Logger.log("https://drive.google.com/uc?export=download&id=" + fileIds[i]); } return names; } function returnNames(names) { return '<h3><b>returnNames has ran.!</b></h3> <br>' + names; // Why does this names variable return undefined??? } function doGet(e) { var template = HtmlService.createTemplateFromFile('Index'); return template.evaluate() .setTitle('Search Drive') .setSandboxMode(HtmlService.SandboxMode.IFRAME); } function processForm(searchTerm) { var resultToReturn; Logger.log('processForm was called! ' + searchTerm); resultToReturn = SearchFiles(searchTerm); Logger.log('resultToReturn: ' + resultToReturn) // shows as undefined in the logger return resultToReturn; } 
 <!DOCTYPE html> <html> <head> <base target="_top"> <script> function displayMessage() { var searchTerm; searchTerm = "DUMMY TEXT";//document.getElementById('idSrchTerm').value; console.log('searchTerm: ' + searchTerm); //google.script.run.processForm(searchTerm); //google.script.run //.withSuccessHandler(handleResults) //.returnNames(google.script.run.processForm(searchTerm)); processForm(searchTerm); } function handleResults(searchTerm) { console.log('Handle Results was called! '); document.writeln(searchTerm); } </script> </head> <body> <input type="text" id="idSrchTerm" name="search"> <input type="button" value="submitButton" name="submitButton" onclick="displayMessage()" /> </body> </html> 
+1
source

Source: https://habr.com/ru/post/1265003/


All Articles