6 个可增强您 Gmail 体验的 Google Apps 脚本项目

再次,我在这里深入探讨Gmail的效率提升和自动化。这一次,我们将深入技术层面,利用Google Apps脚本来优化您的Gmail使用体验。

Gmail拥有许多内置设置,您可以调整这些设置来实现任务的自动化和效率的提高。然而,这些设置也存在局限性,许多功能缺乏充分的自定义选项。这时,您可以借助Google Apps脚本来自行解决问题。

通过使用Google Apps脚本,您可以创建自定义脚本来执行Gmail本身无法完成的任务。不仅如此,您还可以设置基于时间的触发器来自动执行这些脚本。

为了帮助您入门,我整理了一些实用的脚本,它们肯定能提升您的Gmail体验。我确保每个脚本都能自动解决常见问题,例如重复性任务或自动创建新的文件夹。因此,有些脚本的长度可能会超出其预期用途。

在Google Apps脚本中创建脚本

在开始使用和自定义这些脚本之前,您需要了解如何在Google Apps脚本中创建并运行脚本。方法如下:

打开Google Apps脚本,然后点击左侧面板的“新建项目”按钮。

在这里,您需要删除所有预先存在的代码,并将我提供的脚本复制/粘贴进去。然后,点击“保存”按钮来保存脚本。

要运行脚本,请点击“保存”旁边的“运行”按钮。系统会提示您授予权限,并可能出现脚本未经认证的警告。您可以忽略该警告并授予权限,因为该脚本仅供个人使用,且Google尚未对其进行审核。

就这样,脚本将开始运行,并且会在执行日志中显示是否成功执行。

设置触发器

许多脚本在自动触发时效果最佳。值得庆幸的是,Google Apps脚本提供了一个专门用于为每个脚本创建基于时间的触发器的功能,从而实现自动执行。

但是,在向您介绍如何创建触发器之前,您需要了解 Google Apps脚本的配额限制,这取决于您是否订阅了 Google Workspace计划。如果您运行过多的脚本并且过于频繁,您可能会达到每日配额,从而导致服务暂时停止。

即使您可以选择每分钟执行脚本,这也将消耗您的每日配额。请确保您只设置一个可以可靠地完成工作的定时器。

要创建触发器,请在脚本打开时点击左侧面板的“触发器”,然后点击“添加触发器”按钮。

在这里,您可以选择以分钟为单位的定时器,以及最长可达数月的时间间隔。您还可以选择特定的日期和时间,以便该脚本仅在该时间运行一次。选择完毕后,点击“保存”以创建触发器。

如果您没有像我之前所说的那样授予运行脚本的权限,系统会在创建触发器之前要求您授予权限。

触发器将根据您的选择持续运行。如果出现任何问题,系统会通知您并告知发生的错误。

现在,让我们深入了解一些实际例子,看看如何使用Google Apps脚本来自动化Gmail任务。

发送定期电子邮件

function sendRecurringEmail() {
  var recipient = "[email protected]";
  var subject = "您的主题在此";
  var message = "您的自定义消息在此";

  GmailApp.sendEmail(recipient, subject, message);
}

Gmail允许您安排电子邮件,但无法安排重复发送的邮件。无论您是想提醒某人某事,还是想确保您的电子邮件不被遗忘,这个简单的脚本都会向指定的地址发送一封包含您提供的主题和消息的电子邮件。然后,您可以从“触发器”选项中设置重复触发器。

在脚本中,请使用实际的详细信息编辑收件人、主题和消息部分。请确保示例文本周围的引号保留。例如,主题应该如下所示:

var subject = "重要提醒";

由于触发器的最大限制是一个月,因此您必须每月发送一次重复消息。不幸的是,这意味着您无法使用它来为每年发生的场合发送祝福。

过滤带有链接的电子邮件

function processUnreadEmailsWithLinks() {
  var labelName="带有链接的邮件";
  var label = GmailApp.getUserLabelByName(labelName);
  if (!label) {
    label = GmailApp.createLabel(labelName);
  }
  var threads = GmailApp.search('is:unread');
  for (var i = 0; i < threads.length; i++) {
    var messages = threads[i].getMessages();
    for (var j = 0; j < messages.length; j++) {
      var message = messages[j];
      var body = message.getBody();
      if (bodyContainsLinks(body)) {
        label.addToThread(threads[i]);
      }
    }
  }
}

