如何修改Apps Script代码仅处理含Room Lights的邮件并写入表格
问题
现有一段基于Gmail标签处理邮件并写入谷歌表格的生产代码,需做如下修改:
- 仅处理标签"Lights"下包含**"Room Lights"**的邮件
- 提取"Room Lights"之后的内容写入表格
- 完全未提及"Room Lights"的邮件直接忽略
邮件示例
需要处理的邮件:
This is an email alarm.
Room Lights OFF.其他类似内容如"Room Lights ON"等也需处理
需要忽略的邮件:
This is an email alarm.
Network has returned.
现有代码
function lightFunction() { newMonth(); var label = GmailApp.getUserLabelByName("Lights"); var label2 = GmailApp.getUserLabelByName("Processed"); var threads = label.getThreads(); var data = new Array(); var newData = new Array(); var alarmKeys = "This is an email alarm."; var keys = alarmKeys.split(","); var range = "A2:B"; // get all the email threads matching label for (var i = 0; i < threads.length; i++) { var messages = GmailApp.getMessagesForThread(threads[i]); // archive thread // label2.addToThread(threads[i]); // label.removeFromThread(threads[i]); // get each individual email from the threads for (var j = 0; j < messages.length; j++) { var bodyText = messages[j].getPlainBody(); for (k in keys) { bodyText = bodyText.replace(keys[k], ""); } bodyText = bodyText.trim(); var date = messages[j].getDate(); // date/time var lines = [date, bodyText]; // Turn the first element in the array into a date element, format it, and put it back lines[0] = Utilities.formatDate(new Date(lines[0]), "America/Phoenix", "M/d/yy HH:mm:ss"); // Put the array to a new item in the data array for further processing if (curMonth == (new Date(lines[0]).getMonth())) { data.push(lines); } } } checkAdd(data, range); }
修改后的代码
function lightFunction() { newMonth(); var label = GmailApp.getUserLabelByName("Lights"); var label2 = GmailApp.getUserLabelByName("Processed"); var threads = label.getThreads(); var data = new Array(); var newData = new Array(); var alarmKeys = "This is an email alarm."; var keys = alarmKeys.split(","); var range = "A2:B"; // 定义要匹配的核心关键词 var targetKeyword = "Room Lights"; // 遍历所有邮件线程 for (var i = 0; i < threads.length; i++) { var messages = GmailApp.getMessagesForThread(threads[i]); // 遍历线程内的每一封邮件 for (var j = 0; j < messages.length; j++) { var bodyText = messages[j].getPlainBody(); // 不包含目标关键词则直接跳过当前邮件 if (!bodyText.includes(targetKeyword)) { continue; } // 移除指定的前缀文本 for (k in keys) { bodyText = bodyText.replace(keys[k], ""); } // 提取"Room Lights"之后的内容并清理格式 var lightStatus = bodyText.split(targetKeyword)[1].trim(); var date = messages[j].getDate(); var lines = [date, lightStatus]; // 格式化日期 lines[0] = Utilities.formatDate(new Date(lines[0]), "America/Phoenix", "M/d/yy HH:mm:ss"); // 仅处理当月数据并加入待写入数组 if (curMonth == (new Date(lines[0]).getMonth())) { data.push(lines); } // 标记邮件为已处理(需要启用则取消注释) // label2.addToThread(threads[i]); // label.removeFromThread(threads[i]); } } checkAdd(data, range); }
修改说明
- 新增关键词过滤逻辑:定义
targetKeyword变量存储核心关键词,通过bodyText.includes(targetKeyword)快速判断邮件是否符合处理条件,不符合则直接跳过,避免无效处理。 - 精准提取目标内容:使用
split(targetKeyword)[1]拆分邮件内容,直接获取"Room Lights"之后的部分,再用trim()清除多余空格和换行,确保写入表格的内容整洁。 - 优化已处理标记位置:将标记邮件为已处理的代码移到有效邮件处理完成后,避免误标记未符合条件的邮件(需启用则取消注释即可)。
- 保留原有核心逻辑:保留了原代码中移除指定前缀、日期格式化、当月数据筛选以及表格写入的逻辑,确保原有功能不受影响。
内容的提问来源于stack exchange,提问作者Benji007
相关产品推荐
相关产品推荐

