有没有办法使用 API 从 Google Drive 上的多个文件创建 zip 文件?

2023-11-24

如果您下载目录,Google 云端硬盘网络界面允许您下载单个 .zip 文件。但是,我找不到使用 API 来做到这一点的方法。是否可以使用 API 在驱动器上创建多文件 zip?

更新:Tanakie 的代码有效!这很棒!但是,我只能在我的个人帐户中使用它。我有两个 G-Suite 管理员帐户,但收到错误:

“抱歉,目前无法打开该文件。

请检查地址并再试一次。”

我已经确认这在多个免费个人谷歌帐户中运行良好。 知道为什么它在使用付费谷歌帐户时不起作用吗?

- - - - 更新 - - -

如果您收到“抱歉,此时无法打开文件”错误,请稍等一天,该错误将会自行修复。

这是我仅使用 POST 的最终解决方案。和田池下面说的差不多。

谷歌脚本:

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 API 中没有用于直接从外部创建 zip 文件的 API。但我认为有一个解决方法。有zip()Google Apps 脚本 (GAS) 中的类实用程序的方法。还有 Web 应用程序作为从外部使用 GAS 的服务。我认为你想要做的事情可以通过将它们结合起来来实现。

Flow :

  1. 使用以下命令创建用于创建 zip 文件的 GAS 脚本zip()类实用程序的方法。
  2. 将脚本部署为 Web 应用程序。
  3. 您可以使用应用程序的 GET 和 POST 方法从外部启动脚本。当您访问Web Apps时,您还可以给出一些参数和数据。

参考 :

  • 类实用程序中的 zip() 方法
  • Web Apps

如果这对您没有用,我很抱歉。

Edit :

下面的示例脚本怎么样?这是一个简单的示例脚本,用于为文件夹中的文件创建 zip 文件。

  • 当文件夹中包含电子表格、文档和幻灯片的 Google 文档时,它们将分别转换为 Excel、Word 和 Powerpont 格式。
  • 当文件夹中包含独立脚本时,它们将转换为文本数据。
  • 其他类型(图像、文本数据等)不会转换。

这些与 Web 界面相同。

为了使用这个脚本

请执行以下流程。

  1. 将示例脚本复制并粘贴到脚本编辑器。并保存它。
  2. Deploy Web Apps
    • On script editor
      • 发布 -> 部署为 Web 应用程序
      • 在“项目版本”中,创建新版本。
      • 在“执行应用程序为:”中,选择“我”。
      • 在“谁有权访问该应用程序:”中,选择“任何人,甚至匿名”。
      • 单击部署按钮。
  3. Test the Web Apps using curl command as follows.
    • 如果您可以获取创建的 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 -L "https://script.google.com/macros/s/#####/exec?folderid=### folder ID ###"

Note :

  • 如果您修改了脚本,请将 Web Apps 重新部署为新版本。由此,反映了最新的脚本。
  • 作为示例脚本的限制,此示例脚本仅检查文件夹中的文件。如果你想检索文件夹中的文件夹,可以看示例脚本here.
  • 获得创建的 ZIP 文件的文件 ID 后,您可以使用 Drive API 下载它。

如果这对你有用,我很高兴。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

