【问题标题】:Unzip gz-files using GAS throws error Exception: Invalid argument使用 GAS 解压缩 gz 文件会引发错误异常:无效参数
【发布时间】:2021-05-25 08:53:19
【问题描述】:

我正在尝试解压缩作为附件发送到我的电子邮件的 DMARC 报告。它适用于 zip 文件,但不适用于 gz 文件。

在我的代码中,我首先按主题收到正确的电子邮件。如果主题正确,则运行此脚本:

var attachments = message.getAttachments();
  for(var k in attachments){
    var attachment = attachments[k];
    var attachmentBlob = attachment.copyBlob();
    var vedleggsnavn = attachment.getName();
    Logger.log(vedleggsnavn)
    var vedleggstype = attachment.getContentType();
    Logger.log(vedleggstype)
    if(vedleggstype=='application/gzip'){
      Logger.log("ja gzip");
      var files = Utilities.ungzip(attachmentBlob);
      }
    if(vedleggstype=='application/zip'){
      Logger.log("ja zip");
      var files = Utilities.unzip(attachmentBlob);
      }

如果附件类型是应用程序/zip,则将其解压缩并保存在我的 Google Drive 中。如果它是应用程序/gzip,我会收到错误消息。这是我的日志:

  • 10:43:21 AM 信息 yahoo.no!dotl.no!1621555200!1621641599.xml.gz
  • 10:43:21 AM 信息应用程序/gzip
  • 10:43:21 AM 信息 ja gzip
  • 上午 10:43:19 错误异常:无效 参数 lagreVedlegg @ Code.gs:42

我希望有人可以帮助我弄清楚如何解压缩 gz 文件,我没有找到任何有关使用 ungzip 的教程。 (我找到了一个他们写 gunzip 的地方,但看起来不太对。)

我发现了这个:'Invalid Argument' error with un-gzipping Blob in Apps script 但是没看懂。

有人告诉我我的代码不够用。我认为,因为它适用于 zip,所以只发布问题发生的代码就足够了,以保持最小化。但现在我将发布我的完整功能:

function lagreVedlegg(){
  var folderID= ''; //I deleted my ID
  var tittelen = "Report Domain: dotl.no";
  var tittelen2 = "Report domain: dotl.no";
  var tittelLengde = tittelen.length;

  var eldreEnn = new Date(2021,4,21); //huska at telling starter på 0, så måned 4 er mai

  var root = DriveApp.getRootFolder();
  var parentFolder = DriveApp.getFolderById(folderID);
  var antall = 20;

  var threads = GmailApp.getInboxThreads(0, antall);
  //Logger.log(threads)
  for(var i in threads){
    var thread = threads[i];
    var message = thread.getMessages()[0]; // Get first message
    //Logger.log(message)
    var tittel = message.getSubject();
    var tittelKort = tittel.substring(0,tittelLengde);
    Logger.log(tittelKort)
    var avsender = message.getFrom(); 
    //Logger.log(avsender)
    var dato = message.getDate(); 
    //Logger.log(dato)
    //Logger.log(eldreEnn)

    if((tittelKort==tittelen || tittelKort==tittelen2)  && dato > eldreEnn){
      Logger.log(avsender); // Log from address of the message
      var attachments = message.getAttachments();
      for(var k in attachments){
        var attachment = attachments[k];
        var attachmentBlob = attachment.copyBlob();
        var vedleggsnavn = attachment.getName();
        Logger.log(vedleggsnavn)
        var vedleggstype = attachment.getContentType();
        Logger.log(vedleggstype)
        if(vedleggstype=='application/gzip'){
          Logger.log("ja gzip");
          attachment.setContentType('application/x-gzip');
          var attachmentBlob = attachment.copyBlob();
          var files = Utilities.ungzip(attachmentBlob);
          }
        if(vedleggstype=='application/zip'){
          Logger.log("ja zip");
          var files = Utilities.unzip(attachmentBlob);
          }
        Logger.log(files)
        files.forEach(function(file) {
          Logger.log(file)
          //Logger.log(parentFolder)
          parentFolder.createFile(file);
        })
      }
      thread.moveToArchive();
      Logger.log(tittel + "flyttet")
    }
  }
}

【问题讨论】:

  • 您的脚本不符合minimal reproducible example 的要求,消息未定义,没有函数声明,无法使用。
  • 谢谢@Cooper。我认为,因为它适用于 zip,所以只发布问题发生的代码就足够了,以保持最小化。我现在已经发布了这个功能。请让我知道任何解释 Utilities.ungzip 和 Utilities.unzip 之间区别的地方。
  • 看起来这可能是一个解决方案,但我不知道为什么,我必须在未来的报告中对其进行更多测试。在 if(vedleggstype=='application/gzip') 我添加 attachment.setContentType('application/x-gzip'); var attachmentBlob = attachment.copyBlob();

标签: google-apps-script


【解决方案1】:

这似乎是一个错误。 Utilities.unzip 似乎只适用于 MIME 类型为 application/x-gzip 的文件,并且不支持现代的 application/gzip。已经有a bug report on their issue tracker。点击白星 (☆) 给予更高的优先级。

作为一种解决方法,您可以将内容类型设置为application/x-gzip

function ungzipAttahcment() {
  const message = GmailApp.getMessageById('...')
  const attachment = message.getAttachments()[0]
  attachment.setContentType('application/x-gzip')
  const blob = Utilities.ungzip(attachment)
}

【讨论】:

  • 谢谢,很有帮助!我点击了星号,希望其他人也可以这样做:-)
猜你喜欢
  • 1970-01-01
  • 2014-07-31
  • 1970-01-01
  • 1970-01-01
  • 2012-06-18
  • 1970-01-01
  • 2011-03-18
  • 2015-09-10
相关资源
最近更新 更多