今回は、Gmailで受信したメールの特定の件名と文字を検索して、スプレッドシートに書き出し、AVERAGE関数/フィルタを設定するまでやってみました。
(ピボットとグラフは手作業で設定。)
画像のような感じで、自分宛に4通メールを送って、それを下のコードで実行してみてください。
サンプルメールのコピペは以下からどうぞ。。
Gmail件名
0301件名抽出だよ004
Gmail本文
顧客名:D社
製品満足度:9
価格満足度:5
お客様の声:品質はいいですが、
高いです。
担当者:
鈴木
GASのコードは以下です。
AppsScriptコード
function getGmail2() {
SpreadsheetApp.getActiveSheet().getRange("A4:F504").clear({ contentsOnly: true, formatOnly: false })
SpreadsheetApp.getActiveSheet().getRange('D4').activate();
SpreadsheetApp.getActiveSheet().getRange(1, 4).setValue("Average");
SpreadsheetApp.getActiveSheet().getRange(1, 5).setValue("Average");
SpreadsheetApp.getActiveSheet().getRange(2, 4).setFormula('=AVERAGE(D4:D)');
SpreadsheetApp.getActiveSheet().getRange(2, 5).setFormula('=AVERAGE(E4:E)');
SpreadsheetApp.getActiveSheet().getRange('D1:E2').setHorizontalAlignment('center');
SpreadsheetApp.getActiveSheet().getRange("A3:F3").getFilter().remove();
SpreadsheetApp.getActiveSheet().getRange("A3:F3").createFilter();
//件名に、「件名抽出だよ」を含むメールを500件検索。501件以上はエラーになる。
var kenmeiSu = GmailApp.search("件名抽出だよ", 0, 500);
var honbunSu = GmailApp.getMessagesForThreads(kenmeiSu);
var gyo = 4;
for (var i = 0; i < honbunSu.length; i++) {
for (var j = 0; j < honbunSu[i].length; j++) {
//getDate()だけだと年月日に加えて時間も入るので、
//後ろに.to.toLocaleDateString()を付けると年月日だけ表示される。
var retsuA = kenmeiSu[i].getMessages()[j].getDate().toLocaleDateString();
var hipparu = honbunSu[i][j].getPlainBody();
//「顧客名:」と同じ列の「顧客名:」以降の文字を取得
var kokyaku = new RegExp('顧客名:' + '.*?' + '\r');
var retsuC = hipparu.match(kokyaku)[0].replace('顧客名:', '').replace('\r', '');
//「製品満足度:」と同じ列の「製品満足度:」以降の文字を取得
var seihin = new RegExp('製品満足度:' + '.*?' + '\r');
var retsuD = hipparu.match(seihin)[0].replace('製品満足度:', '').replace('\r', '');
//「価格満足度:」と同じ列の「価格満足度:」以降の文字を取得
var kakaku = new RegExp('価格満足度:' + '.*?' + '\r');
var retsuE = hipparu.match(kakaku)[0].replace('価格満足度:', '').replace('\r', '');
//「お客様の声:」から「担当者:」までの複数行間の文字を取得
var koe = new RegExp('お客様の声:' + '[\\s\\S]*?' + '担当者:');
var retsuF = hipparu.match(koe)[0].replace('お客様の声:', '').replace('担当者:', '').replace('\r', '');
//「担当者:」一段下の行の文字を取得
var tanto = new RegExp('担当者:' + '[\\s\\S]*' + '\r');
var retsuB = hipparu.match(tanto)[0].replace('担当者:', '');
SpreadsheetApp.getActiveSheet().getRange(gyo, 1).setValue([retsuA]);
SpreadsheetApp.getActiveSheet().getRange(gyo, 2).setValue([retsuB]);
SpreadsheetApp.getActiveSheet().getRange(gyo, 3).setValue([retsuC]);
SpreadsheetApp.getActiveSheet().getRange(gyo, 4).setValue([retsuD]);
SpreadsheetApp.getActiveSheet().getRange(gyo, 5).setValue([retsuE]);
SpreadsheetApp.getActiveSheet().getRange(gyo, 6).setValue([retsuF]);
gyo++;
SpreadsheetApp.getActiveSheet().getRange(3, 1).setValue("受信日");
SpreadsheetApp.getActiveSheet().getRange(3, 2).setValue("担当者");
SpreadsheetApp.getActiveSheet().getRange(3, 3).setValue("顧客名");
SpreadsheetApp.getActiveSheet().getRange(3, 4).setValue("製品CS");
SpreadsheetApp.getActiveSheet().getRange(3, 5).setValue("価格CS");
SpreadsheetApp.getActiveSheet().getRange(3, 6).setValue("お客様の声");
}
}
}
なかなかおもしろくなってきました、GAS&JS🎵
正規表現で取り出します。
・同じ行にある文字の取得:'特定文字' + '.?' + '\r'
・一段下の行の文字を取得:'特定文字' + '[\s\S]' + '\r'
・複数行間の文字の取得:'開始文字' + '[\s\S]*?' + '終了文字'
参考にしたサイト: