谷歌应用脚​​本Gmail在没有以前对话的情况下获取消息 [英] Google apps script Gmail get message without previous conversation

查看:11
本文介绍了谷歌应用脚​​本Gmail在没有以前对话的情况下获取消息的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用 google 应用程序脚本将我在特定标签下的电子邮件转储到 Google Docs 电子表格.我想将线程中的每个电子邮件正文列为单独的行,这样如果线程有 9 条消息链,则每条消息都单独列出(没有链).

I am trying to use a google apps script to dump emails that I have under a specific label to a Google Docs Spreadsheet. I want to list each email message body in a thread as a separate row, such that if a thread has a chain of 9 messages, each one is listed separately (without the chain) in a row.

我已经设法将它保存到每个消息正文 + 其整个前一个线程的存储位置,在一个单元格中,我可以在一个单元格中获取整个线程.但这不是我想要的.

I have managed get it to where each message body + its entire previous thread is stored, in one cell and I can get the entire thread in a cell. But this is not what I want.

这段代码会将整个线程体排成一行.

This code will put the entire body of the thread in a row.

function getEmails() {
  clearCanvas();
  var label = GmailApp.getUserLabelByName(LabelWithEmails);
  var threads = label.getThreads();

  // var threads = GmailApp.getInboxThreads(0, 50);
  var row = getFirstRow() + 1;
  var firstmessageId = getfirstmsgid();
  UserProperties.setProperty("firstmsgid", firstmessageId);
  spreadsheet.toast("Loading emails..Please wait. It could take few seconds", "Status", -1);

  var messages = GmailApp.getMessagesForThreads(threads); //gets messages in 2D array
  for (i = 0; i < 5; ++i)
  {
   try {
       j = messages[i].length; //to process most recent conversation in thread (contains messages from previous conversations as well, reduces redundancy
       messageBody = messages[i][j-1].getBody(); //gets body of message in HTML
       messageSubject = messages[i][j-1].getSubject();
       messageDate = messages[i][j-1].getDate();
       messageFrom = messages[i][j-1].getFrom();

       Logger.log("Message Subject:" + messageSubject);
       Logger.log("Message Date:" + messageDate);
       Logger.log("Message From:" + messageFrom);

       sheet.getRange(row, 1).setValue(messageFrom);
       sheet.getRange(row, 2).setValue(messageSubject);
       sheet.getRange(row, 3).setValue(messageDate);
       sheet.getRange(row, 4).setValue(getTextFromHtml(messageBody));
       row++;
    } catch (error) {
        spreadsheet.toast("Error Occured. Report it @ http://techawakening.org/", "Status", -1);
    }

    if (i == threads.length - 1) {
        spreadsheet.toast("Successfully loaded emails.", "Status", -1);
        spreadsheet.toast("Now mark emails to be forwarded by changing the background color of the cells to green. Then select Forward->Forward selected emails", "Status", -1);
    }

  }
}

这会将每个消息正文(包括它的前一个线程/消息链)排成一行.

This will put each message body including it's previous thread/message chain in a row.

function getEmails() {
clearCanvas();
var label = GmailApp.getUserLabelByName(LabelWithEmails);
var threads = label.getThreads();

// var threads = GmailApp.getInboxThreads(0, 50);
var row = getFirstRow() + 1;
var firstmessageId = getfirstmsgid();
UserProperties.setProperty("firstmsgid", firstmessageId);
spreadsheet.toast("Loading emails..Please wait. It could take few seconds", "Status", -1);

var messages = GmailApp.getMessagesForThreads(threads); //gets messages in 2D array
// messages.length
// jknipp - working except it keeps the thread chain
for (var i = 0; i < threads.length; i++) {
    try {
        var messages = threads[i].getMessages();
        for (var m = 0; m < messages.length; m++) {
            sheet.getRange(row, 1).setValue(messages[m].getFrom());
            sheet.getRange(row, 2).setValue(messages[m].getSubject());
            sheet.getRange(row, 3).setValue(messages[m].getDate());
            sheet.getRange(row, 4).setValue(getTextFromHtml(messages[m].getBody()));

            row++;
        }
    } catch (error) {
        spreadsheet.toast("Error Occured. Report it @ http://techawakening.org/", "Status", -1);
    }

    if (i == threads.length - 1) {
        spreadsheet.toast("Successfully loaded emails.", "Status", -1);
        spreadsheet.toast("Now mark emails to be forwarded by changing the background color of the cells to green. Then select Forward->Forward selected emails", "Status", -1);
    }
  }
}

参考资料https://stackoverflow.com/a/11034461/39803

推荐答案

通过确定上一次对话"的开始位置,我只能提取电子邮件的正文.

I was able to pull out only the body of the emails by identifying where the 'previous conversation' started.

var sheet = SpreadsheetApp.getActiveSheet();
var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
var LabelWithEmails = sheet.getRange(3, 2).getValue();

function getEmails() {
    clearCanvas();
    var label = GmailApp.getUserLabelByName(LabelWithEmails);
    var threads = label.getThreads();

    var row = getFirstRow() + 1;
    var firstmessageId = getfirstmsgid();
    UserProperties.setProperty("firstmsgid", firstmessageId);
    spreadsheet.toast("Loading emails..Please wait. It could take few seconds", "Status", -1);

    var messages = GmailApp.getMessagesForThreads(threads); //gets messages in 2D array

    for (var i = 0; i < 2;/*threads.length;*/ i++) {
        try {
            var messages = threads[i].getMessages();

            for (var m = 0; m < messages.length; m++) {
                var msg = messages[m];
                var isForward = msg.getBody().search(/---------- Forwarded message/i) != -1;

                if(!isValidMessage) continue;

                sheet.getRange(row, 1).setValue(msg.getFrom());
                sheet.getRange(row, 2).setValue(msg.getTo() + ";" + msg.getCc() + ";" + msg.getBcc());
                sheet.getRange(row, 3).setValue(msg.getSubject());
                sheet.getRange(row, 4).setValue(msg.getDate());

                if(!isForward) {
                    // Get only this messages body, ignore the previous chain
                    var body = msg.getBody();
                    var firstIndexOfThread = body.search(/gmail_quote/i); 
                    body = (firstIndexOfThread == -1) ? body : body.substring(0, firstIndexOfThread);

                        sheet.getRange(row, 5).setValue(getTextFromHtml(body));

                } else {
                    // Use the whole body if its a forward
                    sheet.getRange(row, 5).setValue(getTextFromHtml(msg.getBody()));
                    sheet.getRange(row, 6).setValue("***");
                }

            row++;
        }
    } catch (error) {
            Logger.log(error);
        spreadsheet.toast("Error Occured - please see the logs.", "Status", -1);
    }

    if (i == threads.length - 1) {
        spreadsheet.toast("Successfully loaded emails.", "Status", -1);
    }
  }
}

这篇关于谷歌应用脚​​本Gmail在没有以前对话的情况下获取消息的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