如何更新Google Apps脚本中的zip?

时间:2016-04-22 09:38:41

标签: google-apps-script

我正在尝试更新Google Apps脚本中的zip文件,但我似乎无法让它工作。

以下是导致问题的代码摘录:

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文件的内容?

1 个答案:

答案 0 :(得分: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]));  
    }
}