★Gmailに届いたメールを自動取得したい
毎日届く数百通のメールの中から、特定のルールのメールを自動取得したい。というニーズがありました。
マウスの動きを効率化するとか、意味不明な運用が正となってしまう前にスクリプトで自動化しました
▼スクリプトの動き
1.Gmailから特定の件名のメールを取得する
2.メールをシートに展開する
3.ある程度必要な情報は列ごと
4.同じメールは取得しないようにする
5.定期的に動かす
1.シートを指定する
const sh = SpreadsheetApp.getActiveSpreadsheet();
const ss = sh.getSheetByName("Mails");
const sheet = ss.activate();
複数のシートのどこに行くかわからないので、Mailsシート固定になるようにした。なんだか冗長
2.同じメールを取得しないようにする配列
const mIDs = sheet.getRange(2, 1, sheet.getLastRow()-1).getValues();
1列目のメールIDをgetRange
する。値がないとエラーになる。Lastrowが0になるので。何行か文字入れておけばOK
getID関数
function getID(){
const threads = GmailApp.search('from:test@example.com subject:"メールの件名" newer_than:1d');
for(var i=0; i<threads.length; i++){
var thread = threads[i];
var mails = thread.getMessages();
for(var j=0; j<mails.length; j++){
var mail = mails[j];
var date = Utilities.formatDate(mail.getDate(), 'Asia/Tokyo', 'yyyy/MM/dd');
var time = Utilities.formatDate(mail.getDate(), 'Asia/Tokyo', 'hh:mm');
var body = mail.getBody();
var subjects = mail.getSubject();
var tID = fetchData(body,'pre','\r');
var tName = fetchData(body,'pre','\r');
var tReason = fetchData(body,'pre','\r');
var mID = mail.getId();
Logger.log(mID , check_mID(mID));
if(!check_mID(mID)){
sheet.appendRow([mID,date, time,body,tID,tName,tReason]);
}
}
}
}
GmailApp.search('from:test@example.com subject:"メールの件名" newer_than:1d')
Fromアドレス、件名、1日前より新しいメールを検索
日(d)、月(m)、年(y)で期間を指定して、それより古いメールか新しいメールを検索します
older_than:
newer_than:
https://support.google.com/mail/answer/7190?hl=ja
mail.getDate()
すると日時を取得してしまうので、Utilities.formatDate
で日付と時間に分割
check_mID関数
1列目に取得しているメールIDを配列に読み込んで、IDを照合する。Someを使ってBooleanを返す
function check_mID(mID){
var check_mID = mIDs.some(function(arr,i,mIDs){
return(arr[0] === mID);
});
return check_mID;
}
fetchData関数
メール本文から指定の範囲を抜き出す
function fetchData(mailbody,pre,suf){
var reg = new RegExp(pre+'.*?'+suf);
var results = mailbody.match(reg)[0]
.replace(pre,'')
.replace(suf,'');
return results;
}
2020/3/10追記 pre/sufが存在しない場合にエラーで止まるので、try~catchを追加
定期的に動かす
GASのトリガー機能を使用。うまくいきそうかな