【问题标题】:apps script: Process emails that contain specific text **only**应用程序脚本:处理包含特定文本的电子邮件**仅**
【发布时间】:2022-10-05 04:15:11
【问题描述】:

我有一些我正在重新利用的生产代码。目前,它根据 gmail 标签处理所有内容,并将指定部分放入电子表格中。这不会改变(尽管如果那是最好的解决这个问题的方法)。

我现在需要处理一个子集这些消息的一部分,并将消息正文的一部分放入电子表格中。 正文如下:

This is an email alarm.
Room Lights OFF.

(其他示例可能会说“房间灯打开”、“警报”或“确定”。

我只需要得到身体的一部分“房间灯”。

此 gmail 标签中还包括根本不提及“房间灯”的电子邮件。这些应该被忽略而不是添加到电子表格中。 例子:

This is an email alarm.
Network has returned.

或者

This is an email alarm. 
Generator is OFF.

问题:如何编辑我的代码以便仅将“房间灯”电子邮件添加到电子表格中?

示例代码:

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);
}

    标签: google-apps-script gmail-api


    【解决方案1】:

    虽然我不确定我是否能正确理解您的显示脚本,但如果您的data 用于checkAdd(data, range); 并且data 被放入电子表格,并且您想通过Question: How can I edit my code so that only "Room Lights" emails are added to the spreadsheet? 过滤data,如何关于以下修改?

    从:

    var bodyText = messages[j].getPlainBody();
    

    至:

    var bodyText = messages[j].getPlainBody();
    if (!bodyText.includes("Room Lights")) continue;
    

    或者,如果你想检查多个文本,那么下面的修改呢?

    var bodyText = messages[j].getPlainBody();
    var searchTexts = ["Room Lights", "sample",,,]; // Please set search texts you want.
    if (!searchTexts.some(e => bodyText.includes(e))) continue;
    

    参考:

    【讨论】:

      【解决方案2】:

      替代方法

      您还可以在一行中使用match 方法使用regex 调整带有data.push(lines); 的部分,如下所示:

      lines[1].match(/Room Lights|OK|ALARM/gm) ? data.push(lines) : null;
      

      您也可以查看sample regex test

      在我的理解中,流程如下:

      1. 阅读以下电子邮件标签 灯/加工
      2. 检查每封可能与以下文本匹配的电子邮件:

        “房间灯关闭”、“房间灯打开”、“警报”或“正常”

        1. 只添加匹配的电子表格上的电子邮件

        调整脚本

        function lightFunction() {
          newMonth();
          var curMonth = new Date().getMonth()
          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())) {
                //Tweaked part
                lines[1].match(/Room Lights|OK|ALARM/gm) ? data.push(lines) : null;
                //Tweaked part
              }
            }
          }
          checkAdd(data, range);
        }
        

        示范

        示例电子邮件

        data 变量的日志测试

        参考

      【讨论】:

      • @Benji007 如果有任何遗漏或您有后续问题,请随时回复。
      • 我没有收到这方面的通知,很抱歉我的回复晚了。我现在正在尝试这个。感谢您对@irvin-jay-g 的彻底回复!
      • 别客气。没关系。如果这回答了您的问题,您可能需要单击左侧的接受按钮(复选图标)。通过这样做,社区中可能与您有同样担忧的其他人将知道他们的问题可以得到解决。这样,他们会很容易地在他们的搜索中被推荐到您的帖子中,而无需发布重复的问题。
      • 实际上,这似乎不起作用。它运行,然后什么也没有发生没有错误,但它不会在电子表格中添加任何行。
      • 我添加了 Logger.log(lines);在调整部分之后,日志什么也没有显示。
      猜你喜欢
      • 2016-05-28
      • 1970-01-01
      • 2011-06-11
      • 1970-01-01
      • 2011-04-27
      • 1970-01-01
      • 2011-02-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多