2013-04-30 1 views
1

Google 애플리케이션 스크립트를 사용하여 특정 라벨 아래에있는 이메일을 Google 문서 도구 스프레드 시트로 덤프하려고합니다. 스레드마다 9 개의 메시지 체인이 있으면 각 메시지는 체인없이 개별적으로 나열됩니다. 예를 들어, 각 전자 메일 메시지 본문은 개별 행으로 나열됩니다.Google 애플리케이션 스크립트 Gmail에서 이전 대화없이 메일 가져 오기

각 메시지 본문 + 이전 전체 스레드가 저장된 셀을 하나의 셀로 관리하고 전체 스레드를 셀에서 가져올 수 있습니다. 그러나 이것은 내가 원하는 것이 아닙니다.

이 코드는 스레드의 전체 본문을 한 행에 넣습니다.

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

    } 
} 

이렇게하면 이전 스레드/메시지 체인을 포함하여 각 메시지 본문이 연속으로 배치됩니다.

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

답변

1

'이전 대화'가 시작된 곳을 식별하여 이메일 본문 만 빼낼 수있었습니다.

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

그건 나쁘지 않습니다. 내 사서함의 모든 스레드에 대해 작동하지는 않지만 적용 할 수 있습니다. – Mogsdad

+0

그래, 나는 그것이 나에게 지금 당장 필요한 것의 95 %라는 것을 알았다. 나는 다시 와서 그것을 조정할 수있어서 가까이 갈 수 있습니다. –

1

이는 "쓰레기에서, 쓰레기 아웃"의 경우입니다. 쓰레드 뷰에서 gmail 앱을 사용할 때, 구글의 서버는 이메일 본문을 파싱하고 오래된 메시지의 시체를 독창적으로 숨기고있다. 이렇게하면 스레드의 최신 메시지는 해당 메시지의 새로운 행으로 만 구성되며 더 작은 메시지의 "체인"을 갖게됩니다.

이것은 환상입니다. 스레드의 마지막 메시지 은 일반적으로에 새 내용을 포함하고 모든 이전 메시지 본문의 내용이 단일 메시지 본문으로 포함됩니다. 다른 이메일 서비스와 클라이언트는이를 위해 다른 패턴을 사용합니다.

스레드의 이전 메시지 내용이 현재 메시지 본문에 표시되는 방식의 대부분 또는 전체를 식별하고이를 사용하여 새 내용 만 추출 할 수 있어야합니다.

+0

나는 그것을 동료와 이야기 한 후에 깨달았다. 나는 곧 나의 해결책을 게시 할 것이다. div 클래스에 의해 '이전 대화'를 확인할 수있었습니다. –

+0

모든 메일이 동일한 환경에 있다면, 그 메일이 작동해야합니다. 내가 가지고 놀고있는 폴더에서 한 div 내의 모든 텍스트를 포함하여 몇 가지 다른 동작을 보았습니다. GMail의 서버는 분명히 새 텍스트를 발견하고 발견합니다. – Mogsdad

관련 문제