LoginSignup
0
1

More than 3 years have passed since last update.

宛先ごとに本文をカスタムしたメールをGoogle Apps Script( javascript )で一括送信する

Last updated at Posted at 2020-12-23

背景

アカウント名やパスワードを一括配布する機会があったので、GAS(Google Apps Script)で実施しました。

処理の概要

下記のスプレッドシートの情報を基に一括メール送信します。
シート名は「スクリプト用データ」です。
image.png

完了フラグがcompletefailprocessing以外のみ、メールの送信対象となります。
送信後は完了フラグ列を自動で更新します。

処理の流れ

① スプレッドシートからデータを取得する
② ①のデータを基にメール送信に必要なデータを作成する
③ ②で作成したデータを使いメール送信する
④ シートを更新する
以上です。

メール送信に失敗した場合のエラーハンドリングでは、送信者にメール通知します。

ソースコード

▼メール送信

main
function main() {
    //申請者向けメール本文;
    const EMAIL_BODY_PREFIX = "お疲れ様です。\n下記があなたのアカウントです。\n";
    const EMAIL_BODY_SUFFIX = "\n以上になります。よろしくお願いします。";
    //スプレッドシート操作クラス;
    const sheetDataManager = new SheetDataManager();
    //メール送信対象情報を一括取得;
    const sheetData = sheetDataManager.getSheetData();
    //メール送信対象分メールを送信する
    sheetData.forEach((item) => {
        try {
            //スプレッドシートの「送信完了」フラグ更新
            sheetDataManager.updateProcessingStateFlag(item.get("No."),"processing");
            MailApp.sendEmail({
                to: item.get("宛先"),
                cc: item.get("cc"),
                bcc: item.get("bcc"),
                subject: "アカウントの通知",
                body:item.get("宛先名") + EMAIL_BODY_PREFIX + item.get("アカウント") + EMAIL_BODY_SUFFIX,
            });
            //スプレッドシートの「送信完了」フラグ更新
            sheetDataManager.updateProcessingStateFlag(item.get("No."),"complate");
        } catch (e) {
            //スプレッドシートの「送信完了」フラグ更新
            sheetDataManager.updateProcessingStateFlag(item.get("No."),"fail");
            MailApp.sendEmail({
                to: item.get("送信者"),
                subject: "エラー発生報告",
                body: "No." + item.get("No.") + " でエラーが発生しました。",
            });
        }
    });
}

▼スプレッドシートデータ操作クラス

SheetDataManager
class SheetDataManager {
    constructor() {
        //スプレッドシート取得
        this.spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
        this.sheet = this.spreadsheet.getSheetByName("スクリプト用データ");
    }

    //メール送信対象情報を一括取得
    getSheetData() {
        const sheetData = new Array();
        //入力のある最終行数
        const lastRow = this.sheet.getLastRow();
        //スプレッドシートの行数分繰り返す
        for (let i = 2; i <= lastRow; i++) {
            //スプレッドシートから完了フラグを取得
            const flag = this.sheet.getRange(i, 8).getValue();
            //メール送信が未完了の対象を配列に追加する
            if (flag != "complete" && flag != "fail" && flag != "processing") {
                //配列に追加する前にMapにまとめる
                const singleSheetData = new Map();
                //メール本文作成
                const userName = this.sheet.getRange(i, 5).getValue() + "さん";
                const account = this.sheet.getRange(i, 7).getValue();
                //Mapにまとめる
                singleSheetData.set("宛先名", userName);
                singleSheetData.set("アカウント", account);
                singleSheetData.set("No.", this.sheet.getRange(i, 1).getValue());
                singleSheetData.set("宛先", this.sheet.getRange(i, 2).getValue());
                singleSheetData.set("cc", this.sheet.getRange(i, 3).getValue());
                singleSheetData.set("bcc", this.sheet.getRange(i, 4).getValue());
                singleSheetData.set("送信者", this.sheet.getRange(i, 6).getValue());
                //Mapを配列に追加
                sheetData.push(singleSheetData);
            }
        }
        //メール送信が未完了の対象を追加した配列を返す
        return sheetData;
    }

    //スプレッドシートの「送信完了」フラグ更新
    updateProcessingStateFlag(num,flag) {
        this.sheet.getRange(num + 1, 8).setValue(flag);
    }
}

蛇足

実際はメール本文のカスタマイズがもう少しだけ複雑でしたが省きました。

javascriptの書き方でおかしなところがあれば教えていただきたいです。
短時間で作成したコードですが、問題なく動作しますので、何かの参考にしていただければと思います。

0
1
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
0
1