Help us understand the problem. What is going on with this article?

Google Apps ScriptでGmailからメールを自動送信してみる [初級編]

まずはじめに

もし気に入っていただけたり、役に立ったらぜひ ”いいね!” お待ちしております!
投稿のモチベーションに繋がります^^¥

この記事の目的

Google Apps Script(GAS)を使って、スプレッドシートの列に記載されているメールアドレスに定型文を自動送信します。

image.png

Google Apps Script(GAS)とは

Googleが提供するサーバーレスのプログラミング環境です。略称でGASとよく呼ばれます。ちなみに発音は、ガ(↓)ス(↑)。

Googleが提供する11のサービスをクラウド上でスクリプトを実行することで操作できるサービスで、
スクリプトの言語は、JavaScriptをベースとしています。

「Excelのマクロと同じ」と言われることもありますが、これは正しくありません。
スプレッドシートだけを操作する場合は、Excelのマクロと似ていますが、Google Apps Scriptはより幅広い用途に使用できます。

  • カレンダー
  • コンタクト
  • ドライブ
  • ドキュメント
  • スプレッドシート
  • フォーム
  • Gmail
  • グループ
  • マップ
  • サイト

スクリプトを組み合わせることで、

  • 毎朝8時にGmail起動し、Googleカレンダーの予定をテキストで特定のアドレスに送信する
  • Googleカレンダーに登録されている特定期間のスケジュールを抽出する
  • WebAPIを返す

などなど、できちゃいます。(便利そうじゃないですか?)

Google Apps Scriptを使ってみよう

まず、適当なスプレッドシートを作成しましょう。

ツール -> スクリプトエディタ でエディタが開きます。

image.png

こいつのシート名は、シート1(デフォルト)のままです。
image.png

初期のエディタ画面はこんな感じ。
よく使うボタンは赤文字で書いています。
一般的には時計アイコンでトリガーを設定し、
時刻になったらメールを送信する
スプレッドシートに書き込みがあったら送信する

などの使い方をします。

function '関数名'{}の大カッコのなかにプログラムを書いていきます。

image.png

サンプルスクリプト

変数ssに、シート1がシート名のアクティブなスプレッドシートを取得させます。

var ss = SpreadsheetApp.getActive().getSheetByName('シート1');

変数today、送信時間をメールテキストで表現できるよう、フォーマットします。

var today = Utilities.formatDate(new Date(), 'JST', 'yyyy年M月d日 H時m分s秒');

変数MailTitleに、メール件名を定義します。

var MailTitle = 'hogehoge'

スプレッドシートの最終行まで取得します。
変数lastlowに定義します。

var lastRow = ss.getLastRow();

for文で処理を繰り返します。i=2なので、(i, 3)はスプレッドシートの2行3列目、つまり送信対象のセル列を参照しています。
それを、i<=lastRowで最終列まで指定し、i++で1行ずつ回しています。

for(var i=2; i<=lastRow; i++){
    if (ss.getRange(i, 3).getValue() == "送信対象"){
      var rangeA = ss.getRange('A' + i).getValue(); //送信対象のA列を最終行まで取得していく。それを ' rangeA ' という変数に格納
      var rangeB = ss.getRange('B' + i).getValue(); //送信対象のB列を最終行まで取得していく。それを ' rangeB ' という変数に格納

メール本文を変数MailTextに定義します。
引数として、rangeB(シートだとName部)today(フォーマットした時間)をとっています。

var MailText = rangeB+"さん"+"\n\nお疲れ様です。\n本日"+today+"時点でのメールを送ります。\n";

GmailAppを呼び出します。
呼び出しにはGmailApp.sendEmail(宛先, 件名, 本文)というように記載します。

rangeAにはシート部でいうメールアドレスを指定し、後にメール件名(MailTitle)メール本文(MailText)を引数で指定しています。

GmailApp.sendEmail(rangeA,
                   MailTitle,
                   MailText)

スクリプト全体

function SendMail(){
  // 対象のシートを指定
  var ss = SpreadsheetApp.getActive().getSheetByName('シート1');

  // 送信時間をメールテキストで表現できるよう、フォーマット
  var today = Utilities.formatDate(new Date(), 'JST', 'yyyy年M月d日 H時m分s秒');

  // メールタイトルを変数で定義
  var MailTitle = "hogehoge";

  // スプレッドシートの最終行まで取得。よく使う
  var lastRow = ss.getLastRow();

  // 繰り返し処理を実施
  for(var i=2; i<=lastRow; i++){
    if (ss.getRange(i, 3).getValue() == "送信対象"){
      var rangeA = ss.getRange('A' + i).getValue(); //送信対象のA列を最終行まで取得していく。それを ' rangeA ' という変数に格納
      var rangeB = ss.getRange('B' + i).getValue(); //送信対象のB列を最終行まで取得していく。それを ' rangeB ' という変数に格納

      // メール本文を変数で定義。rangeBの変数は送信時の宛名を入れておく
      // todayは送信時の日付と時間を表現させる
      var MailText = rangeB+"さん"+"\n\nお疲れ様です。\n本日"+today+"時点でのメールを送ります。\n";
    }


    GmailApp.sendEmail(rangeA,
                       MailTitle,
                       MailText)
  }
}

実行権限の許可

実行ボタンからメールを送信しようとすると、初回操作なので承認を求められます。
許可を確認を押下し、スクリプトの実行を許可します。

image.png

マスクしていますが、スクリプトの実行を許可させるGoogleアカウントを選択します。
image.png

詳細を押下し、赤枠のページに遷移します。
Gmail送信(安全ではないページ)に移動します。
表現がかなり危険そうですが...まあ大丈夫です。
image.png

許可 を押下します。
Googleからセキュリティ通知が来ると思いますが、大丈夫です。
image.png

スプレッドシートの状態

以下の通り、tnoceジョンを宛名にして、それぞれのメールアドレスに
件名:hogehoge
本文:rangeB+"さん"+"\n\nお疲れ様です。\n本日"+today+"時点でのメールを送ります。\n"
のメールが届けば成功です。

image.png

メール送信を実行していく

許可が済んだところで、では実行していきます。
を押下ください。

image.png

tnoce側

image.png

ジョン側

image.png

ちゃんと届いたようです!!

トリガーを作る

気が変わったので、トリガーを作成しましょう。笑
赤枠のアイコンから作成できます。

image.png

初期の状態だと当然なにもトリガーがありません。画面右下のトリガー追加から追加しましょう。
image.png
image.png

今回は時間主導型毎週月曜日PM1時〜2時の間にメールが送信されるようにトリガーを作ります。
関数は、先程作成したSendMailを指定しています。選択が完了したら保存を押します。
image.png

無事トリガーが作成されました。
これで、毎週月曜日PM1時〜2時の間にメールが送信されるようになりました。
image.png

最後に

今回は、汎用的に使えるGmailの自動送信をご紹介しました。
プログラムに慣れている人からは簡単だったのではないでしょうか。

タイムトリガーやイベントトリガーと組み合わせることによって、もっと便利に使えるので、いろいろ試してみてください。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away