2016-04-22 68 views
1

我正在嘗試更新Google Apps腳本中的zip文件,但似乎無法使其工作。如何更新Google Apps腳本中的壓縮文件?

這裏的代碼是導致問題的摘錄:

var filenameToGet = filename+'.zip'; 
var theFilesRetrieved = folder.getFilesByName(filenameToGet); 
if (theFilesRetrieved.hasNext() === false) { 
    // if no file is found then create it 
    folder.createFile(Utilities.zip([ fileXYZ ], filename+'.zip')); 
} else { 
    while (theFilesRetrieved.hasNext()) { 
     var fileZIP = theFilesRetrieved.next(); 
     fileZIP.setContent(Utilities.zip([ fileXYZ ]).getBytes()); 
    } 
} 

如果「filename.zip」不存在腳本正確創建的zip文件。

如果「filename.zip」確實存在,則創建的文件已損壞。這使我相信它是這條線是錯誤的:

fileZIP.setContent(Utilities.zip([ fileXYZ ]).getBytes()); 

我已經試過.getDataAsString(),只是Utilities.zip([fileXYZ])很好,但這些也造成損壞的zip文件。

(fileXYZ是一個文件blob)。

如何更新alreadys存在的zip文件的內容?

+0

我想你錯過了嵌套組括號在這裏 - 我其實只調用CreateFile有一個說法,通過Utilities.zip創建一個blob。 – user1464409

回答

1

方法setContent需要一個字符串作爲其參數。這適用於文本文件,但不適用於zip文件等二進制文件。

爲了覆蓋二進制文件的內容,需要Advanced Drive Service(使用前必須是enabled),如Sandy Good explained here。具體來說,使用Drive.Files.update,將元數據對象作爲第一個參數,將文件ID作爲第二個參數,將blob作爲第三個參數。

Drive.Files.update({mimeType: 'application/zip'}, fileZIP.getId(), Utilities.zip([fileXYZ])); 

腳本的範圍內相同的:

var filenameToGet = filename+'.zip'; 
var theFilesRetrieved = folder.getFilesByName(filenameToGet); 
if (theFilesRetrieved.hasNext() === false) { 
    // if no file is found then create it 
    folder.createFile(Utilities.zip([ fileXYZ ], filename+'.zip')); 
} else { 
    while (theFilesRetrieved.hasNext()) { 
     var fileZIP = theFilesRetrieved.next(); 
     Drive.Files.update({mimeType: 'application/zip'}, fileZIP.getId(), Utilities.zip([fileXYZ])); 
    } 
} 
+0

我試過* fileZIP.setContent(Utilities.base64Encode(Utilities.zip([fileXYZ])。getBytes())); *但是沒有生成有效的zip文件。那是你的意思嗎? – user1464409

+1

是的,我的猜測是錯誤的。看到重寫的答案。 – 2016-04-22 22:09:14

相關問題