Googleカレンダーの日本の祝日をGASとExcelで取得する ~APIキー不要、XML連携ガイド~
本記事では、Microsoft Excelで日本の祝日情報を手軽に扱いたいけれど、VBAプログラミングやAPIキーの管理は避けたい、というニーズに応えます。Googleカレンダーの公開祝日データをGoogle Apps Script(GAS)を介してXML化し、Excelの標準機能だけで自動的に取り込む具体的な手順をステップバイステップで解説します。
GASコードと登録手順の細部もテキスト作成してもらいました。
そのレポートをもとに、実際に自分でやりながら画面キャプチャをとったり、分かりづらい部分は追加記載して作成しました。
はじめに
本記事作成開始時のAIへのプロンプト
Googleカレンダーの日本の祝日データを、iCal形式の公開URLをGASで解析し、XML形式のAPIとしてExcelに取得・展開するまでの一連のステップを、ゼロから全て教えてください。
APIキーを使わない、iCalをGASで処理する方式でお願いします。
---
### 1. GAS (Google Apps Script) の実装とデプロイ
* Google Apps Scriptプロジェクトの作成方法。
* **iCal形式の日本の祝日データを読み込み、解析し、XML形式で整形して返すGASスクリプトの具体的なコード**(特定年の祝日取得機能、および`iCal`の解析ロジックを含む)。
* GASスクリプトをWebアプリケーションとしてデプロイする詳細な手順(アクセス権限の設定と、発行されたURLの確認方法)。
---
### 2. Excelシートでの数式と設定
* GASでデプロイしたWebアプリケーションのURLをExcelで扱うための数式。
* `WEBSERVICE`関数を使ってXMLデータを取得する数式。
* 取得したXMLデータから祝日の「日付」と「名称」をそれぞれ抽出し、シートに自動的に展開(スピル)させる`FILTERXML`関数の数式。
* 特定の年(例: A1セルに入力した年)の祝日を取得するための、Excel側の数式とGAS側の連携方法。
---
この一連の作業を、詳細な手順とそのまま使えるコード、数式でガイドしてください。
Google Apps Script (GAS) による祝日APIの作成
Google Apps Scriptプロジェクトの新規作成
画面左上の「+ 新規」ボタンをクリックします。


新しい無題のプロジェクトがブラウザの新しいタブで開かれます。




