GASで月初めにメールを送信する:祝日・土日対応

GASで月初めにメールを送信する:祝日・土日対応
◆ Live配信スケジュール ◆
サイオステクノロジーでは、Microsoft MVPの武井による「わかりみの深いシリーズ」など、定期的なLive配信を行っています。
⇒ 詳細スケジュールはこちらから
⇒ 見逃してしまった方はYoutubeチャンネルをご覧ください
VSCode Dev Containersで楽々開発環境構築祭り〜Python/Reactなどなど〜
Visual Studio Codeの拡張機能であるDev Containersを使ってReactとかPythonとかSpring Bootとかの開発環境をラクチンで構築する方法を紹介するイベントです。
https://tech-lab.connpass.com/event/311864/

ども!今回はGASを用いて、月初めに自動で定型メールを送信する方法について解説しました。もちろん、月の初め(1日)が休日や祝日だった場合は、直近の平日を検索して送信するように変更しています。さすがに祝日と休日にメールが来たら、心が痛くなりますからね。休日はしっかり休みましょう。

はじめに

どもども!今日はチームメンバーが有休を使っているので相手をしてくれる人がいない龍ちゃんです。ちょうど別件の仕事もあったので、2つの仕事を順次処理しています。

さて、久しぶりのGoogle Apps Script(GAS)になります。あまり新規タスクもなかったので、ご無沙汰でした。やはりGoogleのサービスとの連携周りに関していえば、最高にちょうどいいツールになります。程よいタスクが降って解消できたので、紹介していこうと思います。

今回実装した内容としては以下になります。

  • 月の初め(1日)に自動でメールを送信する
  • 1日が祝日・休日の場合は、一番近い平日にメールを送信する

最終的なサンプルだけが欲しい方は、スクロールで一番下のページに行ってもらえればよいかと思います。それでは始めます。

Google Apps Scriptsのサンプルコード集

最終的なサンプルとしては、下のほうにまとめてあります。コピペして使用してみてください。実装に必要なパーツを順を追って解説していきたいと思います。

メールを送信するサンプル

ここでは、GASでメールを送信するサンプルについて触れておきます。参考文献 is 公式のリファレンスです。

const  sendGmail = () => {
  const recipient = 'xxxxx@sample.com';       // 送信先のメールアドレス
  const subject = '件名';                      // 件名
  const body ="うぃ~っす"                      // 本文
  GmailApp.sendEmail(recipient, subject, body);
}

これだけで、スクリプトを実行しているアカウントからメールが送信されます。

土日判定プログラム

これはDate型の話なのでさらっと行きます。参考となるのはこのデモあたりですね。

const isWeekend = (date) => {
  // const date = new Date()
  const day = date.getDay()
  if (day === 0 || day === 6) return true;
  return false;
}

判定に使いまわす予定なので、関数として切り出しておきます。0が日曜で6が土曜な部分だけ、気を抜いたら忘れそうなので覚えておきましょう。

祝日判定プログラム

このプログラム実装がGASの真骨頂とも言えますね。方法としては、Google Calendarから祝日のリストを取得して、比較することで祝日の判定を行います。前提としては、紐づいているアカウントで「日本の祝日」がオンになっている必要があります。

正確には、自分のカレンダー上に登録されている「日本の祝日」を取得しています。参考文献 is 公式リファレンスです。

const holidayCalendarId = 'ja.japanese#holiday@group.v.calendar.google.com';
const calendar = CalendarApp.getCalendarById(holidayCalendarId);

const isHoliday = (date) => {
  const events = calendar.getEventsForDay(date);
  return events.length > 0;
}

使用しているメソッドのドキュメントはこちらになります。.getEventsForDay(date)では特定の日付でカレンダー登録されている、すべてのイベントを取得します。日本の祝日の場合は、祝日が終日という予定で入っているため、祝日の場合は少なくとも一件は登録されています。そのため、返答の配列が0以上の場合は祝日という判定になります。

また、calendarがグローバルになっているのはisHolidayを使いまわす場合、何度も呼び出すとやっばいからですね。

実行日が土日か祝日だった場合、直近の平日を取得するプログラム

こちらは、先ほど開設した「土日判定プログラム」と「祝日判定プログラム」を利用して実装しています。やはりコンプラ意識を高めようということで、土日と祝日に下っ端がメールを出すのは良くないので、ファイルの命名は「createNoBlackComDay」(ブラック企業じゃない日)という意味深な命名にしておきます。

