Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

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

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

yasuhikoc
ヘルプデスクやらテクニカルサポートやらの仕事を転々とした結果、コールセンターの知識のあるVBAプログラマになり、Filemakerでシステムを作ったり。 Jsonは誤植じゃありません。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away