有没有办法使用 API 从 Google Drive 上的多个文件创建 zip 文件? 的相关文章

  • 托管 bean 有时为 null,有时不为 null

    我有一个托管 bean LoginBean ManagedBean name loginBean SessionScoped public class LoginBean implements Serializable private St
  • 正则表达式 - 使用正则表达式提取电子邮件文档的子字符串

    我正在尝试使用正则表达式提取电子邮件文档的子字符串 我正在在线测试正则表达式 它运行得很好 在线正则表达式测试器 https regex101 com r BbWBPk 1 我有一个功能可以检查 Google Apps 脚本上的正则表达式
  • 构建可通过键盘访问的 Web 应用程序

    您如何构建一个完整的键盘可访问的 Web 应用程序 假设这是一个受控部署环境 在组织内使用 其中访问受到限制 不向公众开放 更新 忘记提及 这是为了提高数据输入效率 与残疾无关 更新 2 在整个应用程序中使用 Flash 有意义吗 考虑到环
  • 如何从 Google 电子表格中删除项目?

    我通过在脚本编辑器上选择 文件 gt 制作副本 错误地制作了 Google Apps 脚本项目的副本 从那时起 每次我在该项目所属的电子表格屏幕上单击 工具 gt 脚本编辑器 时 我看到显示两个项目 原始项目和复制项目 的屏幕 我需要选择一
  • 如何使用脚本格式化 Google 文档中的文本

    我想编写一个脚本来查找所有特定单词并格式化它们的颜色 我尝试了以下操作 但似乎不起作用 function ChangeColor var body DocumentApp getActiveDocument getBody var mywo
  • Eclipse:更改 Maven pom.xml 文件中的 webapp 文件夹

    是否可以在 pom xml 中为 webapp 文件夹定义一个与标准位置 src main webapp 不同的位置 我知道你可以定义你的网络文件夹
  • 清除内容并从另一张纸复制

    我编写了一个脚本 旨在清除 Google Sheets 电子表格的内容并复制并粘贴另一个工作表的内容 需要清除的工作表称为 NEW SHEET 要复制的工作表称为 Database 由于某种原因 该脚本目前无法运行 当我运行它时什么也没有发
  • 如何使用 google Sheet 作为数据库

    如何在 HTML Web 应用程序中生成 Google 工作表数据 并允许用户从 HTML Web 应用程序更新评论 我在谷歌表中有一些数据 通过谷歌表单提交 我想使用搜索按钮根据 请求编号 从网络应用程序搜索工作表数据 应该能够更新网络应
  • 如何修复 OnChange 脚本,该脚本运行良好,但在修改 Google 表格后停止运行

    概述 工作簿根据每条记录的类别分数计算每条记录 或行 的总体分数 类别分数是通过对每个记录的数百个数据点执行的计算得出的 根据我在网上找到的几个示例和教程 我编译了代码以发送名为 checkComplete 的 onChange 电子邮件
  • Google Apps 脚本中的范围要求过高

    Here s 自定义 Google 表格 https docs google com spreadsheets d 1qwOzxP qHWRhI2HZmGdlgKLlXCYIQz4XO2tq1EY 8NE edit gid 0与脚本代码 v
  • 当请求 Google 驱动器范围权限时,会出现无限加载对话框

    我想将 Google Drive 集成到我的应用程序中 以在其中存储用户的应用程序数据 我尝试过的 我已经实现了 Google 登录谷歌开发文档 https developers google com identity sign in an
  • Google 云端硬盘文件插入错误配额超出

    有时 当我尝试将文件插入文件夹时 我会收到此响应 code 403 errors domain usageLimits message The user has exceeded their Drive storage quota reas
  • Firebase GAS webapp Google 弹出窗口消失

    我正在尝试升级我的 firebase GAS web 应用程序 之前我有一个弹出窗口 可以让用户使用 Google 登录 我不确定我做错了什么 但我已经升级到新的 firebase 现在正在尝试使用新的代码格式进行相同的登录 发生的情况是
  • 在 Android 上禁用标注(上下文菜单)

    在网络应用程序中 我需要禁用移动浏览器在触摸并按住 长按 触摸目标 例如 img 或链接 我已经在使用了 webkit touch callout none 它在 iPhone 和 iPad 上运行良好 但似乎不适用于 Android 在
  • 如何设置多个过滤器?

    我有一个关于将过滤器应用于多个值以使用 Google 脚本隐藏它们的问题 我有一个具有多种状态的项目跟踪器 例如 达到目标 已完成 已取消 已延迟 等 我想编写一个脚本来设置 状态 列的筛选器值 以便标记为 已完成 或 的行 已取消 被隐藏
  • 合并从 Google Drive 下载的分割 zip 文件 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我从 Google Drive 下载了 1 个 10 GB 的大文件夹 但它变成了几个压缩文件 我想将从 Google Drive 下载的
  • Google 云端硬盘身份验证异常 - 需要许可吗? (v2)

    我一直在尝试将 Google Drive v2 添加到我的 Android 应用程序中 但无法获得授权 我收到 UserRecoverableAuthIOException 并显示消息 NeedPermission 我感觉 Google A
  • 如何使用 Google 文档附加脚本查看旧版本的代码

    我制作了一个可在 05 21 运行的附加组件 从那时到现在的某个时刻 它破裂了 旧代码不再出现在修订历史中 只能追溯到 05 22 我测试过version 1 并且它有效 这意味着它使用了正确的代码 我可以运行这个工作版本 但我不知道如何重
  • 如果单元格包含“否”,则隐藏 Google 表格中的行 - 多张表格

    我正在运行 1 个主电子表格 其中有 4 个产品特定电子表格从中提取信息 如果没有提取相关信息 较小的电子表格将在所有单元格中显示 否 我希望隐藏带有 否 的行 我已经把一些东西拼凑在一起了 这样的作品 但我无法让它在所有 4 张纸上都工作
  • 迭代数组时,如何在 Google 文档的 Google Apps 脚本中附加项目符号和子项目符号?

    我有一份与会者名单 我想列出每一个 并在其后面添加两个要点 每个要点都有一个子项目符号 我尝试了以下代码 但它列出了数组的元素 然后在末尾写入所有项目符号 for i 0 i lt attendees length i body inser

随机推荐