2014-03-04 20 views
0

我確信我必須做些愚蠢的事情,但我沒有看到它是什麼。我怎樣才能得到一個簡單的文本文件的內容?它是否需要擴展名爲.txt?也許這與一年前如何創建該文件有關?DocumentApp.openById()失敗並顯示「服務不可用」

錯誤是:'服務不可用:文檔(第61行,文件「fileFuncs」)'。第61行在下面突出顯示。

在此先感謝您的幫助。

function testGetFile() 
{ 

getFile("testGetFile", "WhoAmI"); 

} 

function getFile(calledFrom, targetFile) 
{ 

var root = DriveApp.getRootFolder(); 
var files=root.getFiles(); 
var numFiles=0; 

while (files.hasNext()) { 
    var file = files.next(); 
    numFiles++; 
    var filename = file.getName(); 


    if (filename == targetFile) { 

     Logger.log("Success. Found file: " + filename); 
     Logger.log(' Number of files processed = '+numFiles+'\n\n'); 

     var fileId = file.getId(); 
     **var doc = DocumentApp.openById(fileId);  // Line 61:THIS FAILS with above error** 
     var body=doc.getBody(); 
     var text=body.getText(); 

     Logger.log('text = '+text);// there it is   

     return text; 
    } 

    } // while() 

return -1; 
} 
+0

它只是想到了......這是否需要使用新的谷歌牀單?我希望不是。 –

+0

你測試過你檢索的文件類型嗎?用類似於:Logger.log(file.getMimeType())。在您的代碼中,您嘗試打開一個Google文檔,但是您使用Google電子表格標記標記了您的文章,並且您正在討論一個txt文件0_o txt可以用driveapps打開,文檔應用程序可以打開文檔應用程序,電子表格由spreadsheetapp打開 – Harold

+0

感謝提示getMimeType ...它報告,Mime類型:文本/純文本。我用谷歌電子表格標記它,因爲腳本在電子表格中運行。所以,根據你的評論,我正確地打開它,是嗎? –

回答

1

既然我們知道這是一個文本/純文本,我們可以添加好的方法來處理它。正如Serge在其發佈的文章中所說的,您使用的方法僅適用於「google文檔」文件,因此您必須在使用它之前檢查這是否是Google文檔文件。我們將這樣做,但與文本/純文件:

function testGetFile(){ 
    getFile("testGetFile", "WhoAmI"); 
} 

function getFile(calledFrom, targetFile){ 
    var root = DriveApp.getRootFolder(); 
    var files=root.getFiles(); 

    /* 
    instead of a root getFiles() I prefer to use searchFiles 
    I'ts less work for your script. 
    the documentation on search: https://developers.google.com/drive/web/search-parameters 
    */ 
    files = root.searchFiles("title = 'WhoAmI' and mimeType = 'text/plain'"); // if it's a txt doc it should have .txt at the end of it's title: "WhoAmI.txt" 
    var numFiles=0; 

    while (files.hasNext()) { 
    var file = files.next(); 
    numFiles++; 
    var filename = file.getName(); 
    var mime = file.getMimeType(); 
    Logger.log(mime); // produce a lot of output 

    if (filename == targetFile && mime=="application/vnd.google-apps.document") { 

     Logger.log("Success. Found GOOGLE DOC file: " + filename); 
     Logger.log(' Number of files processed = '+numFiles+'\n\n'); 

     var fileId = file.getId(); 
     var doc = DocumentApp.openById(fileId);  // this won't fail anymore (I hope) 
     var body=doc.getBody(); 
     var text=body.getText(); 

     Logger.log('text = '+text);// there it is   

     return text; 
    } 
    else if(filename == targetFile && mime=="text/plain") { 
     Logger.log("Success. Found TXT file: " + filename); 
     Logger.log(' Number of files processed = '+numFiles+'\n\n'); 
     var text = file.getBlob().getDataAsString(); 
     Logger.log('text = '+text);// there it is   

     return text; 
    } 
    } // while() 
    return -1; 
} 
+0

當按原樣運行時,此功能非常有用。謝謝!並感謝您指向文檔的指針!甚至在上述更正之前,仍然存在一個新的相關問題。簡而言之,當上述函數用作庫的一部分時,對DriveApp.getRootFolder()的調用會失敗,並且會出現權限問題。我正在考慮爲它啓動一個新線程,但唯一的區別是:function testGetFile() { PT。的GetFile( 「WHOAMI」); } 確切的錯誤消息:執行失敗:您無權調用getRootFolder。我的腳本,我的文件夾,我的文件,我的驅動器...爲什麼沒有權限? –

1

正如在評論中提到,你當條件爲真只適用於谷歌文檔,如果你嘗試使用它們對其他類型的文件將無法使用該方法。

爲了防止這種情況只是在你的代碼添加第二個條件是這樣的:

if (filename == targetFile && file.getMimeType()=="application/vnd.google-apps.document") { 

上述修改,你不會得到錯誤了,但沒有你將不能夠打開一個機會你嘗試過的目標,因爲它不是正確的MIME類型。

+0

感謝您的回覆。我很困惑。據哈羅德說,「txt可以用driveapps打開」。正如我在一分鐘前對哈羅德的評論中提到的那樣,該MIME類型報告爲「文本/純文本」。但是您已經聲明:「條件爲真時使用的方法僅適用於Google文檔,如果嘗試在其他文件類型上使用它們,將會失敗」。所以,這與Harold所說的相矛盾,留下了這個問題......打開文本文檔的正確方法是什麼?它會失敗,因爲它沒有擴展名.txt?謝謝你的幫助! –

+0

查看Harold的答案,清楚地顯示如何獲取txt文件內容。我在談論的只是適用於Google文檔的DocumentApp。 –

相關問題