Google Apps Scriptでメールの下書き作成を自動化してみた

はじめに

かなりニッチな事例ですが、Google Apps Script(GAS)でメールの下書き作成を自動化してみたのでご紹介したいと思います。

まず背景として、弊社では終業時にメールにて進捗報告を行うというルールがあります。

メールの体裁は概ね下記のような感じです。

  • 件名は「進捗報告(月/日)」。
  • 本文にその日の作業や進捗状況を記載する。

メールはGmailを使用しているので、GASで下記の作業を自動化したいと考えました。

  • 下書きを新規作成する作業
  • 件名(日付含む)を入力する作業
  • 本文の初期値として前回の内容を設定する作業
    筆者の場合、毎回記載するタスクがあり、前回の内容をベースに編集する方が都合がよいため。

毎朝下書きが自動作成されるようにしておき、終業時に当日分の内容を記載して送信するという運用を想定しています。

プロジェクト作成

まず、GASのページで新しいプロジェクトを作成します。

コード作成

コードエディタに下記のコードを貼り付けて保存します。
処理の内容はコード内のコメントを参照してください。
メールの宛先はご自身のケースに合わせて設定してください。

// 要件
// ・毎日の勤務終了時にその日の作業と進捗状況をメールにて社内の関係者に報告する。この作業をできるだけ自動化したい。

// スクリプトの機能
// ・前回送信した日報メールを複製し、件名の日付を現在日に更新して下書きトレイに保存する。
// ・下書きの作成時、前日に自動作成した下書きが残っていれば削除する。
// ・実行した日時が土日祝日の場合は、古い下書きの削除のみ行う。

// 運用の前提
// ・自動作成された下書きをユーザが手動で編集し、送信する。
// ・初回のメールは手動で作成し送信する。
// ・件名は「進捗報告(月/日)」とする。
// ・本スクリプトを毎日定時に自動実行するように設定する。
// ・土日祝日に日報メールを送信する場合は下書きを手動で作成する。

function main() {
  // 使わなかった古い下書きを削除
  deleteOldDrafts();

  // 平日でない場合は終了
  const today = new Date();
  if (!isWeekday(today)) {
    return;
  }

  // 宛先
  // !!!ご自身のケースに合わせて設定してください!!!
  const recipient = "xxxxxx@xxxxxx";
  // 件名
  const subject = "進捗報告" + Utilities.formatDate(today, "Asia/Tokyo", "(M/d)");
  // 前回のメールの本文取得
  const bodies = getSentMailBody();
  // オプション引数
  let options = {};
  if (bodies.contentType.search("text/plain") == -1) {
    // 前回のメールがプレーンテキストでない場合
    // HTML本文を使う
    options.htmlBody = bodies.htmlBody;
  }

  // 下書き作成
  const draft = GmailApp.createDraft(recipient, subject, bodies.plainBody, options);
  const draftThread = GmailApp.getThreadById(draft.getMessageId());

  // ラベル付与:使わなかった下書きを削除するときの判定用につけておく
  const label = GmailApp.getUserLabelByName("GAS作成");
  label.addToThread(draftThread);
}

// 平日かどうかを判定する(true:平日、false:土日祝日)
function isWeekday(date) {
  // 土日かどうか確認する。getDay()の戻り値→(0:日、1:月、・・・、6:土)
  if (date.getDay() == 0 || date.getDay() == 6) {
    return false;
  }

  // 祝日カレンダーを確認する
  const calendarId = "ja.japanese#holiday@group.v.calendar.google.com";
  const calendar = CalendarApp.getCalendarById(calendarId);
  if (calendar.getEventsForDay(date).length != 0) {
    // その日に予定が入っているなら祝日
    return false;
  };

  // 全て当てはまらなければ平日
  return true;
}

// 前回のメールの本文取得
function getSentMailBody() {
  const threads = GmailApp.search("in:sent subject:進捗報告", 0, 1);
  const message = threads[0].getMessages()[0];
  const bodies = {
    contentType: message.getHeader("Content-Type"),
    plainBody: message.getPlainBody(),
    htmlBody: message.getBody()
  };
  return bodies;
}

// 使わなかった古い下書きを削除
function deleteOldDrafts() {
  const threads = GmailApp.search('in:draft subject:進捗報告 label:GAS作成');
  GmailApp.moveThreadsToTrash(threads);
}

タイムゾーン設定

次に、タイムゾーンを設定します。
「appsscript.json」マニフェストファイルをエディタで表示するにチェックを入れます。

appsscript.jsonにて、タイムゾーンを「Asia/Tokyo」に設定して保存します。

動作確認

本スクリプトは前回のメールを複製する仕様のため、初回は手動でメールを作成する必要があります。
このとき、件名を「進捗報告」にし、宛先に自分のメールアドレスを設定し、本文に任意の内容を書いて送信しておきます。

初回のメールを送信したら、実行ボタンを押して下書きが作成されるか確認します。

初回実行時はGoogleアカウントへのアクセスを許可するか聞かれるので、権限を確認ボタンを押下します。

自分のアカウントを選択します。

許可を押下します。

実行ログが表示されます。

もしエラーメッセージが出た場合は内容を読んで解決してください。
エラーなく実行できれば下書きが作成されます。

作成された下書きの内容が下記の通りであることを確認します。

  • 件名に今日の日付が入っていること
  • 宛先が指定したものであること
  • 本文が前回のメールと同じであること

自動実行の設定

次に、スクリプトの自動実行の設定をします。
右端の時計アイコンをクリックし、トリガーを追加ボタンを押下します。

毎日午前7~8時に実行する設定を以下に示します。
ご自身の都合に合わせて設定してください。

あとは設定した時刻になると、下書きが作成されるはずです。
実行ログは左端の下記アイコンをクリックして確認してください。
(下記は実行時刻を午前6時~7時とした場合のログです)

おわりに

もともとちょっとした作業ではありますが、進捗報告を書く頃は一日の疲れが溜まっているので、下書きを準備する手間が減っただけでも自動化してよかったと感じています。

ご興味のある方は、ご自身のケースに合わせてカスタマイズして頂ければと思います。
なお、ご利用は自己責任にてお願い致します。