皆さん、Gmailって使ってますか?

結構カンタンだし、メールの管理画面は見やすいし…、Gmailは使いやすいので渡される名刺にもgmail.comはよく見かけるようになりました。

ただ、メールは何気なく送ってしまいますが、朝が早すぎたり、夜が深すぎたり…。

「そんな時間に送ることはちょっと抵抗がある…。」なんて方も多いでしょう。

メールは時間を気にしなくて良いと言われてますが、受信すれば音が鳴ったり、バイブレーションで振動したりと、まだ寝ている時間帯の受信は非常にウザったい!
※そういうのを防止するおやすみモードは相手側の設定なので、強要できませんよね

Outlookなどでは予約自動送信はできますが、使われる機会が多くなった『Gmail』などのフリーメールには予約自動送信機能はありません。

しかし、「Gmailで予約自動送信機能が欲しい!

そんな声を聞いたのでGmailにアドオンなしで予約送信機能を追加してみたいと思います。

アドオンを使わない理由は?

アドオンを使うと比較的簡単に予約自動送信できます。

アドオンというのは、簡単に言うとインターネットを閲覧する際に使うブラウザに付加機能を付けることです。

Google Chromeなどではアドオンをインストールし、機能を増やすことが可能です。その中に予約自動送信機能があります。

ただ、これが公共の場所であったり、会社のパソコンではインストール自体がそもそも規制されていて使えないこともあります。

しかし、今回の方法はどこでも可能!
パソコンが違ったとしても使うことができます!

予約自動送信の準備:Googleスプレットシートでスクリプトを組む

スクリプト(プログラムみたいなもんです)を組むとかめっちゃ大変そう!」とか思うかもしれませんが、大丈夫です。

なんとコピペするだけです。

何をしたいかというとGoogleスプレットシートにリストを作って、Gmailに下書きしてあるメールをスクリプトを使って時間通りに自動で送信しちゃおうってことです。

Googleスプレットシートにログイン

まずはGoogleスプレッドシートの作成画面に入りましょう。

GoogleスプレッドシートはGoogleが提供するExcelのような表計算を行える無料のクラウドアプリケーションです。

今回はこちらのスクリプトを利用し、下書きされたGmailを自動的に送信できるようにプログラムを組みます。
※何度も言いますが、コピペだけなんでご安心を。

右下の+マークを押す

Googleスプレッドシートを新規作成するのに右下の+マークを押しましょう。

アミットAGARWALのソースコードをコピーする

アミットAGARWALに行って、背景が黒くなっている面があるので、1〜88行目までコピーしましょう。
Gmail予約送信:コードをコピーしよう
中身を理解する必要はありません。

ちなみにGoogle Chromeを使っていると自動翻訳されてしまうので、原文表示を行ってからコピーしてください。
Gmail予約送信:Google Chrome原文を表示する

下記に同じコードを用意しておきました。こちらはバックアップとして残しておきますので、もし、リンク先がうまく見れないなどの場合はこちらからコピーしてください。

/* Written by Amit Agarwal of labnol.org */
function initialize() {
    /* Clear the current sheet */
    var sheet = SpreadsheetApp.getActiveSheet();
    sheet.getRange(2, 1, sheet.getLastRow() + 1, 5).clearContent();
    /* Delete all existing triggers */
    var triggers = ScriptApp.getProjectTriggers();
    for (var i = 0; i < triggers.length; i++) {
        if (triggers[i].getHandlerFunction() === "sendMails") {
            ScriptApp.deleteTrigger(triggers[i]);
        }
    }
    /* Import Gmail Draft Messages into the Spreadsheet */
    var drafts = GmailApp.getDraftMessages();
    if (drafts.length > 0) {
        var rows = [];
        for (var i = 0; i < drafts.length; i++) {
            if (drafts[i].getTo() !== "") {
                rows.push([drafts[i].getId(), drafts[i].getTo(), drafts[i].getSubject(), "", ""]);
            }
        }
        sheet.getRange(2, 1, rows.length, 5).setValues(rows);
    }
}
/* Create time-driven triggers based on Gmail send schedule */
function setSchedule() {
    var sheet = SpreadsheetApp.getActiveSheet();
    var data = sheet.getDataRange().getValues();
    var time = new Date().getTime();
    var code = [];
    for (var row in data) {
        if (row != 0) {
            var schedule = data[row][3];
            if (schedule !== "") {
                if (schedule.getTime() > time) {
                    ScriptApp.newTrigger("sendMails")
                        .timeBased()
                        .at(schedule)
                        .inTimezone(SpreadsheetApp.getActiveSpreadsheet().getSpreadsheetTimeZone())
                        .create();
                    code.push("Scheduled");
                } else {
                    code.push("Date is in the past");
                }
            } else {
                code.push("Not Scheduled");
            }
        }
    }
    for (var i = 0; i < code.length; i++) {
        sheet.getRange("E" + (i + 2)).setValue(code[i]);
    }
}
function sendMails() {
    var sheet = SpreadsheetApp.getActiveSheet();
    var data = sheet.getDataRange().getValues();
    var time = new Date().getTime();
    for (var row = 1; row < data.length; row++) {
        if (data[row][4] == "Scheduled") {
            var schedule = data[row][3];
            if ((schedule != "") && (schedule.getTime() <= time)) {
                var message = GmailApp.getMessageById(data[row][0]);
                var body = message.getBody();
                var options = {
                    cc: message.getCc(),
                    bcc: message.getBcc(),
                    htmlBody: body,
                    replyTo: message.getReplyTo(),
                    attachments: message.getAttachments()
                }
                /* Send a copy of the draft message and move it to Gmail trash */
                GmailApp.sendEmail(message.getTo(), message.getSubject(), body, options);
                message.moveToTrash();
                sheet.getRange("E" + (row + 1)).setValue("Delivered");
            }
        }
    }
}

