Gmailで件名に特定の文字列が含まれているメールを受信した時に、そのメールの差出人へ自動でメールを返信するGoogle App Scriptを作成します。
処理について考える
処理済みメールの管理方法
まずはどのように返信前のメールなのか、返信済みのメールなのかを判別する方法を考えていきます。
他にもあるかもしれませんが、パッと思いついたのは二つ。
- Gmailでは未読は未処理、既読は処理済みとする方法
- 処理完了したメールにラベルを付与する方法
「1. Gmailでは未読は未処理、既読は処理済みとする方法」のメリットとしては、実装が非常に簡単そうでシンプルになります。デメリットとしては、Google App Scriptから勝手に既読にしてしまうのでそのメールを誰かが読むのであればわかりづらくなります。
「2. 処理完了したメールにラベルを作る方法」のメリットとしては、1の案のデメリットである既読になってしまう問題が解決するだけでなく、ラベルが付与されるので他のメールと同じ受信ボックスでも対象のメールは全てラベル付されるので管理が楽になります。
デメリットとしては処理が若干複雑になります。
今回はとりあえずサンプルで作成するので、「1. Gmailでは未読は未処理、既読は処理済みとする方法」で作成していきます。
実行する処理のフロー
実装前に実行する処理のフローについて考えていきます。
やることとしてはシンプルで、未読メールを取得、件名を確認、対象であれば返信をします。
間の処理等もあるのでしっかりと書くと以下のイメージになります。
Gmailはスレッドとメッセージという呼び方なのでそちらに合わせます。
- 未読スレッド一覧を取得
- 未読スレッド一覧をループ処理でスレッドを一つずつ取り出す
- スレッドのメッセージの一つ目の件名を取得する
- 取得した件名に特定の文字列が入っていないか確認する
- 入っていた場合はメッセージの差出人のメールアドレスを取得する
- 取得したメールアドレスへ返信メールを送信する
- 処理したスレッドを既読にする
実装
処理に使用するメソッド
- 先ほど定義した処理フローを実装するGoogle App Scriptのメソッドを調べます。
未読スレッド一覧を取得
「GmailApp.search(検索条件)」を使用することでGmailの検索を行える。
未読メールの検索条件は「is:unread」で行える。
基本ボックス内のメールを対象にするので、検索条件としては「is:unread」も加える。
GmailApp.search("label:inbox is:unread")
で未読スレッド一覧が取得できる。
未読スレッド一覧をループ処理でスレッドを一つずつ取り出す
Google App Scriptではいくつかループを実現する方法があるのですが、今回は「forEach」を使用します。
threads.forEach(function(thread) { それ以下の処理 })
スレッドのメッセージの一つ目の件名を取得する
スレッドのメッセージ一覧を取得して一つ目の件名を取得します。
スレッドのメッセージ一覧を取得するのは「スレッド.getMessages()」。
件名の取得は、「メッセージ.getSubject」。
var message = thread.getMessages()[0];
message.getSubject(); // 件名取得
取得した件名に特定の文字列が入っていないか確認する
件名はすでに文字列として取得しているので文字列に対して、とある文字列が含まれているかどうかを検索するメソッドを使用します。今回は「indexOf」を使用します。
subject.indexOf(subject) != -1
入っていた場合はメッセージの差出人のメールアドレスを取得する
差出人のメールアドレスの取得は「getFrom」をメッセージに対して行うことで取得できます。
message.getFrom();
取得したメールアドレスへ返信メールを送信する
Google App Scriptからメールを送信するには「MailApp.sendEmail」を使用します。
toに宛先、subjectに件名、nameは自分の表示名、bodyは本文です。
MailApp.sendEmail({to:mailFrom, subject:sendMailSubject, name:sendMailName, body:sendMailbody);
処理したスレッドを既読にする
Google App Scriptからスレッドを既読にするには「GmailApp.markThreadRead」を使用します。
GmailApp.markThreadRead(thread);
実装
ここまでくれば実装は簡単です。
変数等のミスに気をつけながら実装します。
function ResponseMail() {
const subject = 'ダミー件名';
const sendMailSubject = 'ダミー件名の返信';
const sendMailName = '表示する名前';
const sendMailBody = 'ダミー件名メールの返信です!';
// 未読スレッド一覧を取得
var unreadMailThreads = GmailApp.search("label:inbox is:unread");
// 未読スレッド一覧をループ処理でスレッドを一つずつ取り出す
unreadMailThreads.forEach(function(unreadMailThread) {
// スレッドのメッセージの一つ目の件名を取得する
var message = unreadMailThread.getMessages()[0];
var mailSubject = message.getSubject();
// 取得した件名に特定の文字列が入っていないか確認する
if (mailSubject.indexOf(subject) != -1) {
// 入っていた場合はメッセージの差出人のメールアドレスを取得する
var mailFrom = message.getFrom();
// 取得したメールアドレスへ返信メールを送信する
MailApp.sendEmail({to:mailFrom, subject:sendMailSubject, name:sendMailName, body:sendMailBody});
// 処理したスレッドを既読にする
GmailApp.markThreadRead(unreadMailThread);
}
})
}
作成したスクリプトが起動する時間を設定
時間での起動設定はスクリプトエディタで時計マークをクリックして時間を設定していきます。

トリガーを追加ボタンを押します。

トリガーを追加の画面で以下の設定を変更します。
- 「イベントのソースを選択」を時間主導型に変更
- 「時間ベースのトリガーのタイプを選択」を「分ベースのタイマー」に変更
- 「時間の間隔を選択(分)」を「5分おき」に変更
変更が終わったら「保存」ボタンを押します。

これで5分おきに先ほど作成したスクリプトが流れるようになりました。
コメント