第n営業日 or 対象の日付に実行する Google Apps Script (GAS) サンプルコード

4 min read読了の目安(約3700字

概要

第n営業日 or 対象の日付に実行する Google Apps Script (GAS) サンプルコードをご紹介します。

背景

「毎月第3営業日に Slack でアナウンスする Google Apps Script を作ってほしい」 というご要望をいただきまして、書いたサンプルコードをご紹介します。

仕様

  • 通知条件

    • 毎月第n営業日
    • 日付指定もしたい
  • 営業日は日本の祝日以外に考慮すべき項目は無し

GAS サンプルコードの使い方説明

サンプルコード on GitHub

以下、本記事でご紹介する GAS サンプルコードの完成版です。

const TARGET = {
  DATES: [10, 15], // 日付指定
  NUMBER_OF_BUSINESS_DAYS: [6, 8], // 第 n 営業日
  HOURS: 9, // トリガー実行時間(時)
  MINUTES: 00, // トリガー実行時間(分)
};

// トリガーを設定可能か判定する
//
// @return {boolean}
function canSetTrigger() {
  const today = new Date();
  const todayDate = today.getDate();
  if (TARGET.DATES.includes(todayDate)) {
    return true;
  }

  const todayNumberOfBusinessDay = numberOfBusinessDay(today);
  if (TARGET.NUMBER_OF_BUSINESS_DAYS.includes(todayNumberOfBusinessDay)) {
    return true;
  }

  return false;
}

// トリガーを設定する
function setTrigger() {
  if (canSetTrigger()) {
    const date = new Date();
    date.setHours(TARGET.HOURS);
    date.setMinutes(TARGET.MINUTES);

    ScriptApp.newTrigger("myFunction").timeBased().at(date).create();
  }
}

// トリガーを削除する
function delTrigger() {
  const triggers = ScriptApp.getProjectTriggers();
  for (const trigger of triggers) {
    if (trigger.getHandlerFunction() === "myFunction") {
      ScriptApp.deleteTrigger(trigger);
    }
  }
}

// 営業日を判定する
//
// @return {boolean}
// * 土日 false
// * 祝日 false
// * それ以外 true
function isBusinessDay(date) {
  if (date.getDay() == 0 || date.getDay() == 6) {
    return false;
  }

  const calJa = CalendarApp.getCalendarById(
    "ja.japanese#holiday@group.v.calendar.google.com"
  );
  if (calJa.getEventsForDay(date).length > 0) {
    return false;
  }

  return true;
}

// 第 n 営業日の何日目か算出する
//
// @return {number} num
// * 営業日では無い場合は 0 を返す
// * 第 n 営業日の場合は n を返す
function numberOfBusinessDay() {
  const now = new Date();
  let num = 0;
  let countDayOfMonth;

  if (!isBusinessDay(now)) {
    return num;
  }

  for (let i = 1; i <= now.getDate(); i++) {
    countDayOfMonth = new Date(now.getFullYear(), now.getMonth(), i); // 次の日をセット
    if (isBusinessDay(countDayOfMonth)) {
      num = num + 1; // 営業日をカウントアップ
    }
  }
  return num;
}

function postSlackMessage(text) {
  const data = {
    text: text,
  };
  const options = {
    method: "post",
    contentType: "application/json",
    payload: JSON.stringify(data), // Convert the JavaScript object to a JSON string.
  };

  UrlFetchApp.fetch(
    PropertiesService.getScriptProperties().getProperties().SLACK_URL,
    options
  );
}

function myFunction() {
  delTrigger();
  postSlackMessage("オハヨウゴザイマス!");
}

変更箇所

const TARGET = {
  DATES: [10, 15], // 日付指定
  NUMBER_OF_BUSINESS_DAYS: [6, 8], // 第 n 営業日
  HOURS: 9, // トリガー実行時間(時)
  MINUTES: 00, // トリガー実行時間(分)
};

スクリプトのプロパティを設定する

[ファイル] - [プロジェクトのプロパティ] - [スクリプトのプロパティ] にて SLACK_URL を設定します。

SLACK_URL の取得方法

Incoming Webhook の Slack アプリを作成して https://hooks.slack.com/services/xxxSLACK_URL に利用します。

トリガーを設定する

トリガーの条件

  • 実行する関数を選択: setTrigger
  • イベントのソースを選択: 時間主導型
  • 時間ベースのトリガーのタイプを選択: 日付ベースのタイマー
  • 時刻を選択: 午前0時〜1時

以上、第n営業日 or 対象の日付に実行する Google Apps Script (GAS) サンプルコードを実装してみた、現場からお送りしました。