function bodyContainsLinks(body) {
  var regex = /https?:\/\/[^\s<>"']+/g;
  return regex.test(body);
}

正文包含链接的电子邮件通常比较重要。无论您是收到同事的报告,还是订阅了发送特定资源的新闻简报,使用链接对电子邮件进行分类都非常有用。

此脚本会扫描您Gmail账户中所有未读的电子邮件,并将电子邮件正文中包含链接的邮件分离到一个名为“带有链接的邮件”的新标签中。默认情况下,它会在Gmail中的所有位置搜索邮件,但您可以通过编辑`var threads = GmailApp.search(‘is:unread’);`这一行来缩小搜索范围。以下是一些修改方式:

仅在收件箱中搜索: `var threads = GmailApp.search(‘in:inbox is:unread’);`

在其他标签中搜索: `var threads = GmailApp.search(‘in:inbox is:unread OR in:promotions is:unread OR in:important is:unread’);`

搜索收件箱中所有已读/未读邮件: `var threads = GmailApp.search(‘in:inbox’);`

搜索来自特定发件人的邮件: `var threads = GmailApp.search(‘from:[email protected]‘);`

这些例子应该能让您了解如何修改脚本来缩小带有链接的邮件的范围。此外,我相信设置一个每日触发器对于这类邮件来说已经足够。

自动删除旧邮件

function deleteOldEmails() {
  var threads = GmailApp.search('older_than:30d');
  for (var i = 0; i < threads.length; i++) {
    threads[i].moveToTrash();
  }
}

如果您不想保留旧邮件,可以使用此脚本来删除早于特定时间段的邮件。这里的脚本会查找Gmail中所有超过30天的邮件,并将它们发送到“已删除邮件”中。您可以编辑`’older_than:30d’`部分来指定要删除多长时间的邮件,例如`’older_than:180d’`。

如果您想从特定标签中删除邮件,可以修改`Gmail.App.search`部分以包含该标签。像这样:

`var threads = GmailApp.search(‘in:inbox old_than:30d’);`

为了使此过程自动化,请创建一个每隔几天自动运行该脚本的触发器。根据您要删除的邮件的旧程度,我相信每周一次甚至每月一次就足够了。

将所有邮件地址保存到Google表格

function getEmailAddresses() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheetName = "邮件地址";
  var sheet = ss.getSheetByName(sheetName);
  
  if (!sheet) {
    sheet = ss.insertSheet(sheetName);
    sheet.appendRow(["邮件地址"]);
  }
  
  var threads = GmailApp.getInboxThreads();
  var emailAddresses = [];
  
  var existingData = sheet.getDataRange().getValues();
  if (existingData.length > 1) {
    var existingEmailAddresses = existingData.slice(1).flat();
  } else {
    var existingEmailAddresses = [];
  }
  
  for (var i = 0; i < threads.length; i++) {
    var messages = threads[i].getMessages();
    for (var j = 0; j < messages.length; j++) {
      var emailAddress = messages[j].getFrom();
      if (emailAddresses.indexOf(emailAddress) === -1 && existingEmailAddresses.indexOf(emailAddress) === -1) {
        emailAddresses.push(emailAddress);
      }
    }
  }
  
  for (var k = 0; k < emailAddresses.length; k++) {
    sheet.appendRow([emailAddresses[k]]);
  }
}

该脚本会在Gmail中搜索所有邮件,并将发件人/收件人的姓名和邮件地址复制并保存到Google表格中。它有很多用途,例如创建用于电子邮件营销的邮件列表,或者创建与您联系的每个人的记录。

但是,创建此脚本与其他脚本略有不同,因为您需要从Google表格内部打开Google Apps脚本,以便它可以识别该工作表。不过,这只需要第一次完成。步骤如下:

打开一个新的Google表格链接。点击顶部菜单中的“扩展”,然后选择“Apps脚本”。这将打开Google Apps脚本,您可以在其中添加脚本并运行它,就像我之前演示的那样。

该脚本将创建一个名为“邮件地址”的新工作表,并将姓名和邮件地址写入同一个单元格。您将来不必为每个触发器再次打开工作表。任何新的邮件地址都会在最后的工作表中更新,不会出现重复。

根据您收到新发件人邮件的频率,每日或每周触发器应该足够了。

自动将邮件附件保存到Google云端硬盘