Googleスプレットシートにて、スクリプトエディタを選択

Googleスプレッドシートに戻り、スクリプトエディタを開きましょう。
Gmail予約送信:スプレッドシートのスクリプトエディタを選ぶ

空のプロジェクトを選択

スクリプトはGoogleスプレッドシートとは別に作成することになります。
空のプロジェクトを選択しましょう。

この画面が出ない時もあるようです。
出なかったら次へ行ってください。

すでに書かれているコードを全部選択して、さきほどのコードを貼り付けましょう

さきほど1〜88行目までコピーした文章をここに貼り付けます。

すでにコードが書かれていると思いますが、残っているとエラーになってしまうので、全て選択した上で貼り付けしましょう。
Gmail予約送信:コードの貼り付け

コードを書き終わったら、保存を忘れずに行いましょう!
これを忘れると起動しません。

プロジェクト名を入れましょう。

プロジェクト名ってのはGoogleスプレットシートの名前です。何でもOKです。あとからでも変えられます。
Gmail予約送信:プロジェクト名作成
これで準備は完了です。

予約自動送信の実行:Googleスクリプトを利用して、下書きしてあるメールを自動的に送信する

さて、ここからが本番です。実際にメールを作成して、自動送信の設定にしましょう。

Gmailで下書きメールを作成する

まずはGmailにログインして、メールを作成しましょう。

メールを作成します。
作成したら✕ボタンを押して下書き状態にしましょう。

当たり前ですが送信ボタン押しちゃうと送信されちゃいますので気をつけてくださいね。

複数人宛に送信したい場合は、下書きの時点で通常の宛先(To)だけじゃなく、その他の宛先(CC)や、メルアドを隠した宛先(BCC)にメールアドレスを入れておけば複数送信可能です。

ただし、スプレッドシートの送信先アドレスのところにはToだけが表示されます。

↓下書きが出来上がるとこうなります。↓
Gmail予約送信:下書き画面
下書きの状態で保存してあるってことが重要です!

Googleスクリプトエディタにて自動予約送信プログラムの確認を行う

これがスクリプト実行のボタンです。実行→Initializeを押しましょう。
しかし、最初は承認がいろいろ必要です。

[許可を確認]を押して、
Gmail予約送信:承認する

アカウントを選択します。
Gmail予約送信:アカウントの選択

「このアプリは確認されていません。」
という画面が出てきてしまった場合は、[詳細]を押して

[プログラム名(安全ではないページ)に移動]を選択して、無理矢理進みましょう!

なぜこんな警告が出るのでしょうか?

Googleが確認していないインターネットで拾ってきたようなコードの中には安心できないコードが含まれていることもあります。安心・安全なコードだと確認できているコードだけ進むようにしましょう。

最後はプログラムを[許可]しましょう!

これはスクリプトがメールを使えて、スプレットシートを使えて、自分がパソコンとか開いてなくても勝手に実行することの許可です。

一回許可すれば次の実行の時には聞かれません!

スプレットシートに予約表を作ろう

プログラムが許可されるとこのような状態になってると思います。これは先程の下書きのデータが反映されたものです。
Gmail予約送信:下書き一覧
下書きは2行目から反映されます。
1行目は何にも入ってないので適当に入れても、入れなくてもOKです。一応左から説明すると…

  • 送信メールID
  • 送信先のアドレス
  • 送信メールの題名
  • メールを送信する時間
  • 送信ステータス(宛先不明、下書きメールがない、送信待ち、送信したなどが分かります)

このままではいつ送信していいかが分かりませんので、メールを送信する時間を入力して予約送信できるようにしましょう!

2015/01/01 01:00:00
(年/月/日 何時:何分:何秒)[/box]

で時間を決めましょう。

こんな感じになるハズです。
ステータスがScheduledになっていれば自動送信待ちです。あとは時間になったら勝手に送信されます。

もしステータス反映がされなかった場合!

どうやらステータスが反映されないこともあるらしいので、そんな時はもう一度スクリプトエディタを開いて、setScheduleを選択しましょう。
Gmail予約送信:SETSchedule

これで反映されます。

ちなみに送信されると
Gmail予約送信:delivery
Deliveredってステータスに変わります。

Gmailを見ると実際に下書きメールが送信されていると思います。
Gmail予約送信:下書きメール送信

この記事を見て試していただいた方からメールで署名が一行で入ってしまったが、プレーンテキスト(フォントサイズや、フォントカラーを使わないテキスト)にしたら改善したと報告がありました。

もし、署名が変だったらリンクだけにしてみましょう。

まとめ

準備が結構大変と感じるかもしれませんが、一度作ってしまえば、あとは楽になります。
何よりもコピペだけでできるのはラクチンですね。

メール送信しようと思って、「時間が遅いから〜」となるとどうしても忘れがちになっちゃいますよね。

そんな時に便利なのでぜひやってみてくださいね。

ちなみにGmailとスプレッドシートはアカウントに紐付いています。(当たり前ですが)
複数アカウントをまたいで予約送信を行いたい場合は、それぞれのアカウントで予約自動送信プログラムを作ってくださいね。

Gmailで会社ドメインの独自メールアドレスを使用しているという方はこちらからさらに設定してみてください!