You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改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);
}

修改说明

  1. 新增关键词过滤逻辑:定义targetKeyword变量存储核心关键词,通过bodyText.includes(targetKeyword)快速判断邮件是否符合处理条件,不符合则直接跳过,避免无效处理。
  2. 精准提取目标内容:使用split(targetKeyword)[1]拆分邮件内容,直接获取"Room Lights"之后的部分,再用trim()清除多余空格和换行,确保写入表格的内容整洁。
  3. 优化已处理标记位置:将标记邮件为已处理的代码移到有效邮件处理完成后,避免误标记未符合条件的邮件(需启用则取消注释即可)。
  4. 保留原有核心逻辑:保留了原代码中移除指定前缀、日期格式化、当月数据筛选以及表格写入的逻辑,确保原有功能不受影响。

内容的提问来源于stack exchange,提问作者Benji007

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 09:05:27