function onNewEmail(e) {
  var threads = GmailApp.getInboxThreads(0, 1);
  var messages = threads[0].getMessages();
  
  var folderName = "邮件附件";
  var folderIterator = DriveApp.getFoldersByName(folderName);
  var folder;

  if (folderIterator.hasNext()) {
    folder = folderIterator.next();
  } else {
    folder = DriveApp.createFolder(folderName);
  }
  
  for (var i = 0; i < messages.length; i++) {
    var message = messages[i];
    
    if (message.getAttachments().length > 0) {
      var attachments = message.getAttachments();
      
      for (var j = 0; j < attachments.length; j++) {
        var attachment = attachments[j];
        var attachmentHash = Utilities.base64Encode(Utilities.computeDigest(Utilities.DigestAlgorithm.MD5, attachment.getBytes()));
        var existingFiles = folder.getFiles();

        var isDuplicate = false;

        while (existingFiles.hasNext()) {
          var existingFile = existingFiles.next();
          var existingFileHash = Utilities.base64Encode(Utilities.computeDigest(Utilities.DigestAlgorithm.MD5, existingFile.getBlob().getBytes()));

          if (attachmentHash === existingFileHash) {
            isDuplicate = true;
            break;
          }
        }

        if (!isDuplicate) {
          folder.createFile(attachment);
        }
      }
    }
  }
}

如果您经常通过邮件收到重要的附件,这是一个非常方便的脚本。它不仅可以保留附件,还可以将它们分组到一个更好的界面中进行管理。

该脚本的编写方式使得它仅适用于您在首次运行后收到的新邮件。如果该文件夹不存在,它会自动在您的Google云端硬盘中创建一个名为“邮件附件”的新文件夹。我没有使用名称来检查重复文件,因为不同文件的名称可能会相同。该脚本会检查基于文件内容的唯一MD5哈希值。

我知道并非每个人都只想保存新的附件,您可能还需要保存已收到邮件中的附件。为此,下面是一个修改后的脚本,它遵循相同的规则,但是会保存当前邮件中的附件。不过,保存所有附件可能需要相当长的时间,具体取决于您的附件数量。

function saveAllAttachmentsToDrive() {
  var folderName = "邮件附件";
  var folderIterator = DriveApp.getFoldersByName(folderName);
  var folder;
  
  if (folderIterator.hasNext()) {
    folder = folderIterator.next();
  } else {
    folder = DriveApp.createFolder(folderName);
  }

  var threads = GmailApp.getInboxThreads();

  for (var i = 0; i < threads.length; i++) {
    var messages = threads[i].getMessages();
    
    for (var j = 0; j < messages.length; j++) {
      var message = messages[j];
      var attachments = message.getAttachments();
      
      for (var k = 0; k < attachments.length; k++) {
        var attachment = attachments[k];
        var attachmentHash = Utilities.base64Encode(Utilities.computeDigest(Utilities.DigestAlgorithm.MD5, attachment.getBytes()));
        var existingFiles = folder.getFiles();
        var isDuplicate = false;

        while (existingFiles.hasNext()) {
          var existingFile = existingFiles.next();
          var existingFileHash = Utilities.base64Encode(Utilities.computeDigest(Utilities.DigestAlgorithm.MD5, existingFile.getBlob().getBytes()));

          if (attachmentHash === existingFileHash) {
            isDuplicate = true;
            break;
          }
        }

        if (!isDuplicate) {
          folder.createFile(attachment);
        }
      }
    }
  }
}

获取每日励志名言

function sendDailyQuoteEmail() {
  var apiKey = '您的_API_密钥';
  var endpoint="https://quotes.rest/qod";

  var response = UrlFetchApp.fetch(endpoint, {
    headers: {
      'X-TheySaidSo-Api-Secret': apiKey
    }
  });

  var data = JSON.parse(response.getContentText());
  var quoteContents = data.contents.quotes[0];
  var quote = quoteContents.quote;
  var author = quoteContents.author;

  var recipient="[email protected]";
  var subject="每日名言";
  var message = `这是您的每日名言:\n\n"${quote}"\n\n- ${author}`;

  GmailApp.sendEmail(recipient, subject, message);
}

它可能不会直接用于您的工作或邮件管理,但它非常适合让您每天在收件箱中接收积极的鼓励。正确设置后,此脚本将使用They Said So API通过邮件向您发送他们的每日励志名言。设置方法如下:

首先,您需要来自They Said So的个人API密钥。在 They Said So API 页面,您可以注册一个免费帐户来获取密钥。它免费提供5次通话,这对于每日名言来说绰绰有余。

获取密钥后,将`YOUR_API_KEY`部分替换为您从They Said So获得的实际密钥。您还需要替换[email protected]为您或其他人的实际邮件地址,如果您想为其他人设置邮件地址。

现在您需要做的就是设置一个每天运行的触发器,因为早于该触发器运行只会重新发送当天的名言。

最后的话

我个人在同时运行所有这些脚本时没有任何问题,并且没有达到每日配额。我相信您也不会有问题,只要您不使用过于激进的触发器。您还应该检查这些脚本,以确保没有任何脚本出现错误。