【问题标题】:Record incoming Gmail messages in Google sheets在 Google 表格中记录收到的 Gmail 邮件
【发布时间】:2020-09-15 18:14:46
【问题描述】:

大家好。 我刚开始学习GS。 我不明白为什么数据没有写入谷歌表格。 一切都正确记录。 我通过一个容器运行脚本,授予访问权限。 而且我需要这个脚本只接收未读消息并将它们标记为已读。

如果您能更正我的脚本,我将非常高兴。

    function Gmail() {
 
    //this is just the stuff that recognizes what spreadsheet you're in
    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var sheets = ss.getSheets();
    var sheet = ss.getSheetByName('sheet2'); //gets the right sheet

    /* searches your GMail for emails matching things "label:unread" + " label:support"
    (support is the name of the folder into which letters are collected) */
    var query = "label:unread" + " label:support"; 

    var threads = GmailApp.search(query);

    var supportStats = [];
    for (var i = 0; i < threads.length; i++) {
        var messages = threads[i].getMessages();

        for (var m = 0; m < messages.length; m++) {
            var from = messages[m].getFrom(); //from field
            var to = messages[m].getTo(); //to field
            var time = messages[m].getDate(); //date field
            var subject = messages[m].getSubject(); //subject field
            var body = messages[m].getPlainBody(); //body field
            var mId = messages[m].getId(); //id field to create the link later
   
            if (query === "label:unread" + " label:support") {
               supportStats.push([from,to,time,subject,body,'https://mail.google.com/mail/u/0/#inbox/'+mId])
            }
            messages[m].markRead(); // marks as read
        }
    }
 if(!threads.length) return; //  if there are no unread ones, do nothing
 sheet.getRange(SpreadsheetApp.getActiveSheet().getLastRow()+1,2,supportStats.
 length,supportStats[0].length).setValues(supportStats); //writes to the spreadsheet
}

【问题讨论】:

    标签: google-apps-script google-sheets gmail


    【解决方案1】:

    解释:

    • 主要问题之一是您的代码获取的 html 正文 包含大量文本,因为它返回消息的 html 正文。
    • 但是,如果您仍想获得身体,我建议您改为获得普通身体。要实现这一点,您可以使用getPlainBody(),它会为您提供此邮件正文的内容,无需 HTML 格式。
    • 您还可以在 for 循环中调用 appendRow(),这是一种计算量非常大的方法。相反,我建议您使用setValues()

    解决办法:

    function myFunction() {
    
    //this is just the stuff that recognizes what spreadsheet you're in
       var ss = SpreadsheetApp.getActiveSpreadsheet();
       var sheets = ss.getSheets();
       var sheet = ss.getSheetByName("data"); //gets the right sheet
    
    //this chunk gets the date info  
     var today = new Date();
     var dd = today.getDate()-1;
     var mm = today.getMonth()+1; //January is 0 DO NOT FORGET THIS
     var yyyy = today.getFullYear();
     var yesterday = yyyy + '/' + mm + '/' + dd;
    
    //****************************************************  
    /*searches your GMail for emails matching two things, written after yesterday and with the label support*/
      var query = "label:unread after:" + yesterday + " label:support";
    
      var threads = GmailApp.search(query);
    
      var supportStats = [];
      for (var i = 0; i < threads.length; i++) {
        var messages = threads[i].getMessages();
    
        for (var m = 0; m < messages.length; m++) {
    
          messages[m].markRead();
          var from = messages[m].getFrom(); //from field
          var to = messages[m].getTo();//to field
          var time = messages[m].getDate();//date field
          var subject = messages[m].getSubject();//subject field
          var body = messages[m].getPlainBody();//body field
          var mId = messages[m].getId();//id field to create the link later
          var mYear = time.getFullYear();
          var mMonth = time.getMonth()+1;
          var mDay = time.getDate();
          var messageDate = mYear + '/' + mMonth + '/' + mDay;
    
          if (messageDate === yesterday) {
          
          supportStats.push([from,to,time,subject,body,'https://mail.google.com/mail/u/0/#inbox/'+mId])
          
          }
          
        }
    
      }
      SpreadsheetApp.getActiveSheet().getRange(SpreadsheetApp.getActiveSheet().getLastRow()+1,1,supportStats.length,supportStats[0].length).setValues(supportStats); //writes to the spreadsheet
    
    }
    

    【讨论】:

    • 感谢您的帮助。运行你的脚本,这里出错。 TypeError:无法在 myFunction 读取 null 的属性“getRange”(代码:47:9)
    • @АртурПетров 我更新了我的答案。请再试一次并告诉我。
    • 唯一剩下的就是过滤掉未读并将标记为已读。告诉我该怎么做?
    • @АртурПетров 我编辑了我的答案。现在它会考虑未读电子邮件:label:unread,然后如果messageDate === yesterday,它会读取它们。这是你想要的吗?
    • @АртурПетров 如果您不想只考虑未读电子邮件,请从代码中删除 label:unread
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-06
    • 2016-08-22
    • 1970-01-01
    • 1970-01-01
    • 2021-07-04
    相关资源
    最近更新 更多