각 수신처에 본문을 맞춤 설정한 이메일을 Google Apps Script(javascript)로 일괄 전송

배경



계정 이름과 비밀번호를 일괄 배포할 기회가 있었으므로 GAS(Google Apps Script)에서 실시했습니다.

처리 개요



아래 스프레드 시트의 정보를 바탕으로 일괄 메일을 보냅니다.
시트 이름은 "스크립트 데이터"입니다.


완료 플래그가 complete전송 후 완료 플래그 열을 자동으로 업데이트합니다.

처리 흐름



① 스프레드시트에서 데이터 검색
② ①의 데이터를 바탕으로 메일 송신에 필요한 데이터를 작성한다
③ ②에서 작성한 데이터를 사용하여 메일 송신
④ 시트를 갱신한다
이상입니다.

메일 전송에 실패한 경우의 오류 처리는 발신자에게 메일 통지합니다.

소스 코드



▼ 메일 송신

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);
    }
}

뱀발



실제로는 메일 본문의 커스터마이즈가 좀 더 복잡했지만 생략했습니다.

자바 스크립트를 작성하는 방법으로 이상한 점이 있으면 알려주십시오.
단시간에 작성한 코드입니다만, 문제 없게 동작하므로, 뭔가의 참고로 해 주시면 좋겠습니다.

좋은 웹페이지 즐겨찾기