2016-09-25 75 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"); 
    } 
    } 

} 

希望這有助於!