在 GAS/Javascript 中保存带有特定主题行的 Gmail 附件

Posted

技术标签:

【中文标题】在 GAS/Javascript 中保存带有特定主题行的 Gmail 附件【英文标题】:Save Gmail attachments with specific subject line in GAS/Javascript 【发布时间】:2021-09-19 13:32:27 【问题描述】:

我需要帮助来保存我的 Gmail 收件箱中带有特定主题行“发票”的 pdf 附件。

我在网上搜索了代码并得出以下结论,但在修改它时遇到了挑战。理想情况下,该代码应该能够解析从任何发件人下载附件到 Gdrive 的特定文件夹中寻找“发票”一词的电子邮件主题。

我将不胜感激在修改代码方面的任何帮助。

function GmailToDrive()
  var query = '';
  //filename:jpg OR filename:tif OR filename:gif OR fileName:png OR filename:bmp OR filename:svg'; //'after:'+formattedDate+
  for(var i in fileTypesToExtract)
    query += (query === '' ?('filename:'+fileTypesToExtract[i]) : (' OR filename:'+fileTypesToExtract[i]));
  

  //ADD the only email adress you want to check + EDIT : only last 24h emails
  query = 'in:inbox has:nouserlabels ' + query + ' AND from:sender@sender AND newer_than:1d';

  var threads = GmailApp.search(query);
  var label = getGmailLabel_(labelName);
  var parentFolder;
  if(threads.length > 0)
    parentFolder = getFolder_(folderName);
  
  var root = DriveApp.getRootFolder();
  for(var i in threads)
    var mesgs = threads[i].getMessages();
    for(var j in mesgs)

      //ADD: check if the mail is unread:
      if (mesgs[j].isUnread()) 

        var attachments = mesgs[j].getAttachments();
        for(var k in attachments)
          var attachment = attachments[k];
          var isDefinedType = checkIfDefinedType_(attachment);
          if(!isDefinedType) continue;
            var attachmentBlob = attachment.copyBlob();
            var file = DriveApp.createFile(attachmentBlob);
            parentFolder.addFile(file);
            root.removeFile(file);
          
        

       // close if unread
     // close for msg loop

    //ADD: Set thread (all mail included) as read
    GmailApp.markThreadRead(threads[i]);

    threads[i].addLabel(label);
  

【问题讨论】:

【参考方案1】:

您可以使用search() 来查找通过给定查询检索到的电子邮件。此查询与使用 Gmail 界面完成的查询格式相同,因此您可以使用 Gmail 搜索栏上的搜索选项来创建适当的查询。例如,in:inbox subject:Invoice has:attachment label:unread 从收件箱返回未读电子邮件,其中包含附件和主题中包含单词 Invoice

之后,您将浏览搜索和messages in each thread 返回的电子邮件线程。然后,你 get the attachments 和 create a file in the destination folder 为他们每个人。 (可选)最后,您可以mark the message as read,这样如果您多次运行脚本,它就不会再次被处理。

function saveAttachmentsTest() 
  const destinationFolderId = 'ABC123';
  const folder = DriveApp.getFolderById(destinationFolderId);
  const emails = GmailApp.search('in:inbox subject:Invoice has:attachment label:unread');
  for (const email of emails) 
    for (const message of email.getMessages()) 
      for (const attachment of message.getAttachments()) 
        folder.createFile(attachment);
      
      message.markRead();
    
  

【讨论】:

以上是关于在 GAS/Javascript 中保存带有特定主题行的 Gmail 附件的主要内容,如果未能解决你的问题,请参考以下文章

保存带有特定主题的传入电子邮件的附件

Outlook - 从带有 .xls 附件的电子邮件和特定发件人中保存文件,然后将电子邮件移动到子文件夹

带有主 UINavigationController 和详细 UINavigationController 的 UISplitViewcontroller

从另一个表中选择带有主键的数据?

如何将 R 子文件保存到特定文件夹中?

OffsetDateTime 到 ZonedDateTime - 带有特定的 ZoneId