【GAS】Google Apps ScriptでGmailを操作!メールの自動送信・抽出をする方法

2020-02-27

【GAS】Google Apps ScriptでGmailを操作!メールの送信・抽出する方法
mono
mono
こんにちは、monoです。

Google Apps Script(GAS)を使って、Gmailで何かできないかとお探しのようですね。

わかりました。その願い叶えましょう。

当記事ではGASとGmailを使って業務効率化をしたい人向けに、

  • GASを使ってGmailでできること
  • Gmailからメールを自動送信する方法
  • Gmailからメールデータを抽出する方法

について解説します。

GASを使ってGmailでできることは?

GASを使ってGmailを操作する具体的な方法を解説する前に、まずはGmailまわりでGASを使って何ができるのかについて解説します。

GmailまわりでGASを使ってできることは、大きく以下の2つです。

  • Gmailからメールを自動送信する
  • Gmailからメールデータを抽出する

要は、GASから命令してGmail経由でメールを送信したり、Gmailに届いたメールをGASから命令して取得できるということですね。

たしかに同じような内容のメールをいちいちGmailを起動して送信したり確認しなくて済むのは、業務効率化に役立ちそうです。

Gmailからメールを自動送信する方法

ここからはGASを使ってGmailのメールを送信する方法について解説します。

sendEmailメソッドを使う

GASでGmailを送る方法ですが、たった1つのメソッドを使うだけメールを送信できます。

そのメソッドがGmailAppクラスのsendEmailメソッドです。sendEmailメソッドは以下の構文で動作します。

 command
GmailApp.sendEmail(
  To[宛先],
  Subject[件名],
  Body[本文],
  {Option[オプション]}
);

sendEmailメソッドでは{}内にカンマ区切りでオプションを設定することができ、オプションには以下のような種類があります。

cc・bccはもちろん、送信者名や添付ファイルなどもオプションから設定できます。

プロパティ 内容
cc CCに含めるメールアドレス[カンマ区切り]
bcc BCCに含めるメールアドレス[カンマ区切り]
name 送信者名[デフォルト:ユーザー名]
noReply 返信不可フラグ
replyTo 返信時に返信先となるメールアドレス
attachments 添付ファイル

sendEmailメソッドのサンプルコード

参考までに、sendEmailメソッドを使ってメールを送信するサンプルコードを載せておきます。

下記のコードを貼り付けて、toアドレスを自分用に変えたらすぐ動くので、良かったら試してみてください。

 command
function send_Gmail() {
  //送信先のメールアドレス
  var to = 'test@example.com';
  //件名・タイトル
  var subject = 'test title';
  //本文
  var body = 'テスト';
  //オプション
  var options = {name: 'mono'};
  //送信メソッド
  GmailApp.sendEmail(to, subject, body, options);
}

Gmailからメールデータを抽出する方法

ここからはGASを使ってGmailのメールを抽出する方法について解説します。

前提として送信よりも抽出の方がコードもデータ構造も複雑で難しくなるので、気合入れていきましょう。

Gmailのデータ構造

まずはじめにGmailのデータ構造について解説します。

Gmailデータは、以下のような入れ子構造になって存在しています。

①受信ボックス(全メール)
→②スレッド(各メールのスレッド)
→→③メッセージ(各メール)

したがって、特定のメールの件名や本文を抽出するにはメールの検索・抽出条件を設定したり、スレッドをさかのぼってどのメッセージから抽出するのか特定したりなど、色々と前処理をしないとデータを取ることができません。

初見ではforループやif条件などやや複雑な印象を受けると思いますが、慣れてきたら合理的によく考えられた構造だと理解できるかと思います。

Gmailの抽出条件

①の受信ボックスの段階で必要最小限のメールデータに絞り込むために、Gmailの抽出条件について解説します。

Gmailの抽出条件はGoogleの検索演算子と似ており、下記がその一覧表です。

