Google应用程序脚本Gmail在没有先前对话的情况下收到消息 [英] Google apps script Gmail get message without previous conversation

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

问题描述

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



我已经在一个单元格中将它存储到每个消息体+它的整个前一个线程的存储位置,并且我可以获取单元中的整个线程。但这不是我想要的。



这段代码将整个线程的主体放在一行中。

  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(正在载入电子邮件......请等待,可能需要几秒钟,状态,-1);

var messages = GmailApp.getMessagesForThreads(threads); //获取二维数组中的消息
for(i = 0; i <5; ++ i)
{
try {
j = messages [i] .length; //处理线程中最近的会话(包含以前会话的消息,并减少冗余)
messageBody = messages [i] [j-1] .getBody(); //获取HTML $ b中的消息体$ b 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 ++;
$ b spreadsheet.toast(Error Occured。Report it @ http://techawakening.org/,Status,-1);
}

if(i == thread s.length - 1){
spreadsheet.toast(成功加载电子邮件,状态,-1); (现在通过将单元格的背景颜色更改为绿色来标记要转发的电子邮件,然后选择转发 - >转发选定的电子邮件,状态,-1);
}

}
}

  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(正在载入电子邮件......请等待,可能需要几秒钟,状态,-1);

var messages = GmailApp.getMessagesForThreads(threads); //获取二维数组中的消息
//消息。长度
// jknipp - 除了保持线程链之外的工作
for(var i = 0; i< threads.length; i ++ ){
尝试{
var messages = threads [i] .getMessages(); (var m = 0; 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(成功加载电子邮件。,状态,-1); (现在通过将单元格的背景颜色更改为绿色来标记要转发的电子邮件,然后选择转发 - >转发选定的电子邮件,状态,-1);


$ b b

$ b

参考文献
< a href =https://stackoverflow.com/a/11034461/39803> https://stackoverflow.com/a/11034461/39803

解决方案

我能够通过确定'以前的对话'开始的位置来取出电子邮件的正文。

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

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

var row = getFirstRow()+ 1;
var firstmessageId = getfirstmsgid();
UserProperties.setProperty(firstmsgid,firstmessageId);
spreadsheet.toast(正在载入电子邮件......请等待,可能需要几秒钟,状态,-1);

var messages = GmailApp.getMessagesForThreads(threads); //获取二维数组中的消息

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

for(var m = 0; 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){
//只获取这个消息体,忽略前面的链
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 {
//使用整个正文,如果它是正向
sheet.getRange(row,5).setValue(getTextFromHtml(msg.getBody()));
sheet.getRange(row,6).setValue(***);
}

row ++;
}
} catch(error){
Logger.log(error);
spreadsheet.toast(错误发生 - 请参阅日志。,状态,-1);


if(i == threads.length - 1){
spreadsheet.toast(成功加载电子邮件。,状态,-1);
}
}
}


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

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

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

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