const createNoBlackComDay = (today) => {
	// const today = new Date(today)
  let targetDate = new Date(today)
  do{
    targetDate.setDate(targetDate.getDate() + 1)
  }while(isWeekend(targetDate) || isHoliday(targetDate))
  return targetDate
}

const isWeekend = (date) => {
  // const date = new Date()
  const day = date.getDay()
  if (day === 0 || day === 6) {
    return true;
  }
  return false;
}

const holidayCalendarId = 'ja.japanese#holiday@group.v.calendar.google.com';
const calendar = CalendarApp.getCalendarById(holidayCalendarId);

const isHoliday = (date) => {
  const events = calendar.getEventsForDay(date);
  return events.length > 0;
}

処理自体は単純で、引数の日時情報が「土日」と「祝日」から離れるまで一日ずつ検証して問題なくなるまで繰り返します。

const today = new Date();

if (isWeekend(today) || isHoliday(today)) {
  const targetDate = createNoBlackComDay(today)
  Logger.log(targetDate)
  return
}

使用方法としては、上記のコードのように使用してもらえると良いかともいます。

Google Apps Scriptsで月一メールを送信する:祝日・土日対応

それでは、本題に入っていきましょう。今回の実装イメージは以下になります。GASのトリガーを利用して月初め(1日)にメール送信の処理が走るように設定します。祝日・土日の場合は、直近の平日に一回限りのトリガーを作成することで対応します。

実装イメージ図

それではコードになります。

const holidayCalendarId = 'ja.japanese#holiday@group.v.calendar.google.com';
const calendar = CalendarApp.getCalendarById(holidayCalendarId);

const isHoliday = (date) => {
  const events = calendar.getEventsForDay(date);
  return events.length > 0;
}

const isWeekend = (date) => {
  // const date = new Date()
  const day = date.getDay()
  if (day === 0 || day === 6) {
    return true;
  }
  return false;
}

const createNoBlackComDay = (today) => {
	// const today = new Date(today)
  let targetDate = new Date(today)
  do{
    targetDate.setDate(targetDate.getDate() + 1)
  }while(isWeekend(targetDate) || isHoliday(targetDate))
  return targetDate
}

function main() {
  const today = new Date();

  if (isWeekend(today) || isHoliday(today)) {
    const targetDate = createNoBlackComDay(today)
    Logger.log(targetDate)
    ScriptApp.newTrigger("main").timeBased().at(targetDate).create();  // 一回限りのトリガー発行
    return
  }

  const recipient = 'xxxxx@sample.com';       // 送信先のメールアドレス
  const subject = '件名';                      // 件名
  const body ="うぃ~っす"                      // 本文
  GmailApp.sendEmail(recipient, subject, body);
}

あとは、トリガーの設定で月初めに実行するようにしましょう。以下の記事で解説をしています。

Google Apps Scriptを最大限活用していきたいなぁ~

終わり

ども!今回は、限定的なシナリオで執筆してみました。GASを書くときの大半はすでに解決したい問題があるので、特に悩むこともないですね。あとはドキュメントを一生懸命に読んでいけば何とかなっていますね。

今回は、Twitter上で悩んでいる方がいたのでネタをいただき!ということで書きました。実際に、マーケのお姉さんから作ってほしいと言われていたので、これは天から書けと言われたようなものですね。

さて!2月にもなってもうたので、また張り切ってブログ頑張っていきましょう。ではまた~

 

アバター画像
About 龍:Ryu 106 Articles
2022年入社で主にフロントエンドの業務でTailwindと遊ぶ日々。お酒とうまいご飯が好きで、運動がちょっと嫌いなエンジニアです。しゃべれるエンジニアを目指しておしゃべりとブログ執筆に注力中(業務もね)//
ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

0人がこの投稿は役に立ったと言っています。


ご覧いただきありがとうございます。
ブログの最新情報はSNSでも発信しております。
ぜひTwitterのフォロー&Facebookページにいいねをお願い致します!



>> 雑誌等の執筆依頼を受付しております。
   ご希望の方はお気軽にお問い合わせください!

Be the first to comment

Leave a Reply

Your email address will not be published.


*


質問はこちら 閉じる