検索演算子 説明
to: 受信者を指定します
cc:
bcc:
Cc や Bcc の受信者を指定します
subject: 件名に含まれる単語を指定します
OR または { } 複数の条件に一致するメールを検索します
- 検索結果から除外するキーワードを指定します
AROUND 2 つのキーワードが近くにあるメールを検索します。2 つの単語間に許容可能な単語数を指定します
引用符を追加すると、入力した単語の順序と一致するメールを検索します
label: 指定したラベルのメールを検索します
has:attachment 添付ファイルのあるメールを検索します
has:drive
has:document
has:spreadsheet
has:presentation
Google ドライブへのリンク、Google ドライブに保存された Google ドキュメント、スプレッドシート、スライドへのリンク、または Google ドキュメント、スプレッドシート、スライドの添付ファイルが含まれるメールを検索します
has:youtube YouTube 動画が含まれるメールを検索します
list: メーリング リストのメールを検索します
filename: 指定した名前やファイル形式の添付ファイルがあるメールを検索します
指定したキーワードまたはフレーズに完全一致するメールを検索します
( ) 複数のキーワードをグループ化します
in:anywhere すべてのメール(迷惑メールやゴミ箱にあるメールを含む)を検索します
is:important
label:important
重要マークが付いたメールを検索します
is:starred
is:snoozed
is:unread
is:read
スター付き、スヌーズ中、未読、既読のメールを検索します
has:yellow-star
has:blue-info
指定した色のアイコンが付いたメールを検索します
cc:
bcc:
[Cc] か [Bcc] 欄の受信者を指定します
after:
before:
older:
newer:
指定した期間に送信されたメールを検索します
older_than:
newer_than:
日(d)、月(m)、年(y)で期間を指定して、それより古いメールか新しいメールを検索します
is:chat チャット メッセージを検索します
deliveredto: 指定したメールアドレスに配信されたメールを検索します
category:primary
category:social category:promotions category:updates category:forums category:reservations category:purchases
指定したカテゴリのメールを検索します
size: 指定したサイズより大きいメールを検索します(バイト単位)
larger:
smaller:
指定したサイズより大きいまたは小さいメールを検索します(バイト単位)
+ 検索キーワードと完全に一致するメールを検索します
Rfc822msgid: 指定した Message-ID ヘッダーのメールを検索します
has:userlabels
has:nouserlabels
ラベルが付いているメールまたは付いていないメールを検索します

searchメソッドで検索条件を指定

いよいよGmailからデータを取得しましょう。

Gmailからデータを取得するには、GmailAppクラスのsearchメソッドを利用します。

 command
myThreads = GmailApp.search(
  検索条件,
  開始インデックス,
  最大取得数
);

検索条件には先ほどの検索演算子を文字列で指定し、取得したいデータに応じて開始インデックスと最大取得数を指定すればOKです。

getMessagesForThreadsメソッドでスレッド配列を取得

検索条件に合致したスレッドを取得するには、GmailAppクラスのgetMessagesForThreadsメソッドを利用します。

 command
myMsg = GmailApp.getMessagesForThreads(myThreads);

変数myMsgには配列形式で検索条件に合致したスレッドデータが返されます。この状態ではまだメッセージデータは配列に格納されていません。

getPlainBodyメソッドでGmailの本文を抽出

スレッド配列からメッセージ本文を取得するには、GmailAppクラスのgetPlainBodyメソッドを利用します。

 command
myBody = GmailApp.getPlainBody(myMsg[i][j]);

変数myMsgには検索条件に合致したスレッド配列[i]と、そのスレッド内のメール配列[j]で構成されているので、二重for文でメールごとにメール本文を取り出します。

myBodyには各メールの本文がテキストデータで格納されるので、後は好きなように本文データを利用することが可能です。

メールデータ抽出のサンプルコード

参考までに、searchメソッド、getMessagesForThreadsメソッド、getPlainBodyメソッドを使ってメールデータを抽出するサンプルコードを載せておきます。

下記のコードを貼り付けて、検索演算子を自分用に変えたらすぐ動くので、良かったら試してみてください。

 command
function send_Gmail() {
  //検索演算子の指定(ラベル「example」のメールを抽出)
  var query = 'label:example'
  //ラベル「example」のメールを最大10件取得
  var myThreads = GmailApp.search(query, 0, 10);
  //検索条件に合致するスレッド配列データを取得
  var myMsg = GmailApp.getMessagesForThreads(myThreads);
  //本文をログに出力
  for(var i=0; i < myMsg.length; i++) {
    for(var j=0; j < myMsg[i].length; j++) {
      var body = myMsg[i][j].getPlainBody();
      Logger.log(body);
    }
  }
}

まとめ

今回は「GASを使ってGmailでできること」「Gmailからメールを自動送信する方法」「Gmailからメールデータを抽出する方法」について解説しました。

GASでGmailを操作できるようになると、メールの自動送信や、条件に合致するメールが届いたときにスプレッドシートへ貼り付けしたり、Slackに通知したりなど、いろいろ便利な使い方ができるようになります。

GASの勉強におすすめの本も載せておくので、今回の内容を復習しつつ、さらにGASを仕事に活かせてもらえたら幸いです。

では、また。

【GAS入門】Google Apps Scriptでできることを徹底解説!

【GAS】Google Apps Scriptの勉強におすすめの本3選

  • この記事を書いた人

mono

26歳♂️関東在住のサイドFIREを目指すブロガー/座右の銘は「知識は誰にも奪われない」/ゆるく稼いで楽しく暮らすライフハック情報をお届けします/アイコンは黎(クロイ)さん。

スキルを磨く Google Apps Script

© 2021 monoblog