ここで同様の質問を見つけました: 受信したGmailメッセージから電子メールアドレスを取得する しかし、違いは「From:」ではなく「To:」アドレスが欲しいということです。
ドメインにキャッチオールメールアドレスがあります。私がそこに大量のスパムメールを受け取っていることを除いて、私のホストは、私が使ったすべてのもののために個々のメールアカウントをセットアップする必要があると私に言っています。私は自分が使ったドメイン名で何百ものユニークなメールを持っていますが、それらをすべてリストに入れる簡単な方法はありません。
GmailApp APIでこれを行う方法を見つけようとしています。以下のコードを試しましたが、探していたものがまったく得られませんでした。 Gmailアカウントで、*@mydomain.com
などのメールを受信したすべての一意/個別のメールアドレスを取得したい。
function getEmails() {
// http://stackoverflow.com/a/12029701/1536038
// get all messages
var eMails = GmailApp.getMessagesForThreads(
GmailApp.search('after:2015/1/14 before:2016/3/12'))
.reduce(function(a, b) {return a.concat(b);})
.map(function(eMails) {
return eMails.getTo()
});
// sort and filter for unique entries
var aEmails = eMails.sort().filter(function(el,j,a)
{if(j==a.indexOf(el))return 1;return 0});
// create 2D-array
var aUnique = new Array();
for(var k in aEmails) {
aUnique.Push([aEmails[k]]);
}
// add data to sheet
SpreadsheetApp.getActiveSheet().getRange(1, 1, aUnique.length, 1)
.setValues(aUnique);
}
//////////////////以下の回答を得た後、このコードをページングで変更しました。しかし、ページングを何らかの形でループに組み込み、すべての一意の電子メールを1回のパスで取得できるようにすることで、さらに改善できます。
function GetAddresses ()
{
// Get the active spreadsheet
var ss = SpreadsheetApp.getActiveSpreadsheet();
// Create / empty the target sheet
var sheetName = "Pixeltrics Emails";
var sheet = ss.getSheetByName (sheetName) || ss.insertSheet (sheetName, ss.getSheets().length);
sheet.clear();
// Get all messages in a nested array (threads -> messages)
var addressesOnly = [];
var messageData = [];
var pageSize = 500;
var startIndex = 500;
// Get all messages for the current batch of threads
var eMails = GmailApp.getMessagesForThreads(
GmailApp.search('to:(@mydomain.com)',startIndex,pageSize))
.reduce(function(a, b) {return a.concat(b);})
.map(function(eMails) {
var matched = eMails.getTo().match(/<[^@]*@mydoman\.com>/ig);
return (matched ? matched : []);
})
.reduce(function(a, b) {return a.concat(b);});
// lowercase, filter for unique entries, sort
var aEmails = eMails.map(function(text) {return text.toLowerCase().slice(1, -1);})
.filter(function(el,j,a) {return j == a.indexOf(el)})
.sort();
// create 2D-array
aUnique = aEmails.map(function(el) {return [el];});
// add data to sheet
SpreadsheetApp.getActiveSheet().getRange(1, 1, aUnique.length, 1)
.setValues(aUnique);
}
メソッドgetTo
は、受信者の名前と電子メールアドレスを含む文字列を返します。アドレス、特に*@mydomain.com
に一致するアドレスを抽出する必要があります。これは、以下の正規表現を使用して行われます。
var matched = eMails.getTo().match(/<[^@]*@mydomain\.com>/ig);
結果は配列またはヌルです。 nullを空の配列に置き換えてから、結果を再度フラット化します(concatで削減)。
さらに、重複を正しく見つけるために、すべてのアドレスが小文字になります。コマンドslice(1,-1)
は、電子メールの周りの角かっこを取り除きます。次に、一意がフィルタリングされ、結果がソートされます。 (ソートする方が良いと思うafter重複を除外する:ソートするのにはるかに小さい配列。)
そして、この関数では.map
と.reduce
がすべてなので、2D配列を作成するときに.map
も使用しました。
function getEmails() {
// modified from http://stackoverflow.com/a/12029701
// get all messages, extract matching addresses from To fields
var eMails = GmailApp.getMessagesForThreads(GmailApp.search('after:2015/1/14 before:2016/3/12'))
.reduce(function(a, b) {return a.concat(b);})
.map(function(eMails) {
var matched = eMails.getTo().match(/<[^@]*@mydomain\.com>/ig);
return (matched ? matched : []);
})
.reduce(function(a, b) {return a.concat(b);});
// lowercase, filter for unique entries, sort
var aEmails = eMails.map(function(text) {return text.toLowerCase().slice(1, -1);})
.filter(function(el,j,a) {return j == a.indexOf(el)})
.sort();
// create 2D-array
aUnique = aEmails.map(function(el) {return [el];});
// add data to sheet
SpreadsheetApp.getActiveSheet().getRange(1, 1, aUnique.length, 1)
.setValues(aUnique);
}