3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

今回はスプレッドシートで自動メール送信の実装をします。

事前準備

スプレッドシート

スクリーンショット 2020-12-14 12.29.09.png
スプレットシートの1行目は項目行とします。
A列「名前」
B列「メールアドレス」
C列「件名」
D列「メッセージ」
E列「送信確認」

内容を記述

スクリーンショット 2020-12-14 12.32.28.png

スクリプトエディタを開く

ツール > スクリプトエディタ
を選びます。

コーディング

以下のコードを書きます。

function sendEmails() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var EMAIL_SENT = "送信済み";
  var lastrow = sheet.getLastRow();
  var lastcolumn = sheet.getLastColumn();
  var dataRange = sheet.getRange(2,2,lastrow-1,lastcolumn-1)
  var data = dataRange.getValues();
 for (var i = 0; i < data.length; ++i) {
    var row = data[i];
    var emailAddress = row[0]; //B列
    var message = row[2]; //D列
    var emailSent = row[3]; //E列
  if (emailSent != EMAIL_SENT) { 
   var subject = row[1];//C列
    MailApp.sendEmail(emailAddress, subject, message);
    sheet.getRange(2 + i,lastcolumn).setValue(EMAIL_SENT);
    SpreadsheetApp.flush();
      }
    }
 }

説明

それでは、コードの中身について見てみましょう。

//スプレッドAppを呼出し
  var sheet = SpreadsheetApp.getActiveSheet();  //アクティブなシートを取得
  var EMAIL_SENT = "送信済み"; 
  var lastrow = sheet.getLastRow(); //シートに記載されている最終行を取得
  var lastcolumn = sheet.getLastColumn();
  var dataRange = sheet.getRange(2,2,lastrow-1,lastcolumn-1)
  var data = dataRange.getValues();

var sheet = SpreadsheetApp.getActiveSheet();
これは、今開いているシートを取得するという意味です。

var lastrow = sheet.getLastRow();
スプレッドシートの最終行を取得するGoogle Apps Script(GAS)の方法として、getLastRowメソッドが用意されています。

このメソッドを使うとシート内のセルを調べ、データが入っているセルの最終行を教えてくれます。

var lastcolumn = sheet.getLastColumn();
getLastColumn()でシートに記載されている最終列が取得することができます。getLastRow()と併せて使えば最終セルの取得も可能になります。

var dataRange = sheet.getRange(2, 2, lastrow-1,lastcolumn-1)
2行目2列目から最後の行と列まで選択します。
スクリーンショット 2020-12-14 12.01.17.png
var data = dataRange.getValues();
range.getValuesは、値を二重配列で取得します。この場合上画像のピンクで囲まれている範囲の値を取得してきます。


 for (var i = 0; i < data.length; ++i) {
    var row = data[i]; //行を選択
    var emailAddress = row[0]; //B列(メールアドレス)
    var message = row[2]; //D列(本文)
    var emailSent = row[3]; //E列 
  if (emailSent != EMAIL_SENT) { // '送信済み'有無の確認
  // `送信済み`がない時
   var subject = row[1]; //C列(件名)
    MailApp.sendEmail(emailAddress, subject, message); //メール送信
    sheet.getRange(2 + i,lastcolumn).setValue(EMAIL_SENT); 
    SpreadsheetApp.flush(); //// 変更内容を即反映
      }
    }

送信済みと書かれていない行のメールを一斉送信します。

getRangeの引数について

var range = sheet.getRange(1, 4);の場合
1行4列の範囲を指定。

sheet.getRange(2 + i,lastcolumn).setValue(EMAIL_SENT);
E列に送信済みを記入します。

プログラム実行

虫マークをクリックします。すると、
このアプリは確認されていませんというメッセージが出てきます。画像のように詳細を選択しましょう。
スクリーンショット 2020-12-14 10.35.38.png

アコーディオンが開きます。赤で囲んだ(自分で名前をつけたスクリプトエディタ)に移動を選択。
スクリーンショット 2020-12-14 10.36.00.png

このような画面になるので、ここの画面で許可を選択しましょう。
スクリーンショット 2020-12-14 10.36.16.png

元のスクリプトエディタに戻るので、虫マーク -> 三角マークをクリックして、プログラムを実行しましょう。

メールの送信が済んだら送信確認列に送信済みと表示されるので、再度送信する場合は送信済みの文字列を削除すれば大丈夫です。

プログラムを定時に実行する

スクリーンショット 2020-12-14 14.05.46.png
この時計マークをクリックします。
すると、以下のような画面に切り替わると思います。
スクリーンショット 2020-12-14 14.03.12.png
右下のトリガーを追加をクリックします。
スクリーンショット 2020-12-14 12.46.24.png
イベントのソースを選択で、
時間手動型を選択します。
時間ベースでプログラムを実行したい場合は、
時間ベースのタイマーを選択します。他にも分ベース、日ベース、週ベースで設定することもできるので、自分に合った時間設定を選びましょう。

時間ベースの場合、最後に間隔を選択します。
これらを設定したら、プログラムが自動で実行されるでしょう。


お疲れ様です。
以上で、スプレッドシートから自動でメールを送信するコードの解説を終了します。
ここまでご覧いただき、ありがとうございました。

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?