2016-09-25 107 views
0

我不敢相信没有一个简单的方法来做到这一点,但我到处寻找一个工作的解决方案,但没有成功。谷歌脚本测试文件存在

我在Google表单中运行Google脚本,我在代码中想要将电子表格保存为新文件名。在我这样做之前,我想检查是否已经有一个存在(因为我不想覆盖它)。

无论文件夹或文件是否存在,下面我用来测试的代码都会返回“File Exists”。

与往常一样,任何帮助非常感谢:-)

这里是我的测试代码。

function testscriptforfileexistance() { 
    filecheck = checkfileexists("UnderDevelopment",'20160919 Weekly Roster v1.0.gsheet'); 

    if (filecheck.filefound = true) { 
    Browser.msgBox("file found") ; 
    } else { 
    Browser.msgBox("File not found"); 
    } 
} 


function checkfileexists(foldername,fn) { 
    var destFolder = DriveApp.getFoldersByName(foldername); 
    filefound=false; 
    var destFileId = DriveApp.getFilesByName(fn); 
//if hasnext returns false, presumably it doesn't exist 
    if (!destFileId.hasNext) { 
    Logger.log ("Found"); 
    filefound = true; 
// and as a second test, if the length is zero the file doesn't exist 
    if (!destFileId[0]) { 
    Logger.log ("zero length"); 
    filefound=false; 
    } 
    } 
    return {filefound:filefound}; 
} 

干杯 ......史蒂夫

回答

0

谢谢@Mr Rebot(或@ Mr-Rebot)。 你的checkfile2代码几乎奏效。

我在函数调用中调用了文件夹名和文件名(仅用于与我的其他调用代码兼容)。

现在我的测试调用代码看起来像这样

function testscriptforfileexistance() { 
    if (checkFile2('UnderDevelopment','test.txt')) { 
    Browser.msgBox("file found") ; 
    } else { 
    Browser.msgBox("File not found"); 
    } 
} 

有了这个,我MSGBOX消息总是出现“找不到文件”,即使文件test.txt确实存在,虽然日志显示正确[真,找到文件夹,找到文件]。所以我假设布尔状态没有被传回给调用函数。

因此,我添加了一些显式布尔变量的东西,并修复它,除了我发现它只适用于没有空格的文件名(如'test.txt')。

以下是修改过的代码,它与'test.txt'的文件名搜索一起使用,但始终以'20160919 Weekly Roster v1.0返回未找到文件和记录[True,Folder Found,No File Found,false] .gsheet”

function testscriptforfileexistance() { 
    check= checkFile2("UnderDevelopment","20160919 Weekly Roster v1.0.gsheet"); 
    if (check.filefound==true) { 
    Browser.msgBox("file found") ; 
    } else { 
    Browser.msgBox("File not found"); 
    } 
} 

function checkFile2(foldername,filename){ 
    //Supplied version Mr Rebot - testing 
     var filefound=false; 
     var folder = DriveApp.getFoldersByName(foldername); 

    Logger.log(folder.hasNext()); 

    //Folder does not exist 
    if(!folder.hasNext()){ 

    Logger.log("No Folder Found"); 

    } 
    //Folder does exist 
    else{ 
    Logger.log("Folder Found") 
    var file = folder.next().getFilesByName(filename); 
    if(!file.hasNext()){ 
     Logger.log("No File Found"); 
    } 
    else{ 
     Logger.log("File Found"); 
     filefound=true; 
    } 
    } 
    Logger.log(filefound); 
    return {filefound:filefound}; 
} 

我试图把在调用的参数在双引号而不是单引号checklist2但并没有区别。

仍然不知道为什么这是如此艰难的气体 - 检查文件是否存在必须经常做的事情,我会想到的。

感谢所有帮助Rebot先生(图略和!):-)

干杯 ......史蒂夫

+0

发现问题。似乎除非文件具有除.gsheet之外的显式扩展名,否则getFilesByName会添加.gsheet的默认文件扩展名。因此,如果您已经在getFilesByName filename参数中指定了.gsheet,则会为其添加另一个.gsheet(将文件名的总扩展名扩展为.gsheet.gsheet)。将.gsheet扩展名关闭文件名(如果它是一个gsheet),然后与上面的代码一起使用。叹。 – SteveP

0

如果你在你的Dropbox超过1个文件,它可能随时回来真有hasNext?尝试使用getDateCreated对其进行测试?如果它是空的,你知道它不存在。然后你可以选择它作为你的假。

+0

谢谢图略。文件实际上是在我的Googledrive文件夹结构中,而不是DropBox。无论如何,getDateCreated似乎是为文件夹,而不是文件。 – SteveP

+0

我的歉意,这就是我的意思。我稍后会捣乱,看看我出现了什么。 –

1

这有点令人困惑,因为如果您检查文件夹/文件或文件存在于特定文件夹中,会涉及到很多hasNext。我通过试验和错误得到了这个工作。

hasNext()

  • 决定是否调用next()会返回一个项目。

返回

  • Boolean - true如果next()会返回一个项目; false如果不是

首先这里有一些相关的SO问题:

这里是一个示例代码:

function checkFile(filename){ 
    var results; 
    var haBDs = DriveApp.getFilesByName(filename) 
    //Does not exist 
    if(!haBDs.hasNext()){ 
    results = haBDs.hasNext(); 
    } 
    //Does exist 
    else{ 
    results = haBDs.hasNext(); 
    } 
    Logger.log(results) 
    return results; 
} 

function myFunction() { 
    var nomeDB = "FILE_NAME"; 
    if(checkFile(nomeDB) == true){ 
    Logger.log("File Found") 
    }else{ 
    Logger.log("File Not Found") 
    } 

} 

检查你的代码,请尝试更改!destFileId.hasNext!destFileId.hasNext()

其他信息,如果该文件中的特定文件夹中,您将使用相同的流量会被检查,但你必须检查,如果该文件夹也不会存在(可选)。

这里是一个片段:

function checkFile2(filename,foldername){ 

    var folder = DriveApp.getFoldersByName(foldername); 

    Logger.log(folder.hasNext()); 

    //Folder does not exist 
    if(!folder.hasNext()){ 

    Logger.log("No Folder Found"); 

    } 
    //Folder does exist 
    else{ 
    Logger.log("Folder Found") 
    var file = folder.next().getFilesByName(filename); 
    if(!file.hasNext()){ 
     Logger.log("No File Found"); 
    } 
    else{ 
     Logger.log("File Found"); 
    } 
    } 

} 

希望这有助于!