LoginSignup
0
2

More than 3 years have passed since last update.

GAS// メールを自動取得するスクリプト

Last updated at Posted at 2020-02-19

★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関数
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を返す

check_mID
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のトリガー機能を使用。うまくいきそうかな

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2