祝日データ取得・XML変換スクリプトの実装
ここで作成するスクリプトは、以下の処理を行います。
- Googleカレンダーの日本の祝日iCalendar (ICS) 形式の公開URLからデータを取得します。
- 取得したiCalendarデータを解析し、指定された年の祝日の日付と名称を抽出します。
- 抽出した祝日情報をXML形式のテキストデータに整形します。
- このXMLデータをWebリクエストに対して応答として返します。URLのパラメータで年を指定できるようにします。
コード全体
GASエディタに表示されている コード.gs ファイルの内容をすべて削除し、以下のスクリプトをコピー&ペーストしてください。
// 日本の祝日カレンダーのiCal形式URL
const ICAL_URL = 'https://calendar.google.com/calendar/ical/ja.japanese%23holiday%40group.v.calendar.google.com/public/basic.ics';
/**
* Webリクエスト(GET)を処理し、指定された年の日本の祝日データをXML形式で返します。
* @param {Object} e - イベントオブジェクト。e.parameter.year で年を指定できます。
* @return {ContentService.TextOutput} XML形式の祝日データ。
*/
function doGet(e) {
let targetYearStr = '';
if (e && e.parameter && e.parameter.year) {
targetYearStr = e.parameter.year;
} else {
targetYearStr = new Date().getFullYear().toString(); // 年が指定されていない場合は当年
}
// 年が4桁の数字であることを確認
if (!/^\d{4}$/.test(targetYearStr)) {
return ContentService.createTextOutput('<holidays><error><message>Invalid year format. Please specify a 4-digit year (e.g., year=2025).</message></error></holidays>')
.setMimeType(ContentService.MimeType.XML);
}
try {
const icsString = UrlFetchApp.fetch(ICAL_URL).getContentText();
const events = parseICS(icsString, targetYearStr);
const xmlOutput = convertToXML(events, targetYearStr);
return ContentService.createTextOutput(xmlOutput).setMimeType(ContentService.MimeType.XML);
} catch (error) {
Logger.log('Error: ' + error.toString());
return ContentService.createTextOutput('<holidays><error><message>Failed to retrieve or parse holiday data: ' + escapeXml(error.toString()) + '</message></error></holidays>')
.setMimeType(ContentService.MimeType.XML);
}
}
/**
* iCalendar形式の文字列を解析し、指定された年のイベントを抽出します。
* @param {string} icsString - iCalendar形式のデータ文字列。
* @param {string} targetYearStr - 対象の年(文字列)。
* @return {Array<Object>} 抽出されたイベントの配列({date: 'YYYYMMDD', name: '祝日名'})。
*/
function parseICS(icsString, targetYearStr) {
const holidays = [];
const vevents = icsString.split('BEGIN:VEVENT');
if (vevents.length > 1) {
vevents.slice(1).forEach(veventData => {
const eventLines = veventData.split(/\r\n|\r|\n/); // 改行コードの差異に対応
let date = '';
let summary = '';
eventLines.forEach(line => {
if (line.startsWith('DTSTART;VALUE=DATE:')) {
date = line.substring('DTSTART;VALUE=DATE:'.length).trim();
} else if (line.startsWith('SUMMARY:')) {
summary = line.substring('SUMMARY:'.length).trim();
}
});
if (date && summary && date.startsWith(targetYearStr)) {
holidays.push({
date: date,
name: summary
});
}
});
}
return holidays;
}
/**
* 祝日データの配列をXML文字列に変換します。
* @param {Array<Object>} holidays - 祝日データの配列。
* @param {string} year - 対象年。
* @return {string} XML形式の文字列。
*/
function convertToXML(holidays, year) {
let xml = '<holidays year="' + year + '">\n';
if (holidays.length === 0) {
xml += ' <message>No holidays found for the specified year.</message>\n';
} else {
holidays.forEach(holiday => {
xml += ' <holiday>\n';
xml += ' <date>' + holiday.date + '</date>\n';
xml += ' <name>' + escapeXml(holiday.name) + '</name>\n';
xml += ' </holiday>\n';
});
}
xml += '</holidays>';
return xml;
}
/**
* XML特殊文字をエスケープします。
* @param {string} unsafe - エスケープ対象の文字列。
* @return {string} エスケープされた文字列。
*/
function escapeXml(unsafe) {
if (typeof unsafe !== 'string') {
return '';
}
return unsafe.replace(/[<>&'"]/g, function (c) {
switch (c) {
case '<': return '<';
case '>': return '>';
case '&': return '&';
case '\'': return ''';
case '"': return '"';
default: return c;
}
});
}
スクリプトを貼り付けたら、フロッピーディスクのアイコン(保存)をクリックしてスクリプトを保存します。

Webアプリケーションとしてのデプロイ
- GASエディタ画面の上部にある「デプロイ」ボタンをクリックします。
- 「新しいデプロイ」を選択します。
- 「種類の選択」の右側にある歯車アイコンをクリックし、表示されたリストから「ウェブアプリ」を選択します。
- 以下の設定項目を適切に入力・選択します。
- 説明: (任意)例: 日本の祝日カレンダーXMLサービス
- 次のユーザーとして実行: 「自分(あなたのGoogleアカウントのメールアドレス)」を選択します。
- アクセスできるユーザー: 「全員」を選択します。これはExcelから匿名でアクセスできるようにするために重要です。
- 「デプロイ」ボタンをクリックします。
- 「承認が必要です」というダイアログが表示されたら、「アクセスを承認」ボタンをクリックします。
- Googleアカウントの選択画面が表示されたら、スクリプトプロジェクトを作成したアカウント(自分)を選択します。
- 「このアプリはGoogleで確認されていません」という警告画面が表示されることがあります。その場合は、左下にある「詳細」または「Advanced」をクリックし、次に表示される「(プロジェクト名)に移動(安全ではないページ)」のリンクをクリックします。
そうすると、画面が展開され、その下に「Go to JpHolidaysXml (unsafe)」といったリンクが表示されます。(JpHolidaysXml の部分は、あなたが設定した実際のプロジェクト名になります)このリンクをクリックしてください。
次に、このスクリプトが要求している権限の一覧が表示されます。内容を確認し、問題がなければ画面下部にある「許可」(または英語の場合は「Allow」)ボタンをクリックしてください。 - 次の画面で、このスクリプトがGoogleアカウントのデータにアクセスする許可を求められるので、内容を確認し、問題がなければ「許可」ボタンをクリックします。
上記の許可は求められない場合もあります。
URLは通常、https://script.google.com/macros/s/XXXXXXXXXXXXXXXXXXXXX/exec のような形式です。
まず、該当のGoogle Apps Scriptプロジェクトを開きます。
(Google Driveからプロジェクト名のファイルを開くか、https://script.google.com/home/my から最近のプロジェクトを探して開いてください。)
スクリプトエディタが開いたら、画面上部にある「デプロイ」というメニューボタンをクリックします。
ドロップダウンメニューが表示されるので、その中から「デプロイを管理」を選択します。

多くの場合、アクティブなデプロイは一つです。
該当のデプロイの情報(通常はクリックすると詳細が表示されるか、既に表示されています)の中に、「ウェブアプリ」というセクションがあり、そこに「URL」が記載されています。
注意: スクリプトの内容を変更した場合は、再度デプロイ作業を行う必要があります。「デプロイ」 > 「デプロイを管理」から、該当のデプロイを選択し、編集アイコン(鉛筆マーク)をクリック後、「バージョン」で「新バージョン」を選択して「デプロイ」します
Excelでの祝日データの取得と表示
Excelシートの準備
- Excelを開き、新しいワークブックを作成するか、既存のワークブックを使用します。
- 任意のセル(例: A1セル)を、祝日を取得したい年を入力するためのセルとします。このセルに4桁の年(例: 2025)を入力しておきます。このセルの値を変更することで、表示する祝日の年を動的に切り替えることができます。

WEBSERVICE関数によるXMLデータの取得
- 祝日データを一時的に格納するセル(例: C1セル、このセルは後で非表示にしても構いません)を選択します。
- そのセルに以下の数式を入力します。
A1セルに入力された年をパラメータとしてGASのURLに付加します。=WEBSERVICE("ここにGASのWebアプリURL" & "?year=" & A1)"ここにGASのWebアプリURL" の部分は、1.3.でコピーした実際のGAS WebアプリのURLに置き換えてください。例えば、GASのURLが https://script.google.com/macros/s/ABCDEFG12345/exec で、年が A1 セルに入力されている場合、数式は以下のようになります。=WEBSERVICE("https://script.google.com/macros/s/ABCDEFG12345/exec?year=" & A1)Enterキーを押すと、C1セルにGASから返されたXMLデータが表示されます。データが正しく取得できていれば、<holidays year="YYYY">...</holidays> といった形式のテキストが表示されるはずです。
FILTERXML関数による祝日情報の抽出と表示
この関数は、XMLデータに対してXPathクエリを実行し、結果を返します。
- 祝日の日付一覧を表示したい開始セル(例: A3セル)を選択します。
- 以下の数式を入力します。=IFERROR(FILTERXML(B1,"//holidays/holiday/date"),"")
- B1 は、WEBSERVICE関数でXMLデータを取得したセルです。
- "//holidays/holiday/date" はXPathクエリで、XMLデータ内の全ての <holiday> 要素の中にある <date> 要素の内容を抽出します。
- IFERROR(..., "") は、データが存在しない場合やエラー時に空文字を表示するためのものです。
祝日名称の抽出
- 祝日の名称一覧を表示したい開始セル(例: B3セル)を選択します。
- 以下の数式を入力します。=IFERROR(FILTERXML(B1,"//holidays/holiday/name"),"")
- "//holidays/holiday/name" はXPathクエリで、XMLデータ内の全ての <holiday> 要素の中にある <name> 要素の内容を抽出します。
スピル機能について
そのため、B3セルやC3セルに数式を一つ入力するだけで、その年の全ての祝日日付と名称が一覧表示されます。


FILTERXML … Microsoftサポートのページ
IFERROR … サイト内の解説ページ
おわりに
- APIキーの取得や管理といった手間が不要になります。
- プログラミングの専門知識が深くない方でも比較的容易に実装できます。
- Excel上で年を指定するだけで、該当年の祝日情報を手軽に、かつ自動的に更新できます。
今回ご紹介したiCalendar形式のデータを処理する手法は、祝日情報だけでなく、他の公開カレンダーデータなどにも応用可能です。日々の業務や個人的な活動の中で、外部の情報を手軽に活用するための一つの手段として、本ガイドがお役に立てれば大変嬉しく思います。
参考情報
日本の祝日一覧
本レポートとは異なるアプローチとして、Excel VBAを使用してGoogleカレンダーのiCal形式データから祝日情報を取得する方法が解説されています。VBAに関心のある方には参考になるかもしれません。
Google Calendar iCal形式で祝日取得(VBA利用)
※本記事の作成にあたっては、一部の文章作成に生成AI(Gemini)を使用しています。最終的な内容は人間による確認・編集を経て掲載しています。
同じテーマ「生成AI活用研究」の記事
AIが問う出版の未来は淘汰か進化か:AIと書籍の共存の道とは
AI時代におけるITエンジニアの資質
AI時代の「Hello World」のすすめ:すべてはこの一歩から
AI擬人化の光と影:その心理と健全な付き合い方
AIと『対話』する時代に問う:あなたの前には誰がいますか?
生成AIが拓く「もう一人の自分」とパーソナライゼーションの未来
生成AIパスポート試験 キーワード解説
生成AIパスポート試験 練習問題(四股択一式)
Googleカレンダーの日本の祝日をGASとExcelで取得する ~APIキー不要、XML連携ガイド~
AI×ひらめき ― 「ネタ」が飛躍する創造の増幅プロセス
Googleカレンダーの日本の祝日をGASとExcelで取得する ~APIキー不要、XML連携ガイド~
新着記事NEW ・・・新着記事一覧を見る
Excel×スプレッドシート連携:HTTP GETで学ぶGAS API設計入門|生成AI活用研究(2025-06-04)
AI×ひらめき ― 「ネタ」が飛躍する創造の増幅プロセス|生成AI活用研究(2025-06-03)
Googleカレンダーの日本の祝日をGASとExcelで取得する ~APIキー不要、XML連携ガイド~|生成AI活用研究(2025-06-02)
究極のVBA転記プロンプト公開!あなたの事務作業を劇的に効率化|生成AI活用研究(2025-06-02)
エクセル入門 4択クイズ|エクセル入門(2025-05-31)
VBA入門 4択クイズ|VBA入門(2025-05-30)
Google Calendar iCal形式で祝日取得|Excelリファレンス(2025-05-30)
生成AIが拓く「もう一人の自分」とパーソナライゼーションの未来|生成AI活用研究(2025-05-30)
生成AIパスポート試験 練習問題(四股択一式)|生成AI活用研究(2025-05-29)
生成AIパスポート試験 キーワード解説|生成AI活用研究(2025-05-29)
アクセスランキング ・・・ ランキング一覧を見る
1.最終行の取得(End,Rows.Count)|VBA入門
2.変数宣言のDimとデータ型|VBA入門
3.繰り返し処理(For Next)|VBA入門
4.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
5.RangeとCellsの使い方|VBA入門
6.FILTER関数(範囲をフィルター処理)|エクセル入門
7.メッセージボックス(MsgBox関数)|VBA入門
8.セルのクリア(Clear,ClearContents)|VBA入門
9.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
10.マクロとは?VBAとは?VBAでできること|VBA入門
このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。