【问题标题】:Zip all spreadsheets as CSV and send as email将所有电子表格压缩为 CSV 并作为电子邮件发送
【发布时间】:2013-11-28 14:05:09
【问题描述】:

我正在使用 Google 表格为我正在开发的程序创建数据。我所做的是使用 Google 表格构建数据,然后以 CSV 格式下载,并将其复制到应用程序文件夹中。

问题是现在我的数据中有很多工作表(选项卡),并且逐个下载它们有点麻烦。

所以我想我会使用 Google Apps 脚本创建一个函数,将它们全部转换为 CSV,压缩它们,然后将它们作为下载发送到客户端。

这可行吗?有人有什么建议吗?

【问题讨论】:

  • 是的,它是可行的。看看电子表格应用程序,当你有一些代码时回来。
  • 我开始使用 API 创建一个 CSV 字符串(或以我想要的方式为我的所有工作表创建多个)。如何获取所有这些 CSV 字符串并从中创建文件,将这些文件压缩在一起,然后发送到浏览器进行下载?

标签: google-apps-script google-sheets google-docs google-docs-api


【解决方案1】:
  1. 将工作表转换为 CSV

    参见教程:与您的文档列表交互中的Saving a selected Range to a CSV file

    如果您为此创建一个临时文件夹,然后在该文件夹中生成 CSV 文件,您将简化后面的压缩和清理操作。

  2. 压缩驱动器中的多个文件

    Utilities.zip(blobs, name)。如果所有 zip 文件都在一个临时文件夹中,那么您应该可以执行以下操作:

    function zipSheets() {
      var name = 'All CSV Files.zip';
      var folderName = 'Temp CSV Files';
    
      var folder = DriveApp.getFoldersByName(folderName).next();
      var csvFilesIterator = folder.getFiles();
      var csvFiles = [];
    
      while (csvFilesIterator.hasNext()) {
        csvFiles.push(csvFilesIterator.next().getBlob());
      }
    
      // Create zip file on google drive
      var zipBlob = Utilities.zip(csvFiles, name);
      var zipFile = DriveApp.createFile(zipBlob);
      // NOTE: sharing permissions not set
    
      // get URL of zip file, and display to user.
      // ASSUMES you've launched this from a spreadsheet menu
      var url = DriveApp.getFilesByName(name).next().getUrl();
    
      var htmlApp = HtmlService
         .createHtmlOutput('<p>Zip file URL: '+url+'</p>')
         .setTitle('Zip file created')
         .setWidth(800)
         .setHeight(70);
    
      SpreadsheetApp.getActiveSpreadsheet().show(htmlApp);
    
    }
    
  3. 向客户端发送新创建的 zip 文件的下载 URL。

    File.getUrl(),用它来获取zip文件的URL。 (上面的例子演示了这个功能。)将它嵌入到电子邮件中,以便客户可以点击它。点击后,他们将访问 google drive 中的 zip 文件,因此您还应确保正确设置共享。

    或者,您可以将 zip 文件附加到电子邮件中,从而避免从您的云端硬盘共享。

  4. 清理临时 CSV 文件和文件夹。

    如果您选择将 zip 文件作为附件通过电子邮件发送,您也可以删除临时 zip 文件。

【讨论】:

  • 谢谢,我会处理的。但有一件事,第一个链接有注释:Note: This section uses the DocsList.createFile() method, which is only available for Google Apps accounts。我私下使用谷歌驱动器,而不是作为企业使用。这会是个问题吗?
  • 是的,收到ReferenceError: "DocList" is not defined. 错误...还有其他选择吗?
  • 好的,我发现 DriveApp 似乎能够在没有应用程序的谷歌驱动器中创建文件、文件夹等。顺便说一句,似乎 DocList 已被弃用。
  • 这很好用。唯一的问题是您发布的示例链接中的 CSV 格式不够好。例如,当单元格中有换行符时,它不会添加引号......电子表格的“下载为 CSV”选项可以更好地做到这一点。有没有办法使用与“下载为 CSV”相同的方法转换为 CSV?我有时会下载一张而不是全部,所以我更喜欢它们是否相同。
  • 不幸的是,我们的脚本编写者无法获取 UI(或电子表格函数)使用的代码。您应该能够根据您的特定需求调整教程示例 - 例如,检查文本是否包含换行符或引号,并将其封装。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-14
  • 2015-10-26
  • 2018-05-31
  • 1970-01-01
  • 2023-03-27
  • 1970-01-01
  • 2011-07-21
相关资源
最近更新 更多