2017-03-03 15 views
5

Otrzymuję niezdefiniowaną wartość dla zmiennej o nazwie: name Dowolna pomoc dotycząca przyczyny wyświetlania wyników. Zostanie wyświetlony w rejestratorze, ale nie w index.html lub stronie internetowej po naciśnięciu przycisku wyszukiwania. KodNieokreślone zwroty zmiennych

:

// var names =[]; //I tried using a global variable but with no luck 
 

 
function SearchFiles(searchTerm) { 
 
    var searchFor = "title contains '" + searchTerm + "'"; 
 
    var owneris = "and '[email protected]' 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>

+1

na jakiej linii pojawia się błąd? To może pomóc w debugowaniu problemu. – Rikin

+0

Otrzymuję niezdefiniowane na linii funkcja returnNames (nazwy) - widać, że skomentowałem kilka linii problemy – OblongMedulla

+2

. Najpierw w indeksie nie przekazujesz niczego do returnNames(). Tak więc, gdy funkcja działa, staje się niezdefiniowana i prawdopodobnie drukuje niezdefiniowana. Po drugie myślę, że zakładasz, że nazwy będą dostępne globalnie, których nie widzę. – Rikin

Odpowiedz

3

myślę, że robisz to w niewłaściwy sposób. Będzie działać, jeśli wrócisz returnNames(names) na koniec SearchFiles i po prostu zadzwonić google.script.run.withSuccessHandler(handleResults).processForm(searchTerm); wewnątrz index.html tak:

Code.gs

function SearchFiles(searchTerm) { 
    var searchFor = "title contains '" + searchTerm + "'"; 
    var owneris = "and '[email protected]' 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> 

Zrzut ekranu wyników moich plików z użyciem terminu "test":

Screenshot working

+0

To działa! Dzięki za pomoc!! – OblongMedulla

1

Można spróbować to w ten sposób, aby przejść wokół nazwy skryptu google.

W SearchFiles (searchTerm) zwracasz nazwy (które mogą być pustą tablicą lub cenioną tablicą z nazwami).

// 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 protected]' 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>

+0

jego zwrot dla mnie, wszelkie myśli? – OblongMedulla

+1

Zmodyfikowałem trochę kod, aby sprawdzić, czy działa i tak działa. Jeśli postępujesz zgodnie z tym samym kodem zamieszczonym powyżej, może to oznaczać, że twój mechanizm odczytu pliku napotyka problem. Umieść tam debugger, aby się dowiedzieć. – Rikin

+0

To pokazuje processForm nie jest zdefiniowany w dzienniku konsoli. – OblongMedulla

Powiązane problemy