Googleスプレッドシートで祝日を取得する

投稿日:

更新日:

はじめに

Google スプレッドシートでガントチャートを作る際に祝日を考慮するのが難しく、都度更新して静的に書くくらいしか方法がないと思っていました。(祝日APIがあればいいのに...)
ただ、祝日リストをCSVで取得すれば日付のリストを作成できたので手順をまとめています。

祝日リストを取得する

以下の内閣府のホームページに、1955年から翌年までの国民の祝日を掲載しているCSVがあるのでCSVのURLをコピーします。

取得したURLは以下になります。

方法1:IMPORTDATAで祝日リストを取得する

Google スプレッドシートに読み込む

数式を入力する

Google スプレッドシートを開き、祝日リストを読み込みたいセルに以下の数式を入力します。

Sheet
=IMPORTDATA("https://www8.cao.go.jp/chosei/shukujitsu/syukujitsu.csv")

アクセスを許可する

数式を入力すると画像のような警告が出るので、#REF!のセルをホバーします。
すると「アクセスを許可」というボタンが出てくるのでこのボタンを押下します。

数式を入れると警告が表示される
数式を入れると警告が表示される

リストが読み込まれますが、文字化けした状態になります。

文字化けした祝日リスト
文字化けした祝日リスト

取得したデータを整える

日付の表記を変更する

5桁の数字は[表示形式] > [数字] > [日付]を選択して表示形式を変えることで正しい日付の表記で表示することができます。

表示形式を日付に変更する
表示形式を日付に変更する

任意のセルに日付のみコピーする

リストをA列に出力していることを前提にQUERY関数を使用して別のセルに日付のみコピーします。

A1が見出しになるためA2からA列の最下部までを選択しています。その際に空白セルも取得されるのでwhere句にA is not nullを追加して除外します。
最後に日付を昇順にして出力します。

Sheet
=QUERY(A2:A, "select A where A is not null order by A asc")

以下のコードでは2024年1月1日以降の祝日だけを取得する記述になっています。
CSVから取得したデータは1955年からの祝日がすべて取得されるので、QUERY関数を使用して必要なデータに絞り込んでおきます。

Sheet
=QUERY(A2:A, "select A where A is not null AND A >= date '2024-01-01' order by A asc")
別のワークブックで呼び出すにはIMPORTRANGE関数を使用してください。

方法2:GASで祝日リストを定期的に更新する

祝日名を文字化けせずに含めて取得したい場合や、定期的にデータを更新したい場合は、Google Apps Script(GAS)を使用する方法があります。

ここでは、内閣府が公開している祝日CSVを月に1度取得し、「祝日」シートのA列に日付、B列に祝日名を出力する方法を説明します。

更新時は「祝日」シートのA・B列を上書きするため、専用のシートとして使用してください。

Apps Scriptを作成する

スプレッドシートのメニューから、[拡張機能]→[Apps Script]を選択します。

エディタが開いたら、以下のコードを貼り付けて保存します。

コード.gs
const HOLIDAY_CSV_URL =
  'https://www8.cao.go.jp/chosei/shukujitsu/syukujitsu.csv';

const HOLIDAY_SHEET_NAME = '祝日';

/**
 * 内閣府のCSVを取得し、祝日シートへ出力
 *
 * @returns {void}
 */
function updateHolidays() {
  const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  const sheet =
    spreadsheet.getSheetByName(HOLIDAY_SHEET_NAME) ??
    spreadsheet.insertSheet(HOLIDAY_SHEET_NAME);

  const response = UrlFetchApp.fetch(HOLIDAY_CSV_URL, {
    followRedirects: true,
    muteHttpExceptions: true,
  });

  const statusCode = response.getResponseCode();

  if (statusCode !== 200) {
    throw new Error(
      `祝日CSVの取得に失敗しました。HTTPステータス: ${statusCode}`
    );
  }

  // CSVをShift_JISとして読み込み、祝日名の文字化けを防ぎます。
  const csvText = response.getContentText('Shift_JIS');
  const csvRows = Utilities.parseCsv(csvText);
  const timeZone = spreadsheet.getSpreadsheetTimeZone();

  const values = csvRows
    .slice(1)
    .filter((row) => row[0] && row[1])
    .map(([dateText, holidayName]) => {
      const [year, month, day] = dateText.split('/');
      const normalizedDate =
        `${year}/${month.padStart(2, '0')}/${day.padStart(2, '0')}`;

      return [
        Utilities.parseDate(
          normalizedDate,
          timeZone,
          'yyyy/MM/dd'
        ),
        holidayName.trim(),
      ];
    });

  if (values.length === 0) {
    throw new Error('祝日データを取得できませんでした。');
  }

  sheet
    .getRange(1, 1, sheet.getMaxRows(), 2)
    .clearContent();

  sheet
    .getRange(1, 1, 1, 2)
    .setValues([['日付', '祝日名']]);

  sheet
    .getRange(2, 1, values.length, 2)
    .setValues(values);

  sheet
    .getRange(2, 1, values.length, 1)
    .setNumberFormat('yyyy/MM/dd');

  sheet.setFrozenRows(1);
  sheet.autoResizeColumns(1, 2);
}

/**
 * 祝日データを毎月1日に更新するトリガー
 *
 * 同じ処理のトリガーがすでに存在する場合は削除してから作成する。
 *
 * @returns {void}
 */
function createMonthlyHolidayTrigger() {
  ScriptApp.getProjectTriggers()
    .filter(
      (trigger) =>
        trigger.getHandlerFunction() === 'updateHolidays'
    )
    .forEach((trigger) => {
      ScriptApp.deleteTrigger(trigger);
    });

  ScriptApp.newTrigger('updateHolidays')
    .timeBased()
    .onMonthDay(1)
    .atHour(3)
    .inTimezone('Asia/Tokyo')
    .create();
}

初回の祝日データを取得する

Apps Script上部の関数一覧からupdateHolidaysを選択し、[実行]を押します。

初回実行時は権限の承認を求めらるので画面の案内に従って許可すると、「祝日」シートが作成され、以下のように出力されます。

A列

B列

日付

祝日名

2026/01/01

元日

2026/01/12

成人の日

毎月更新するトリガーを設定する

続いて、関数一覧からcreateMonthlyHolidayTriggerを選択し、一度だけ実行します。

これで、毎月1日の午前3時台にupdateHolidaysが自動実行されます。時間主導型トリガーは指定時刻ちょうどではなく、指定した時間帯の中で実行されます。

作成されたトリガーは、Apps Script左側の[トリガー]から確認できます。

実行日を変更したい場合は、以下の1を任意の日付に変更してください。

GAS
.onMonthDay(1)

実行時間を変更したい場合は、以下の3を0〜23の範囲で変更します。

GAS
.atHour(3)

トリガーの指定方法については、ClockTriggerBuilderの公式ドキュメントを参照してください。

注意点

この方法で取得できる範囲は内閣府のCSVに掲載されている期間までです。

内閣府では翌年分の祝日を前年2月に掲載すると案内しているため、月に1度更新しておけば、新しいデータの公開後に自動で反映できます。

また、CSVの取得に失敗した場合は、既存の祝日データを削除せずエラーとして処理されます。

この記事をシェアする