こんにちは、看護師をしながらコードを書いている凛です。
今回は、私がGmailの自動返信を作った顛末を、時系列で書いてみようと思います。きっかけは、夜勤明けの仮眠から目を覚ましたある朝のこと。副業の問い合わせメールが6件たまっていて、返信しきれないうちにキャンセルされてしまったんです。あれは本当に悔しかった。「自動で一次返信だけでも返せたら」——そう思ってたどり着いたのが、GASによるGmail自動返信でした。
同じように、寝ている間や外出中のメール対応に悩んでいる方は多いはずです。スマホで長文を打つのはしんどいけれど、「受信しました」の一言すら返せないまま半日過ぎるのはもっとつらい。この記事は、その状態から抜け出すまでの記録と、プログラミング初心者でも5分でコピペして動かせる最短レシピです。
作ると決めた日:まず全体像を整理した
いきなりコードを書き始める前に、GASでGmailを自動返信する仕組みの全体像をざっくり整理しました。難しそうに見えますが、やっていることはシンプルです。
- Gmailで「未読」「特定ラベル付き」などの条件でメールを検索する
- 取得したメールスレッドに対して、定型文で返信する
- 返信済みのメールにはラベルをつけて、二重返信を防ぐ
- Googleのトリガー機能で、5分おきにこの処理を自動実行する
この4ステップさえ動けば、あなたが寝ていようが夜勤中だろうが、Gmailが勝手に一次返信してくれる状態になります。
私は最初「メールサーバー側で設定しないとダメなのかな?」と思い込んでいました。ところが調べてみると、GASならGoogleアカウント上で完結する。サーバーも費用も不要。この時点で「あ、これは今日中にいけるかも」と気が楽になったのを覚えています。
GASの準備(初めての方向け)
GASを使うのが初めてなら、まず「プロジェクト」を作ります。script.google.com にアクセスして、左上の「新しいプロジェクト」をクリック。ファイル名を GmailAutoReply などに変更して、Code.gs のエディタに後述するコードを貼り付ける。これだけでGASの開発環境は整います。
PC1台とGoogleアカウントさえあれば、他には本当に何もいりません。ここがGASのありがたいところです。
その日のうちに動いた:10行のコード
書いたのは、たったこれだけのコードです。以下をGASエディタにコピペして、LABEL_NAME と REPLY_BODY を書き換えれば動きます。
function autoReply() {
const LABEL_NAME = '自動返信済み';
const REPLY_BODY = 'お問い合わせありがとうございます。24時間以内に担当者より改めてご返信いたします。';
const label = GmailApp.getUserLabelByName(LABEL_NAME) || GmailApp.createLabel(LABEL_NAME);
const threads = GmailApp.search('is:unread -label:' + LABEL_NAME, 0, 20);
threads.forEach(function(thread) {
thread.reply(REPLY_BODY);
thread.addLabel(label);
thread.markRead();
});
}
何をしているか簡単に説明すると、まず GmailApp.search() で「未読」かつ「まだ自動返信済みラベルがついていない」スレッドを検索します。見つかったスレッドに thread.reply() で返信し、addLabel() で 自動返信済み ラベルをつけて次回以降の対象から外す。最後に markRead() で既読にします(既読にせず残す運用でも構いません)。
初回実行時、GASが「このスクリプトがあなたのGmailにアクセスする許可を求めています」と確認してきます。Googleアカウントでログインし、内容を確認して許可してください。第三者にスクリプトを触らせない、自分のGASプロジェクト内だけの話なので、ここは安心して進められます。
動いた瞬間は素直に感動しました。ただ、本当の学びはここからでした。
運用を始めてからのやらかしと学び
コピペで動いた後、実運用の中でいくつかやらかしました。同じ轍を踏まないように、時系列で白状していきます。
夫に「24時間以内にご返信いたします」と送ってしまった
最初のやらかしがこれです。検索条件が広すぎて、すべての未読メールが返信対象になっていました。私は一度だけ、夫からのメールに「24時間以内に担当者より改めてご返信いたします」と自動返信してしまったんです。笑えない失敗でした。
対策は、検索条件を厳しめにすること。GmailApp.search() の検索クエリは、普段のGmail検索窓で使う記法と同じです。
const query = 'is:unread -label:自動返信済み label:問い合わせ newer_than:1d';
const threads = GmailApp.search(query, 0, 20);
おすすめは「ラベル」と「newer_than」の組み合わせ。私は問い合わせフォーム経由のメールに自動でラベルが付くようGmail側のフィルタを設定し、そのラベルだけを対象にしています。こうすれば家族からのメールに定型文を返すような悲劇は二度と起きません。初回テスト時は本番の受信箱ではなく、テスト用のラベルを指定して動作確認することを強くおすすめします。
営業メールにまで律儀に返信していた
次に気づいたのが送信先の問題です。ショップ運営だと、同業者からの営業メールや迷惑メール紛いのものにも自動返信してしまい、かえって迷惑になります。ドメインでフィルタをかけました。
const from = thread.getMessages()[0].getFrom();
if (from.indexOf('@noreply') !== -1) return;
getFrom() で送信元を取り、noreply などが入っているアドレスにはそもそも返信しない、といった制御です。地味ですが、これで返信事故がほぼゼロになりました。noreplyのほかに、自分によく届く迷惑メールの発信元ドメインを追加しておくと、さらに安心です。
1分おきトリガーで送信上限に突っ込んだ
自動実行の設定でもやらかしました。GASエディタ左側の時計マーク(トリガー)から新規トリガーを追加するのですが、設定内容はこうです。
- 実行する関数:
autoReply - イベントのソース:時間主導型
- 時間ベースのトリガーのタイプ:分ベースのタイマー
- 時間間隔:5分おき
私は最初、張り切って1分おきに設定してしまい、GoogleのGmail送信上限に一瞬でぶつかりました。5〜10分間隔で十分です。お客さま体験としても「5分以内に自動返信が届く」なら、むしろスピード感があって好印象になります。
GASのGmailは1日100通が上限です(無料Googleアカウントの場合)。上限が心配な場合は、残数を確認しながら実行する工夫が有効です。
const remaining = MailApp.getRemainingDailyQuota();
if (remaining < 5) {
console.log('本日の送信上限に近づいています: 残' + remaining + '通');
return;
}
初回だけ出るラベルエラー
もうひとつ、初回実行時は 自動返信済み ラベルがGmailに存在しないためエラーになることがあります。コード内の GmailApp.getUserLabelByName(LABEL_NAME) || GmailApp.createLabel(LABEL_NAME) の部分で自動作成する設計にしていますが、権限許可が不完全だとここで止まります。初回は必ず手動実行して、エラーが出ないことを確認してからトリガーに任せましょう。
いま回している完成形
やらかしを乗り越えて、現在の運用はもう少し賢くなっています。
営業時間外だけ自動返信する
夜勤の日や早朝などは「◯時以降に返信します」と案内したほうが親切です。
const hour = new Date().getHours();
if (hour >= 9 && hour < 18) return;
この3行を autoReply() の先頭に入れるだけで、9時〜18時は自動返信せず、それ以外の時間帯のみ動くようになります。昼間は自分で手動返信、夜間はGASに任せる。人間とスクリプトの分業です。
返信テンプレをスプレッドシートで管理
コードに直接返信文を書くと、文面を変えるたびにGASを触る必要があって面倒です。私はスプレッドシートのA1セルに本文を書いておき、そこから読み込むようにしました。
const sheet = SpreadsheetApp.openById('スプレッドシートのID').getSheetByName('テンプレ');
const REPLY_BODY = sheet.getRange('A1').getValue();
こうしておけば、スマホのスプレッドシートアプリから文言を修正するだけでOK。夫に「文章おかしくない?」とチェックしてもらう運用も、シートを共有するだけで済むので楽ちんです。誤返信を送りつけた相手が、いまでは校正係というオチでした。
設定内容の早見メモ
作業前にこの表を見ながら進めると、スムーズに設定できます。
| 項目 | 内容 |
|---|---|
| 開発環境 | script.google.com(無料・ブラウザのみ) |
| 基本コード | 10行でコピペ可能 |
| 自動実行 | 時間主導型トリガー(5〜10分おき) |
| 二重返信防止 | ラベルで状態管理 |
| 応用 | 営業時間フィルタ・スプシテンプレ管理 |
| 注意点 | 検索条件を絞る・送信上限100通 |
流れとしては、script.google.com で新規プロジェクトを作り、10行のコードをコピペしてラベル名と本文を書き換え、時間主導型トリガーを5〜10分おきにセットする。慣れてきたら営業時間フィルタやテンプレのシート管理で運用を洗練させていく、という順番です。運用が始まったら、GASの「実行数」タブでたまに動作状況を見ておくと安心ですよ。
あの朝から変わったこと
この仕組みを入れてから、問い合わせの一次返信にかけていた時間はほぼゼロになりました。夜勤前に5分でセットアップしておけば、夜勤中に問い合わせが届いても、翌朝には自動返信済みになっています。
数字よりうれしいのは、夜勤明けの「メール溜まってるプレッシャー」から解放されたこと。仮眠から起きて受信トレイを開くときの、あの胃がきゅっとなる感じがなくなりました。冒頭の6件キャンセル事件のような朝は、あれ以来一度もありません。
「GAS Gmail 自動返信」でつまずいている方の、最初の一歩になれば嬉しいです。うまくいかなかった箇所があれば、気軽にコメントで教えてくださいね。
関連記事
- GASでフォーム送信者へ自動返信メールを送る — フォームと組み合わせた自動返信の応用版
- GASでGmailを差し込みメールでテンプレ化 — 顧客リストからの一括送信
- Gmail添付ファイルをGoogleドライブ自動保存する — 請求書PDFの自動整理
- GASでSlack通知を送る最短レシピ — メールと組み合わせた通知設計
この記事を書いた人:凛
2児2児のママで現役ナース。夜勤明けの細切れ時間を副業GASに投じ、月5〜8万円の副収入を継続中。「看護師でもコードは書ける」を合言葉に、家事育児とプログラミングを両立する等身大の情報を発信しています。掲載コードは構文・API仕様・ロジックを確認のうえ掲載していますが、実行環境での最終確認はご自身でお願いします。Gmail APIの仕様変更は公式ドキュメントで最新情報をご確認ください。