2016-12-01 17 views
1

私の電子メールには、通常、複数のラベルが割り当てられています。特定のラベルの電子メールを検索してスプレッドシートに一覧表示し、その電子メールに割り当てられている他のすべてのラベルを表示するのが好きです。ここで電子メールのラベルをスプレッドシートにすべて一覧表示

は、私はこれまで、他のラベルを取得する方法を見つけ出すことはできませんしているものだ...

function myFunction() { 

    var ss = SpreadsheetApp.getActiveSheet(); 
    var threads = GmailApp.search("label:Test"); 

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

    for (var j=0; j<messages.length; j++) 
    { 
     var sub = messages[j].getSubject(); 
     var from = messages[j].getFrom(); 
     var dat = messages[j].getDate(); 

     ss.appendRow([dat, sub, from]) 
    } 
    } 
} 

答えて

1

限りAppsスクリプトに関しては、Gmailのラベルがスレッドに適用されず、個々のメッセージに送信します。 (これが必ずしも真実ではない他の文脈が、Web Apps postの詳細として存在する)。

したがって、ThreadオブジェクトのgetLabelsメソッドを使用する必要があります。次に、各行がメッセージではなくスレッドに対応するように出力を構造化することは理にかなっています。これは私が下で行ったことです。スクリプトは各スレッドの最初のメッセージからsubject/from/dateを取ります。 4番目の列は、検索するものを除き、カンマで区切られたラベルのリストです。

function myFunction() { 
    var sheet = SpreadsheetApp.getActiveSheet(); 
    var search_label = 'Test'; 
    var threads = GmailApp.search('label:' + search_label); 

    var output = []; 
    for (var i=0; i < threads.length; i++) { 
    var firstMessage = threads[i].getMessages()[0]; 
    var sub = firstMessage.getSubject(); 
    var from = firstMessage.getFrom(); 
    var dat = firstMessage.getDate(); 
    var labels = threads[i].getLabels(); 
    var otherLabels = []; 
    for (var j = 0; j < labels.length; j++) { 
     var labelName = labels[j].getName(); 
     if (labelName != search_label) { 
     otherLabels.push(labelName); 
     } 
    } 
    output.push([dat, sub, from, otherLabels.join(', ')]); 
    } 
    sheet.getRange(1, 1, output.length, output[0].length).setValues(output); 
} 

私の代わりに二重アレイoutputを収集し、一度にすべてを挿入し、一度に1行を追加しないことを好みます。もちろん、appendRowをスクリプトのように使用することができます。カンマ区切りのリストは必ずしも必要ではありません。

sheet.appendRow([dat, sub, from].concat(otherLabels)); 

となります。

関連する問題