【问题标题】:Save Gmail attachments on Google Drive将 Gmail 附件保存到 Google 云端硬盘
【发布时间】:2019-04-01 16:39:28
【问题描述】:

我想将特定电子邮件中的 gmail 附件(.pdf 文件)保存到特定的 Google 云端硬盘文件夹中。我还需要使用由电子邮件的某些字符串组成的字符串重命名文件。

我使用带有一些功能的 Google Apps 脚本开发了一个简单的脚本。

这是我写的主要函数:

function GmailToDrive() {
    var query = '';
    query = 'in:inbox from:noreply@agyo.io has:nouserlabels ';
    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) {
            //get attachments
            var attachments = mesgs[j].getAttachments();
            var message_body = mesgs[j].getBody();
            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);
                file.setName(renameFile_(attachment, message_body))
                parentFolder.addFile(file);
                root.removeFile(file);
            }
        }
        threads[i].addLabel(label);
    }
}

checkIfDefinedType_(attachment) 函数检查附件是否为 .pdf 文件,renameFile_(attachment, message_body) 重命名附件并从电子邮件中提取一些字符串。

脚本似乎已正确开发,但有时我的 google 驱动器文件夹中保存了两个或多个相同的附件。

【问题讨论】:

  • 欢迎。 “但有时我的 google drive 文件夹中保存了两个或多个相同的附件。”我不明白这是什么意思;你能更详细地解释一下吗?此外,GmailToDrive 的代码是众所周知且可靠的,但我不记得见过额外的代码行 file.setName(renameFile_(attachment, message_body));请提供此功能的代码。
  • 该脚本根据查询参数扫描所有Gmail项目,并且必须将未标记邮件的附件保存到Google Drive。该脚本每 30 分钟运行一次,有时某些附件会多次保存在 Google Drive 文件夹中。
  • file.setName 是 Class File (developers.google.com/apps-script/reference/drive/file) 的 Google App Script 函数。该函数的参数是由函数renameFile_(attachment, message_body)获得的字符串,该函数从电子邮件文本中提取一些字符串并将它们连接成单个字符串
  • 有时某些附件会多次保存在 Google Drive 文件夹中”。那么问题是什么?代码应该查找重复项而不是两次处理它们?甚至可以删除重复项?
  • 该脚本仅在没有用户标签并保存附件的情况下处理所有 Gmail 邮件。我不明白为什么脚本会再次处理标记的邮件并再次保存附件。我们可以考虑“重复控制”处理后添加到mal的标签。可能是我把一些条件放错了地方……

标签: javascript google-apps-script


【解决方案1】:

Stefano,我遇到了同样的问题,如果这与改编自 https://bit.ly/-extractgmail 的代码相同

我删除了导致我重复的“for (var i in fileTypesToExtract) {”行。它正在为每种文件类型运行查询。

【讨论】:

    【解决方案2】:
    // `has:pdf` searches for messages with PDF attachments
    var query = 'has:pdf in:inbox from:noreply@agyo.io has:nouserlabels '; 
    
    var results = Gmail.Users.Messages.list(userId, {q: query});
    results.messages.forEach(function (m) {
        var msg = GmailApp.getMessageById(m.id);
        msg.getAttachments().forEach(function (a) {
            var fileName = a.getName();
            fileName = saveAttachmentToFolder(folder, a, fileName, msg.getDate(), input.tz);
        });
    });
    function saveAttachmentToFolder(folder, attachment, fileName, date, timezone) {
        if (timezone) {
            fileName = standardizeName(attachment, date, timezone);
        }
        Logger.log(fileName);
        folder.createFile(attachment.copyBlob()).setName(fileName);
    }
    

    上面的代码 sn-p 基于我创建的 Gmail 插件,专门用于将附件保存到 Drive 中的标记文件夹:https://github.com/ellaqezi/archiveByLabel/blob/main/Code.gs#L24

    label 字段中,您可以定义要在 Drive 中创建的嵌套目录,例如富/酒吧。

    query 字段中,您可以复制参数,就像在 Gmail 的搜索栏中使用它们一样。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多