1

在我的脚本中,我试图创建一个文件夹,在所述文件夹中创建一个带日期戳的文档,创建一个子文件夹,然后将一些文档复制到该子文件夹中。

所有这一切都很好。当我尝试通过此处找到的任何一种方法压缩父文件夹时:使用应用程序脚本在 google drive 内创建一个 zip 文件- 它会创建一个带有唯一 PDF 文件的 zip 文件,该文件与带日期戳的文档同名。压缩的 PDF 是空白的,并且子文件夹不存在。

任何关于为什么会发生这种情况的见解都会很棒。

var folder = DocsList.createFolder(folderTitle);
var subFolder = folder.createFolder('Attachments');
    subfolder.createFile(attachments[]); //In a loop that creates a file from every
                                         //attachment from messages in thread

var doc = DocumentApp.create(docTitle); //Google Doc
var docLocation = DocsList.getFileById(doc.getId());
    docLocation.addToFolder(folder);
    docLocation.removeFromFolder(DocsList.getRootFolder());
//Everything works fine, I can view file and subfolder, and subfolder's documents

//This is where the problem is:
var zippedFolder = DocsList.getFolder(folder.getName());
    zippedFolder.createFile(Utilities.zip(zippedFolder.getFiles(), 'newFiles.zip'));
//this results in a zipped folder containing one blank pdf that has the same title as doc
4

2 回答 2

1

The DocsList service has been deprecated so Phil Bozak's previous solution no longer works. However, refer to another SO question for solution that works with DriveApp class.

于 2014-12-27T19:52:28.487 回答
0

这是一个很好的问题。zip 功能似乎没有压缩子文件夹的能力。您的脚本不起作用的原因是您只从文件夹中选择文件

一种解决方案是压缩每个子文件夹并将其存储在一个压缩文件中。您可以使用我为此编写的函数。

function zipFolder(folder) {
  var zipped_folders = [];
  var folders = folder.getFolders();
  for(var i in folders)
    zipped_folders.push(zipFolder(folders[i]));
  return Utilities.zip(folder.getFiles().concat(zipped_folders),folder.getName()+".zip");
}

这会递归压缩所有子文件夹。然后你需要用类似的东西创建文件

DocsList.getFolder("path/to/folder/to/store/zip/file").createFile(zipFolder(folderToZip));

我将提出一个功能请求以允许压缩子文件夹。

于 2013-02-17T04:55:39.517 回答