【GAS】 Gmail連携の基本

GAScreateDraft,getAttachments,getDrafts,getMessages,getPlainBody,gmail,GmailApp,GmailApp.search,markThreadRead,match,send,トリガー

Google Apps Script(GAS)ではGoogle系アプリ(Gmail/Google カレンダー/Google ドライブ等)との連携した処理を行うことができ、使い方を覚えておくと普段の業務効率を格段に上げられます。

この記事では、Gmailを扱うクラス/メソッドの中でも特に便利なものをピックアップして紹介します。

GASでできること

GASには、Gmailを扱うクラス(GmailApp)が用意されていて、様々な便利機能をGmailApp.メソッドという形で扱うことができるようになっています。

  • Gmailで特定条件のメールを検索し情報を取得する
  • メールの内容をスプレッドシートに転記
  • メールのステータスを変更する
  • 自動で下書きを作成する
  • 自動でメールを送付する
  • トリガーと組み合わせて定期的にメール処理を実行する
  • 添付ファイルをGoogleドライブに保存する

それでは、一つずつ解説していきます。

Gmailで特定条件のメールを検索し情報を取得する

GASでは、自分のGmailボックスから特定条件(送信元アドレス/期間/件名/添付ファイル等)でメールを検索/抽出できます。この抽出したメール内容をスプレッドシートに書き出すなどして分析が可能になります。

操作ステップ

  1. 指定条件のメールをスレッド化(GmailApp.searchメソッド)
  2. 各メールごとにオブジェクト化(getMessagesメソッド)
  3. メールに対して処理を実行(getIDメソッド / getPlainBodyメソッド etc…)

利用メソッドの基本構文

GmailApp.search(query [,start ,num])

  • query(必須):検索条件 ※検索窓で検索する時と同様に指定が可能
  • start(任意):インデックス開始位置(「0」または指定しなければ最新から取得)
  • num(任意):スレッドの最大取得数
  • 戻り値:検索条件にマッチするメールのスレッド(GmailThreadオブジェクト)の配列

queryには「from:○○」「subject:○○」といった、gmailの検索画面で実際に検索するのと同様の記述で抽出対象のメールを指定することができます。

GmailThread.getMessages()

  • 戻り値:GmailThreadに含まれるメッセージの配列

getMessage.取得用メソッド

  • 戻り値:メソッドによって取得されたオブジェクト
Messagesオブジェクトに使える取得用メソッド一覧戻り値取得内容
getFrom()String送信元アドレス
getTo()String送付先アドレス
getCc()StringCCアドレス
getBcc()StringBccアドレス
getDate()Date送信日付
getBody()Stringメール本文(HTMLのソースコード)
getPlainBody()Stringメール本文(標準テキスト)

下記は、自分のGmailスレッドから、件名が「お問い合わせありがとうございます 」というメールの、送信元アドレス(getFrom)と本文(getPlainBody)を抽出するサンプルコードです。

  //Gmailの履歴から件名が「お問い合わせありがとうございます」というメールを指定
  let threads = GmailApp.search('subject:お問い合わせありがとうございます');
  
  //一覧化したメールの件数分繰り返し 
  threads.forEach(function(thread) {
    // スレッド内のメール一覧を取得
    let messages = thread.getMessages();
    
    // メールを一つずつ取り出す
    messages.forEach(function(message) {

      //メール送信者のアドレス
      let senderMail = message.getFrom();
      console.log(senderMail);

      // メール本文を取得
      let plainBody = message.getPlainBody();
      console.log(plainBody);
      
    });
  
  })
実行結果

//console.log(senderMail); 
“**********" <wordpress@****.jp>

//console.log(plainBody);
この度は、お問い合わせ誠にありがとうございました。
後日担当より改めてご連絡いたしますので、今しばらくお待ちくださいませ。

