見出し画像

【生成AI×GAS】部署名・氏名の差し込みメール解説②

オレンジピーチのトシです。
今回は、引き続き、スプレッドシートのリストに従って、本文中の部署名や宛先氏名を変更してメールを送るGASの解説を行います。
(前回解説の記事はこちら)

作成したGASのおさらい

解説を進めているGASがこちらです。
前回の解説で前半部分の解説が終わりましたので、今回は”各メールアドレスにメールを送信”の箇所から、解説を進めていきます。

function sendEmail() {
  // スプレッドシートを開く
  var sheet = SpreadsheetApp.getActiveSheet();

  // A列2行目から最終行までの氏名を取得
  var nameRange = sheet.getRange("A2:A" + sheet.getLastRow());
  var nameList = nameRange.getValues();

  // B列2行目から最終行までのメールアドレスを取得
  var emailRange = sheet.getRange("B2:B" + sheet.getLastRow());
  var emailList = emailRange.getValues();

  // C列2行目から最終行までの部署名を取得
  var departmentRange = sheet.getRange("C2:C" + sheet.getLastRow());
  var departmentList = departmentRange.getValues();

  // 現在の日付を取得
  var today = new Date();
  var year = today.getFullYear();
  var month = today.getMonth() + 1; // 月は0始まりなので、+1する

  // 件名を設定
  var subject = `月次進捗ファイル(${year}${month}月度)の更新依頼`;

  // 各メールアドレスにメールを送信
  for (var i = 0; i < emailList.length; i++) {
    var recipient = emailList[i][0];
    var name = nameList[i][0];
    var department = departmentList[i][0];

    // 本文を設定
    var body = "";
    body += "株式会社オレンジピーチ \n";
    body += "\n";
    body += `${department}${name} 様\n`;
    body += "おつかれさまです。\n";
    body += "企画部の橙桃です。\n";
    body += `${year}${month}月度の月次進捗ファイルの更新をお願いいたします。\n`;
    body += "締切は、**7月25日**となります。それまでに、リンクの月次進捗表を更新して下さい。\n";
    body += "\n";
    body += `${department}${name} 月次進捗ファイル\nURL: ********\n`;
    body += "\n";
    body += "どうぞよろしくお願いします。";

    MailApp.sendEmail({
      to: recipient,
      subject: subject,
      body: body
    });
  }
}

GASの内容解説②

各メールアドレスにメールを送信する設定が行われていきます。

// 各メールアドレスにメールを送信
for (var i = 0; i < emailList.length; i++) {
var recipient = emailList[i][0];
var name = nameList[i][0];
var department = departmentList[i][0];

for (初期化式; 条件式; 更新式)

for文を用いて記載が行われています。1行目はfor文の条件式などが記載され
ています。

for (var i = 0; i < emailList.length; i++) {

基本的なfor文の構文は次のようなものです。

//基本的なfor文の構文
for (初期化式; 条件式; 更新式) {
 // 繰り返し実行する処理(ループの本体)
}

for文の説明

実際のコードに当てはめてみると・・・。
まず、i の初期値として 0 から始まります。
そして、i の値が emailList.length の値よりも小さい場合に、本体の処理が行われます。
emailList.length とは、変数 emailList の中に格納されている配列の個数のことです。
変数 emailList はスプレッドシートのB2セルからデータのある最下段までの値を取得しているので、emailList.length は「3」となります。
つまり、データの個数分、ループ本体の処理が行われる訳です。

ループの本体

続いて、ループ本体の記載になります。

var recipient = emailList[i][0];

左辺は、変数 recipient を宣言する宣言文です。
右辺には、変数 emailList があります。
ここで、変数 emailList の中身を確認してみましょう。
スプレッドシートからgetValues メソッドで値を取得したところで、console.logを用いて、変数のログを表示します。

変数 emailList のログを表示する

変数の中身は二次元配列であることが分かります。
(二次元配列について詳しく知りたい人は、こちらの記事をご覧ください)

次に、配列からインデックスを用いて値を取り出します。
先ほどの、配列 emailList から最初の一次配列の、最初の値を取り出します。
最初のインデックスは [0] ですので、emailList[0][0] とすることで、値を取り出すことが出来ます。
つまり、配列の先頭のメールアドレスを1つ変数 recipient に格納することが出来ました。

emailList[0][0] のログを表示する

emailList[0][0]  ⇒ aomori***@gmail.com
同様に、インデックスを変更することで、配列からそれぞれのメールアドレスを取り出すことが出来る
emailList[1][0] ⇒ akita***@gmail.com
emailList[2][0] ⇒ yamagata***@gmail.com

次の行の解説です。ここでは、配列 nameList からインデックスを用いて、
[i (=0) ][0] の値を取り出しています。つまり、1つ目の氏名を、変数 name に格納しています。

var name = nameList[i][0];

続いての行でも同様に、配列 department からインデックスを用いて、
[i (=0) ][0] の値を取り出しています。つまり、1つ目の部署名を、変数 department に格納しています。

var department = departmentList[i][0];

ここまでのコードで、配列から、変数 recipient にメールアドレス、変数 name に氏名、変数 department に部署を格納することが出来ました。

ここまでのまとめ

今回は、for文の使用に向けて、各変数に配列から指定の値を取得する部分の解説を行いました。
次回は、一番のポイントである本文の解説を行いたいと思います。

今回は以上です。最後まで読んで頂き、ありがとうございました。
記事の内容が参考になった方は、「スキ」して頂けると励みになります。



この記事が少しでもお役に立てたのなら、サポートいただけると嬉しいです。頂いたご支援は、今後の活動費やコンテンツの質向上に使わせていただきます。