有没有办法使用 API 从 google 驱动器上的多个文件创建一个 zip 文件?
Is there a way to create a zip file from multiple files on google drive with the API?
如果您下载目录,Google Drive Web 界面允许您下载单个 .zip 文件。但是,我发现无法使用 API 来做到这一点。是否可以使用 API 在驱动器上创建多文件 zip?
更新:Tanakie 的代码有效!这很棒!但是,我只能在我的个人帐户中使用它。我有两个 G-Suite 管理员帐户,但收到错误消息:
“抱歉,此时无法打开文件。
请检查地址并重试。"
我已经确认这在多个免费个人 google 帐户中工作正常。
知道为什么它在使用付费 google 帐户时不起作用吗?
-------- 更新 ------
如果您收到 "Sorry, unable to open the file at this time" 错误,请等待一天,该错误会自行修复。
这是我的最终解决方案,只有 POST。就像田内池在下面所说的那样。
Google 脚本:
function doPost(e) {
var zipFileName = e.parameter.zipFileName
var fileIds = e.parameter.ids.split(",");
return ContentService.createTextOutput(zipping(fileIds, zipFileName));
}
function zipping(fileIds, zipfilename) {
var blobs = [];
var mimeInf = [];
var accesstoken = ScriptApp.getOAuthToken();
fileIds.forEach(function(fileID) {
try {
var file = DriveApp.getFileById(fileID);
var mime = file.getMimeType();
var name = file.getName();
} catch (er) {
return er
}
var blob;
if (mime == "application/vnd.google-apps.script") {
blob = UrlFetchApp.fetch("https://script.google.com/feeds/download/export?id=" + fileID + "&format=json", {
method: "GET",
headers: {"Authorization": "Bearer " + accesstoken},
muteHttpExceptions: true
}).getBlob().setName(name);
} else if (~mime.indexOf('google-apps')) {
mimeInf =
mime == "application/vnd.google-apps.spreadsheet" ? ["application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", name + ".xlsx"] : mime == "application/vnd.google-apps.document" ? ["application/vnd.openxmlformats-officedocument.wordprocessingml.document", name + ".docx"] : mime == "application/vnd.google-apps.presentation" ? ["application/vnd.openxmlformats-officedocument.presentationml.presentation", name + ".pptx"] : ["application/pdf", name + ".pdf"];
blob = UrlFetchApp.fetch("https://www.googleapis.com/drive/v3/files/" + fileID + "/export?mimeType=" + mimeInf[0], {
method: "GET",
headers: {"Authorization": "Bearer " + accesstoken},
muteHttpExceptions: true
}).getBlob().setName(mimeInf[1]);
} else {
blob = UrlFetchApp.fetch("https://www.googleapis.com/drive/v3/files/" + fileID + "?alt=media", {
method: "GET",
headers: {"Authorization": "Bearer " + accesstoken},
muteHttpExceptions: true
}).getBlob().setName(name);
}
blobs.push(blob);
});
var zip = Utilities.zip(blobs, zipfilename);
var driveFolder = DriveApp.getFoldersByName("zipFiles").next();
return driveFolder.createFile(zip).getId();
}
php 调用代码:
$url = 'https://script.google.com/a/domain.com/macros/s/### script id ####/exec';
$googleIDs = array();
foreach($documents AS $document){
$googleIDs[] = $document->google_file_id;
}
$data['zipFileName'] = date('c') . ".zip";
$data['ids'] = join(',', $googleIDs);
$ch = curl_init();
curl_setopt($ch, CURLOPT_HTTPHEADER, array( "Content-type: multipart/form-data" ));
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
$result = curl_exec($ch); // This returns the Google file ID of the zip file.
curl_close($ch);
但是,正如我在下面的评论中所说,这是一个无用的、徒劳的练习,因为 Google 将脚本创建的文件限制为 10M。我要去寻找一个不依赖于 Google 的解决方案...希望我在开始之前就知道这一点。
这个解决方法怎么样?
不幸的是,在 Google API 中没有 API 可以直接从外部创建 zip 文件。但我认为有一个解决方法。 Google Apps Script (GAS) 中有 zip()
Class 实用程序的方法。还有 Web Apps 作为从外部使用 GAS 的服务。我觉得你想做的事情可以通过组合来实现。
流量:
- 使用 Class 实用程序的
zip()
方法创建用于创建 zip 文件的 GAS 脚本。
- 将脚本部署为 Web 应用程序。
- 您可以使用应用程序的 GET 和 POST 方法从外部启动脚本。访问Web Apps时,也可以给一些参数和数据。
参考:
如果这对您没有用,我很抱歉。
编辑:
下面的示例脚本怎么样?这是一个简单的示例脚本,用于为文件夹中的文件创建 zip 文件。
- 文件夹中包含Google个Spreadsheet、Document和Slide文档时,分别转换为Excel、Word和Powerpont格式。
- 当文件夹中包含独立脚本时,它们会转换为文本数据。
- 不转换其他类型(图像、文本数据等)。
这些与网络界面相同。
为了使用这个脚本
请执行以下流程。
- 将示例脚本复制并粘贴到脚本编辑器中。并保存。
- 部署网络应用程序
- 在脚本编辑器上
- 发布 -> 部署为网络应用程序
- 在 "Project version",创建新版本。
- 在 "Execute the app as:"、select "Me"。
- 在 "Who has access to the app:"、select "Anyone, even anonymous"。
- 单击“部署”按钮。
- 按如下所示使用 curl 命令测试 Web 应用程序。
- 如果您能得到创建的 zip 文件的文件 ID,则说明该脚本有效。
示例脚本:
function doGet(e) {
var files = DriveApp.getFolderById(e.parameter.folderid).getFiles();
var fileIds = [];
while (files.hasNext()) {
fileIds.push(files.next().getId());
}
return ContentService.createTextOutput(zipping(fileIds));
}
function zipping(fileIds) {
var zipfilename = "sample.zip";
var blobs = [];
var mimeInf = [];
var accesstoken = ScriptApp.getOAuthToken();
fileIds.forEach(function(e) {
try {
var file = DriveApp.getFileById(e);
var mime = file.getMimeType();
var name = file.getName();
} catch (er) {
return er
}
var blob;
if (mime == "application/vnd.google-apps.script") {
blob = UrlFetchApp.fetch("https://script.google.com/feeds/download/export?id=" + e + "&format=json", {
method: "GET",
headers: {"Authorization": "Bearer " + accesstoken},
muteHttpExceptions: true
}).getBlob().setName(name);
} else if (~mime.indexOf('google-apps')) {
mimeInf =
mime == "application/vnd.google-apps.spreadsheet" ? ["application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", name + ".xlsx"] : mime == "application/vnd.google-apps.document" ? ["application/vnd.openxmlformats-officedocument.wordprocessingml.document", name + ".docx"] : mime == "application/vnd.google-apps.presentation" ? ["application/vnd.openxmlformats-officedocument.presentationml.presentation", name + ".pptx"] : ["application/pdf", name + ".pdf"];
blob = UrlFetchApp.fetch("https://www.googleapis.com/drive/v3/files/" + e + "/export?mimeType=" + mimeInf[0], {
method: "GET",
headers: {"Authorization": "Bearer " + accesstoken},
muteHttpExceptions: true
}).getBlob().setName(mimeInf[1]);
} else {
blob = UrlFetchApp.fetch("https://www.googleapis.com/drive/v3/files/" + e + "?alt=media", {
method: "GET",
headers: {"Authorization": "Bearer " + accesstoken},
muteHttpExceptions: true
}).getBlob().setName(name);
}
blobs.push(blob);
});
var zip = Utilities.zip(blobs, zipfilename);
return DriveApp.createFile(zip).getId();
}
curl 命令示例:
curl -L "https://script.google.com/macros/s/#####/exec?folderid=### folder ID ###"
注:
- 如果您修改了脚本,请将 Web 应用程序重新部署为新版本。由此,反映了最新的脚本。
- 作为示例脚本的限制,此示例脚本仅检查文件夹中的文件。如果要检索文件夹中的文件夹,可以查看示例脚本 here.
- 获得创建的 ZIP 文件的文件 ID 后,您可以使用驱动器 API 下载它。
如果这对你有用,我很高兴。
如果您下载目录,Google Drive Web 界面允许您下载单个 .zip 文件。但是,我发现无法使用 API 来做到这一点。是否可以使用 API 在驱动器上创建多文件 zip?
更新:Tanakie 的代码有效!这很棒!但是,我只能在我的个人帐户中使用它。我有两个 G-Suite 管理员帐户,但收到错误消息:
“抱歉,此时无法打开文件。
请检查地址并重试。"
我已经确认这在多个免费个人 google 帐户中工作正常。 知道为什么它在使用付费 google 帐户时不起作用吗?
-------- 更新 ------
如果您收到 "Sorry, unable to open the file at this time" 错误,请等待一天,该错误会自行修复。
这是我的最终解决方案,只有 POST。就像田内池在下面所说的那样。
Google 脚本:
function doPost(e) {
var zipFileName = e.parameter.zipFileName
var fileIds = e.parameter.ids.split(",");
return ContentService.createTextOutput(zipping(fileIds, zipFileName));
}
function zipping(fileIds, zipfilename) {
var blobs = [];
var mimeInf = [];
var accesstoken = ScriptApp.getOAuthToken();
fileIds.forEach(function(fileID) {
try {
var file = DriveApp.getFileById(fileID);
var mime = file.getMimeType();
var name = file.getName();
} catch (er) {
return er
}
var blob;
if (mime == "application/vnd.google-apps.script") {
blob = UrlFetchApp.fetch("https://script.google.com/feeds/download/export?id=" + fileID + "&format=json", {
method: "GET",
headers: {"Authorization": "Bearer " + accesstoken},
muteHttpExceptions: true
}).getBlob().setName(name);
} else if (~mime.indexOf('google-apps')) {
mimeInf =
mime == "application/vnd.google-apps.spreadsheet" ? ["application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", name + ".xlsx"] : mime == "application/vnd.google-apps.document" ? ["application/vnd.openxmlformats-officedocument.wordprocessingml.document", name + ".docx"] : mime == "application/vnd.google-apps.presentation" ? ["application/vnd.openxmlformats-officedocument.presentationml.presentation", name + ".pptx"] : ["application/pdf", name + ".pdf"];
blob = UrlFetchApp.fetch("https://www.googleapis.com/drive/v3/files/" + fileID + "/export?mimeType=" + mimeInf[0], {
method: "GET",
headers: {"Authorization": "Bearer " + accesstoken},
muteHttpExceptions: true
}).getBlob().setName(mimeInf[1]);
} else {
blob = UrlFetchApp.fetch("https://www.googleapis.com/drive/v3/files/" + fileID + "?alt=media", {
method: "GET",
headers: {"Authorization": "Bearer " + accesstoken},
muteHttpExceptions: true
}).getBlob().setName(name);
}
blobs.push(blob);
});
var zip = Utilities.zip(blobs, zipfilename);
var driveFolder = DriveApp.getFoldersByName("zipFiles").next();
return driveFolder.createFile(zip).getId();
}
php 调用代码:
$url = 'https://script.google.com/a/domain.com/macros/s/### script id ####/exec';
$googleIDs = array();
foreach($documents AS $document){
$googleIDs[] = $document->google_file_id;
}
$data['zipFileName'] = date('c') . ".zip";
$data['ids'] = join(',', $googleIDs);
$ch = curl_init();
curl_setopt($ch, CURLOPT_HTTPHEADER, array( "Content-type: multipart/form-data" ));
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
$result = curl_exec($ch); // This returns the Google file ID of the zip file.
curl_close($ch);
但是,正如我在下面的评论中所说,这是一个无用的、徒劳的练习,因为 Google 将脚本创建的文件限制为 10M。我要去寻找一个不依赖于 Google 的解决方案...希望我在开始之前就知道这一点。
这个解决方法怎么样?
不幸的是,在 Google API 中没有 API 可以直接从外部创建 zip 文件。但我认为有一个解决方法。 Google Apps Script (GAS) 中有 zip()
Class 实用程序的方法。还有 Web Apps 作为从外部使用 GAS 的服务。我觉得你想做的事情可以通过组合来实现。
流量:
- 使用 Class 实用程序的
zip()
方法创建用于创建 zip 文件的 GAS 脚本。 - 将脚本部署为 Web 应用程序。
- 您可以使用应用程序的 GET 和 POST 方法从外部启动脚本。访问Web Apps时,也可以给一些参数和数据。
参考:
如果这对您没有用,我很抱歉。
编辑:
下面的示例脚本怎么样?这是一个简单的示例脚本,用于为文件夹中的文件创建 zip 文件。
- 文件夹中包含Google个Spreadsheet、Document和Slide文档时,分别转换为Excel、Word和Powerpont格式。
- 当文件夹中包含独立脚本时,它们会转换为文本数据。
- 不转换其他类型(图像、文本数据等)。
这些与网络界面相同。
为了使用这个脚本
请执行以下流程。
- 将示例脚本复制并粘贴到脚本编辑器中。并保存。
- 部署网络应用程序
- 在脚本编辑器上
- 发布 -> 部署为网络应用程序
- 在 "Project version",创建新版本。
- 在 "Execute the app as:"、select "Me"。
- 在 "Who has access to the app:"、select "Anyone, even anonymous"。
- 单击“部署”按钮。
- 在脚本编辑器上
- 按如下所示使用 curl 命令测试 Web 应用程序。
- 如果您能得到创建的 zip 文件的文件 ID,则说明该脚本有效。
示例脚本:
function doGet(e) {
var files = DriveApp.getFolderById(e.parameter.folderid).getFiles();
var fileIds = [];
while (files.hasNext()) {
fileIds.push(files.next().getId());
}
return ContentService.createTextOutput(zipping(fileIds));
}
function zipping(fileIds) {
var zipfilename = "sample.zip";
var blobs = [];
var mimeInf = [];
var accesstoken = ScriptApp.getOAuthToken();
fileIds.forEach(function(e) {
try {
var file = DriveApp.getFileById(e);
var mime = file.getMimeType();
var name = file.getName();
} catch (er) {
return er
}
var blob;
if (mime == "application/vnd.google-apps.script") {
blob = UrlFetchApp.fetch("https://script.google.com/feeds/download/export?id=" + e + "&format=json", {
method: "GET",
headers: {"Authorization": "Bearer " + accesstoken},
muteHttpExceptions: true
}).getBlob().setName(name);
} else if (~mime.indexOf('google-apps')) {
mimeInf =
mime == "application/vnd.google-apps.spreadsheet" ? ["application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", name + ".xlsx"] : mime == "application/vnd.google-apps.document" ? ["application/vnd.openxmlformats-officedocument.wordprocessingml.document", name + ".docx"] : mime == "application/vnd.google-apps.presentation" ? ["application/vnd.openxmlformats-officedocument.presentationml.presentation", name + ".pptx"] : ["application/pdf", name + ".pdf"];
blob = UrlFetchApp.fetch("https://www.googleapis.com/drive/v3/files/" + e + "/export?mimeType=" + mimeInf[0], {
method: "GET",
headers: {"Authorization": "Bearer " + accesstoken},
muteHttpExceptions: true
}).getBlob().setName(mimeInf[1]);
} else {
blob = UrlFetchApp.fetch("https://www.googleapis.com/drive/v3/files/" + e + "?alt=media", {
method: "GET",
headers: {"Authorization": "Bearer " + accesstoken},
muteHttpExceptions: true
}).getBlob().setName(name);
}
blobs.push(blob);
});
var zip = Utilities.zip(blobs, zipfilename);
return DriveApp.createFile(zip).getId();
}
curl 命令示例:
curl -L "https://script.google.com/macros/s/#####/exec?folderid=### folder ID ###"
注:
- 如果您修改了脚本,请将 Web 应用程序重新部署为新版本。由此,反映了最新的脚本。
- 作为示例脚本的限制,此示例脚本仅检查文件夹中的文件。如果要检索文件夹中的文件夹,可以查看示例脚本 here.
- 获得创建的 ZIP 文件的文件 ID 后,您可以使用驱动器 API 下载它。
如果这对你有用,我很高兴。