このメールは ********** (https://****.jp) のお問い合わせフォームから送信されました。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
**********株式会社
電話番号:**-****-****
ホームページ:https://www.***.co.jp/
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

※固有名詞や特定情報はマスクしています。

抽出時に指定できる条件等は下記の記事で詳しく解説しています。

メールの内容をスプレッドシートに転記

特定条件で検索/抽出できることを前述しました。抽出に続けてよく行うのは「メールのテキスト内容を処理し、特定の情報をスプレッドシートに転記する」といった処理です。特定件名や送信先のメールを内容とともに一覧化したい、フォームのメール通知をスプレッドシートで整理したいといったシーンで便利です。

操作ステップ

上の抽出パートと同じ手順で条件指定してメールを抽出してから、内容を処理してスプレッドシート書き出しを行います。

  • 指定条件のメールをスレッド化(GmailApp.searchメソッド)
  • 各メールごとにオブジェクト化(getMessagesメソッド) ←ここまで上パートの手順と同様
  • メールの内容を処理(matchメソッド / Parserライブラリ etc…)
  • 処理したデータをスプレッドシートに書き出し(appendRowメソッド / setValuesメソッド)

利用メソッドの基本構文

GmailMessage.getPlainBody()

  • 戻り値:GmailMessageに含まれる本文(HTMLは含まずテキストのみを取得)

String.match(regexp)

  • regexp:抽出する条件。正規表現ではなく文字列(String)型の引数で記述した場合はその文字列に部分一致する箇所が抽出される
  • 戻り値:抽出された文字列

下記では自社のフォームの整理を題材として、メール本文からmatchメソッドを活用して本文の内容を抽出し、その内容をスプレッドシートに書き出す方法をご紹介しています。

もう少しややこしい抽出例も下記の記事でご紹介しているので併せてご覧ください!

メールのステータスを変更する

特定条件で抽出したメールのステータスを変更することができます。

手動では処理しきれないくらい未読メールが溜まっており一括して既読にしたいシーンや、受信したメールが一定期間メールボックスにあったら既読にしたいという条件付けを行いたい場合に使えます。

操作ステップ

未読メールを対象としたGmailのスレッド化と既読化処理を行います。

  • 指定条件のメールをスレッド化(GmailApp.searchメソッド)
  • 各メールごとにオブジェクト化(getMessagesメソッド) ←ここまで上パートの手順と同様
  • メールに対してステータス変更処理を実行()

利用メソッドの基本構文

GmailApp.markThreadRead(thread)

  • thread:GmailApp.search()等で取得したGmail Treadオブジェクト

markThreadsReadメソッドはThreadオブジェクトを引数として、そのスレッドに含まれるメールのステータスを既読とするメソッドです。その他、下記一覧です示すステータス変更用のメソッドは同様の構文で記述できます。

Threadオブジェクトに使えるステータス変更用メソッド一覧変更内容
markThreadRead(thread)スレッドを既読に変更
markThreadUnread(thread)スレッドを未読に変更
markThreadImportant(thread)スレッドに重要マークを付ける
markThreadUnimportant(thread)スレッドから重要マークを外す
moveThreadToArchive(thread)スレッドをアーカイブする
moveThreadToInbox(thread)スレッドをInboxに移動する
moveThreadToSpam(thread)スレッドをスパムに移動する
moveThreadToTrash(thread)スレッドをゴミ箱に移動する

下記は2021/12/1~2021/12/2の未読メールを既読にするサンプルコードになります。


// 条件に合致する未読メールを既読にする
function toRead() {
  // cnd = メールの検索条件

  const after_date = Utilities.formatDate(new Date(2021,12,1), 'JST', "yyyy/MM/dd");
  const before_date = Utilities.formatDate(new Date(2021,12,2), 'JST', "yyyy/MM/dd");
  
  const unreadTreads = "   after:"+ after_date +"before:" + before_date;  // 未読のみを対象とする

  // メール(スレッド)を検索
  let threads = GmailApp.search(unreadTreads);

  // 既読化前の未読メール数を確認
  // console.log(threads.length);
  
  // スレッドを既読にする
  GmailApp.markThreadsRead(threads);

  // 既読化後の未読メール数を確認
  // threads = GmailApp.search(unreadTreads); 
  // console.log(threads.length);
}

GmailApp.markThreadsRead(threads)がスレッド化したメールをすべて既読化するメソッドです。コメントすとしてますが、メソッド実行前後で同じ条件で抽出して既読メール数を見ると、後者のみが0になっているのが確認できます。

自動で下書きを作成する

GASを使って、Gmailボックスを開かずに自動で下書きの作成を実行することができます。スプレッドシートに記載された情報から同じメール本文を大量の宛先に送るといったことも可能で、メール作成を自動化して作業効率を上げたいといったシーンで使えます。

操作ステップ

  • 宛先、件名、本文などメール情報を用意
  • 自分のGmailアカウントと連携
  • 下書きを作成(createDraftメソッド)

利用メソッドの基本構文

GmailApp.createDraft(to , subject , body [, option])

  • to(必須):送信先のメールアドレス
  • subject(必須):メールの件名
  • body(必須):メールの本文
  • option(任意):CC、BCC、添付ファイル、返信先等のオプション設定
function CreateDraft() {

 // 作成したいメールの情報
  let recipient = "aaa@gmail.com";
  let subject = "テストです";
  let body = "ここは本文です";

  let options ={
    cc: "cc@gmail.com",
    bcc:"bcc@gmail.com"
  };

  GmailApp.createDraft(recipient,subject,body,options);

}

Gmailと連携する際に権限認証が必要

実行結果

詳細仕様やスプレッドシートから宛先や本文を読み込んみ動的な情報で下書きを一括で作成する方法などは下記記事で解説しています。

自動でメールを送付する

下書き保存しているメールをコマンド経由で自動送信することができます。メールボックスを開かず一括して送付したい、下書き作成のメソッドと同時に送信まで実行したいといった場合に活用できます。

操作ステップ

  • 送信予定の下書きを用意(GAS経由でもGASを経由しなくてもOK)
  • 下書きメールのスレッドを取得(getDraftsメソッド)
  • 送信(sendメソッド)

利用メソッドの基本構文

GmailApp.getDrafts()
Drafts.send()

架空の宛先をセットした2通の下書きを用意しました。

全ての下書きを送付するコードは下記になります。実行した瞬間送付されるので、間違いがないか確認を挟むようにしましょう。

function sendMail() {

  let drafts = GmailApp.getDrafts(); // 下書きを全て取得

  drafts.forEach(function(draft){

    // //取得できている下書きの確認用
    // // 送付先
    // let adress = draft.getMessage().getTo();
    // // 送付件名
    // let subject = draft.getMessage().getSubject();
    // console.log([adress,subject]);

    draft.send(); // 送付実行

  })
}

実行後、送信されたのが確認できました。

トリガーと組み合わせて定期的にメール処理を実行する

あるメールが届いたときだけ毎朝処理を行うなど、トリガーと組み合わせることでメール処理を定期的に実行することができます。

日次でメールで取得している売上データを集計する、アラートメールをLINEに通知する、新着メールに添付されているファイルを自動で保存するといった具合に処理の幅が格段に広がります。

操作ステップ

  • 処理を実行するスクリプトを用意
  • 条件に合致したらメールの処理を実行するトリガーをセット
トリガーをセットしてメールこちらの記事で詳しく解説しています。

添付ファイルをGoogleドライブに保存する

GASでは、自分のGmailボックスのメールに添付されているファイルを抽出して自動的にGoogle Driveに保存することができます。

メールボックスの添付ファイルを一括でドライブに保存したり、受信したメールに添付されているファイルを自動で保存するといったことも可能です。

操作ステップ

・指定条件のメールをスレッド化(GmailApp.searchメソッド)
・対象となるメールをオブジェクト化(getMessagesメソッド)
・添付ファイルの取得(getAttachmentsメソッド
・保存先のフォルダを指定ししてファイルを保存(DriveAppクラスののcreateFileメソッド

利用メソッドの基本構文

GmailMessage.getAttachments()

  • 戻り値:添付ファイルのBlobオブジェクトの配列

下記のサンプルコードでは、期間が「2021/12/1~2022/1/1′」のメールの添付ファイルを取得するサンプルコードです。queryという変数にその他のパラメータを入れることで件名 / 送信者 / 日付等の他の条件も設定できます。

また、下記のサンプルコードでは保存先のフォルダはIDで指定しています。保存先として指定したいご自身のドライブの任意ファイルのIDを'[保存先のフォルダID]’ に記述してください。

function saveAttachment() {

  //検索マッチ条件、添付ファイルあり、2021年12月の受信
  let query = 'has:attachment after:2021/12/1 before:2022/1/1';

 //指定条件でスレッド化
  let threads = GmailApp.search(query);

  //保存先のフォルダID
  let folderId = '[保存先のフォルダID]';
  
  //スレッド化したメールの件数分繰り返し 
  threads.forEach(function(thread) {
    // スレッド内のメール一覧を取得
    let messages = thread.getMessages();
    
    // メールを一つずつ取り出す
    messages.forEach(function(message) {
      // 添付ファイルを取得
      let attachments = message.getAttachments();

      //添付ファイルの受信日付
      let date = Utilities.formatDate(message.getDate(), 'Asia/Tokyo', 'yyyyMMdd');

      attachments.forEach(function(attachment){
  
        //日付を加えたファイル名用意
        let fileName = date +'_'+ attachment.getName();
        attachment.setName(fileName);
      
        // ドライブに保存  
        DriveApp.getFolderById(folderId).createFile(attachment);
        //ファイル名を上書き
     })
    });
  });
}

まとめ

この記事では、GASで扱えるGmailメソッドの概要と使い方について紹介しました。GASとGmailを連携させることで下記のような処理が可能です。

  • Gmailで特定条件のメールを検索し情報を取得する
  • メールの内容をスプレッドシートに転記
  • メールのステータスを変更する
  • 自動で下書きを作成する
  • 自動でメールを送付する
  • トリガーと組み合わせて定期的にメール処理を実行する
  • 添付ファイルをGoogleドライブに保存する

ぜひ作業効率改善に役立ててください!

この記事を書いた人

てつお
広告代理店出身、事業会社でWebマーケティングや開発の仕事をしている26歳です。プロフィール詳細はこちら
■Google広告認定資格|Google アナリティクス個人認定資格(GAIQ)|TOEIC920点