Google Apps Script (GAS) で、レポートメールの自動送信（メール誤送信防止策）

[前回](https://qiita.com/YokohamaHori/items/0391f02ff6cad75dfb57)に続いて、またまたバッチシリーズです。

セキュリティ事故の大半はメール誤送信と言われ続けながらも、月一のレポートはPDFにしてメールで送らなければいけない私。
定型のレポートメールを送るたびに誤送信を恐れるぐらいなら、バッチにして早く、安全、確実に自動送信してしまいましょう。

ということで、レポートメールの自動送信バッチを作ったので紹介します。

※初めてのGASなので間違いがあればご指摘頂けると幸いです。


# 前提

* Gmail, Google ドライブ を利用
    * もちろんGoogleアカウントが必要
* バッチは Google Apps Script で作成
* レポート内容は月末に PDF でメールに添付
    * PDF は当月中（月末）に作成する
    * PDF は Google ドライブ に配置
* メール内容は固定
    * 送信先とメール本文は固定
    * 件名と添付ファイル名の末尾には年月を入れる


# レポートメール送信手順
1. レポートをPDFで作成
1. Google ドライブ の送信用フォルダにPDFをコピー
1. Google Apps Script でスクリプトを実行
1. メール送信が完了したら、レポートファイルが送信済みフォルダに移動されていることを確認
1. 念のために Gmail で送信済みメールを確認

毎月の定型作業がたったこれだけで（早く、安全、確実に）終わるのですから、楽ちんですね。

**備考**

* 送信用フォルダにコピーするファイル名はスクリプトでリネームするので、名前は何でも構いません
* 【注意】送信用フォルダに配置するファイルは一つだけにしてください
* 最初のスクリプト実行時には許可を求められるので「許可を確認」を選択してください
    * [Gmailでメールを送るスクリプトを実行する](https://tonari-it.com/gas-gmail-sendemail/)


# スクリプト作成手順
1. Google ドライブ に送信用フォルダと完了用フォルダを作成
    * 送信用：ex) "01_Ready_For_Sending_Report"
    * 完了用：ex) "02_Finished_Sending_Report"
    * フォルダ名は何でも構いません（後から変更しても大丈夫です）
1. 上記のフォルダIDを取得（あとでScriptに貼り付けます）
    * フォルダIDの取得方法は以下を参考にしてください
        * [フォルダIDとは](https://qiita.com/beckyJPN/items/2ff74d5d13322b95a34e#フォルダidとは)
1. Google Apps Script でスクリプトを作成
    * スクリプトの作成方法は以下を参考にしてください
        * [Google Apps Scriptの始め方](https://anagrams.jp/blog/google-apps-script/)
    * スクリプトエディタに以下の[Script](## Script)をコピーして、必要な箇所を自分用に書き換えてください
        * 送信用フォルダID
        * 完了用フォルダID
        * リネーム後のファイル名（のプレフィックス）
        * 送信先メールアドレス
        * メールタイトル（のプレフィックス）
        * メール本文


## Script
```Javascript
function sendReportMail() {
  // 【注意】以下の定数は自分用に書き換えて下さい
  const folderIDReady = "送信用フォルダIDを入力";          // For "01_Ready_For_Sending_Report"
  const folderIDFinished = "完了用フォルダIDを入力";       // For "02_Finished_Sending_Report"
  const fileNamePrefixForSending = "リネーム後のファイル名（のプレフィックス）を入力";  // ex) "Report"( + "_202103.pdf")
  const to = "送信先メールアドレスを入力";
  const subjectPrefix = "件名（のプレフィックス）を入力";   // ex) "【レポート】"( + "_202103")
  const body = "メール本文を入力";                        // ex) "お世話になっております。○です。\n\n今月のレポートになりますのでご確認願います。"

  // Get report
  let reportFile = DriveApp.getFolderById(folderIDReady).getFiles().next();

  // Check lastUpdated
  const lastUpdated = Utilities.formatDate(reportFile.getLastUpdated(), "Asia/Tokyo", "yyyyMM");
  const today = new Date();
  const thisMonth = Utilities.formatDate(today, "Asia/Tokyo", "yyyyMM");
  if (lastUpdated != thisMonth) {
    console.error("  ---------- 今月に作成したレポートではありません ---------- ");
    return;
  }

  // Rename
  const fileName = fileNamePrefixForSending + "_" + thisMonth + ".pdf";
  reportFile.setName(fileName);
  console.log(Utilities.formatString("  ---------- %s ---------- ", fileName));

  // Send Email
  const subject = subjectPrefix + "_" + thisMonth;
  GmailApp.sendEmail(to, subject, body, { attachments: [reportFile] });

  // Move to finished folder
  const finishedFolder = DriveApp.getFolderById(folderIDFinished);
  reportFile.moveTo(finishedFolder);

  console.log("  ---------- 送信完了 ---------- ");
}
```

上記手順で実行環境が出来上がったので、あとはPDFを用意して[レポートメール送信手順](# レポートメール送信手順)を実行するだけです。

**備考**

* 送信用フォルダに何も入っていないと実行時エラーになるショボい仕様ですが、気にしません
* 初めて動作確認するときはメール誤送信しないように `GmailApp.sendEmail()` の行はコメントアウトした方が手堅いです
* 自分仕様（ファイルの更新日チェックなど）なので、あとはご自分の用途に合わせてカスタマイズして下さい


# 参考サイト

* [Google Apps Script（GAS）とは？できることから始め方までの基本](https://anagrams.jp/blog/google-apps-script/)
* [初心者でも簡単！Google Apps ScriptでGmailを操作してメールを送る方法](https://tonari-it.com/gas-gmail-sendemail/)
* [ファイル添付したメールを自動で送るには？実はGoogle Apps Scriptで簡単にできるんです！](https://tonari-it.com/gas-send-gmail-files/)
* [GASでのメール送信についてまとめてみる](https://qiita.com/mistolteen/items/404c10657b1b27007a3c)
* [Google Apps Script (GAS) で、GoogleDrive上の指定フォルダからファイル一覧を取得する](https://qiita.com/beckyJPN/items/2ff74d5d13322b95a34e)
* [Google Apps Script(GAS)の文字列で改行する方法～エスケープ文字を活用](https://auto-worker.com/blog/?p=1111)
* [【JavaScript】var / let / const を本気で使い分けてみた](https://qiita.com/cheez921/items/7b57835cb76e70dd0fc4)
* [JavaScriptのシングルクォーテーションとダブルクォーテーション](https://qiita.com/niusounds/items/f21a28e862a68a098ea7)
* [JavaScriptのログのレベリングについて](https://qiita.com/morrr/items/09738dabb5e0a544922b)