如何为Gmail转PDF脚本添加当日邮件筛选功能
优化Gmail转PDF脚本:只处理当日邮件
我写了个每小时自动运行的脚本,功能是搜索主题为“xxxx”的邮件,提取内容转成PDF存入指定文件夹,同名文件直接覆盖。现在想加个筛选逻辑,只处理当天的邮件,提升脚本运行效率。
原脚本代码:
function saveGmailAsPDF2() { var gmailLabels = 'xxxxx'; var driveFolder = DriveApp.getFolderById("folder url"); var threads = GmailApp.search("subject:" + gmailLabels,0,20); if (threads.length > 0) { /* Google Drive folder where the Files would be saved */ var folders = DriveApp.getFoldersByName(driveFolder); var folder = folders.hasNext() ? folders.next() : DriveApp.createFolder(driveFolder); /* Gmail Label that contains the queue */ var label = GmailApp.getUserLabelByName(gmailLabels) ? GmailApp.getUserLabelByName(gmailLabels) : GmailApp.createLabel(driveFolder); for (var t=0; t<threads.length; t++) { threads[t].removeLabel(label); var msgs = threads[t].getMessages(); var html = ""; var subject = threads[t].getFirstMessageSubject(); var previousdoc = driveFolder.getFilesByName(subject + ".pdf"); //gets name of csv, if exists in drive then move to trash before creating new file if (previousdoc.hasNext()) { previousdoc.next().setTrashed(true);} /* Append all the threads in a message in an HTML document */ for (var m=0; m<msgs.length; m++) { var msg = msgs[m]; html += "From: " + msg.getFrom() + "<br />"; html += "To: " + msg.getTo() + "<br />"; html += "Date: " + msg.getDate() + "<br />"; html += "Subject: " + msg.getSubject() + "<br />"; html += "<hr />"; html += msg.getBody().replace(/<img[^>]*>/g,""); html += "<hr />";} /* Convert the Email Thread into a PDF File */ var tempFile = DriveApp.createFile("temp.html", html, "text/html"); folder.createFile(tempFile.getAs("application/pdf")).setName(subject + ".pdf"); tempFile.setTrashed(true);}}}
修改后的脚本
function saveGmailAsPDF2() { var gmailLabels = 'xxxxx'; var driveFolder = DriveApp.getFolderById("folder url"); // 生成当日0点的日期,用来筛选当天的邮件 var today = new Date(); var startOfDay = new Date(today.getFullYear(), today.getMonth(), today.getDate()); // 转成Gmail搜索支持的日期格式:yyyy/mm/dd var startDate = Utilities.formatDate(startOfDay, Session.getScriptTimeZone(), "yyyy/MM/dd"); // 搜索时直接加上当日筛选条件,只捞当天的目标邮件 var searchQuery = "subject:" + gmailLabels + " after:" + startDate; var threads = GmailApp.search(searchQuery, 0, 20); if (threads.length > 0) { // 直接用已经通过ID获取的文件夹,不用再查一遍 var folder = driveFolder; // 获取或创建目标标签 var label = GmailApp.getUserLabelByName(gmailLabels) || GmailApp.createLabel(gmailLabels); for (var t = 0; t < threads.length; t++) { threads[t].removeLabel(label); var msgs = threads[t].getMessages(); var html = ""; var subject = threads[t].getFirstMessageSubject(); // 删除已存在的同名PDF var previousdoc = driveFolder.getFilesByName(subject + ".pdf"); if (previousdoc.hasNext()) { previousdoc.next().setTrashed(true); } // 把邮件内容拼进HTML里 for (var m = 0; m < msgs.length; m++) { var msg = msgs[m]; html += "From: " + msg.getFrom() + "<br />"; html += "To: " + msg.getTo() + "<br />"; html += "Date: " + msg.getDate() + "<br />"; html += "Subject: " + msg.getSubject() + "<br />"; html += "<hr />"; html += msg.getBody().replace(/<img[^>]*>/g, ""); html += "<hr />"; } // 转成PDF并存档 var tempFile = DriveApp.createFile("temp.html", html, "text/html"); folder.createFile(tempFile.getAs("application/pdf")).setName(subject + ".pdf"); tempFile.setTrashed(true); } } }
关键修改说明
- 提前过滤非当日邮件:在Gmail搜索时就用
after:yyyy/mm/dd限定只查当天0点之后的邮件,从源头减少需要处理的线程数,比拿到所有线程再筛选高效得多。 - 修复文件夹逻辑错误:原代码里
driveFolder已经是通过ID获取的文件夹对象,没必要再用getFoldersByName查找,直接用即可。 - 简化代码写法:用
||替换了冗余的三元运算符,代码更清爽。
内容的提问来源于stack exchange,提问作者Alexasks
相关产品推荐
相关产品推荐

