变量返回undefined

问题描述:

我收到未定义的变量名为:名称 为什么它不显示结果的任何帮助。它将显示在记录器中,但不会在按下搜索按钮后显示在index.html或网页上。变量返回undefined

代码:

// 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

你在哪一行得到错误?这可能有助于调试问题。 – Rikin

+0

我得到的函数returnNames(名称)行undefined,你可以看到我评论行 – OblongMedulla

+2

多个问题。首先在索引调用中,您不会将任何内容传递给returnNames()。因此,当函数运行时,它会变得未定义,可能会打印未定义的内容。第二我认为你假设名字将全球可用,我没有看到它。 – Rikin

我认为你在错误的方式做这件事。

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> 
:如果您在 SearchFiles末返回 returnNames(names)和你刚才叫你 google.script.run.withSuccessHandler(handleResults).processForm(searchTerm);里面 index.html这样它会工作

我的文件使用术语"test"的结果截图:

Screenshot working

+0

这工作!谢谢你的帮助!! – OblongMedulla

,您可以尝试这种方式的名字四处传递到您的谷歌的脚本。

在SearchFiles(searchTerm)中,您返回名称(可以是空数组或带有名称的有值数组)。

// 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

它对我来说返回null,有什么想法? – OblongMedulla

+1

我修改了一下代码,看看它是否运行并确实存在。如果您遵循上面发布的相同代码,那么您的文件阅读机制可能会遇到问题。将调试器放在那里以查明。 – Rikin

+0

它显示processForm未在控制台日志中定义。 – OblongMedulla