我正在尝试更新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文件的内容?
答案 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]));
}
}