やりたいこと
スプレッドシートで営業日を用いてガントチャートなどを作りたいとき、週末と祝日の設定ができるWORKDAY.INTL関数が便利です。
しかし、スプレッドシートだけだと、祝日一覧を取得することはできないので、GASを使って「祝日一覧を取得 」→「 スプレッドシートに出力」という手順を踏む必要があります。(もちろんほかにも色々手はありますが、一例としてGASを使います)
連携方法
Google Calendarの「日本の祝日」カレンダーから祝日情報を取得する
CalendaApp.getCalendarById
に「日本の祝日」カレンダーのIDを渡し、カレンダー情報を取得する
「日本の祝日」カレンダーのID:ja.japanese#holiday@group.v.calendar.google.com
- CalendaApp.Calendarの
getEvents
に、開始と終了のDateインスタンスを渡し、イベント一覧を取得する。このイベント一覧が祝日一覧である。
const startDate = new Date('2022-01-01');
const endDate = new Date('2023-12-31');
const holidayCalendarId = 'ja.japanese#holiday@group.v.calendar.google.com';
const calendar = CalendarApp.getCalendarById(holidayCalendarId);
const events = calendar.getEvents(startDate, endDate);
取得した祝日情報をスプレッドシートに出力する
- 出力したいスプレッドシートのIDを取得する。以下の赤字部分がID
https://docs.google.com/spreadsheets/d/XXX/edit#gid=0 SpreadsheetApp.openById
にスプレッドシートIDを渡し、スプレッドシート情報を取得する- SpreadsheetApp.SpreadsheetのgetAcrivesheetを実行し、出力するシートを取得する。
- シートに出力する前に、いったんすべてクリアしておく。
- 祝日一覧を1件ずつ、シートに出力していく。
・祝日の日付:getAllDayStartDate
で取得可能
・祝日名称:getTitle
で取得可能
const outputSpreadsheetId = 'XXX'; //スプレッドシートのIDをセット
const spreadsheet = SpreadsheetApp.openById(outputSpreadsheetId);
const sheet = spreadsheet.getActiveSheet();
sheet.clear();
sheet.appendRow(['No','日付','タイトル'])
events.forEach((x, i) => {
sheet.appendRow([(i + 1),x.getAllDayStartDate().toLocaleDateString("ja-jp"), x.getTitle() ]);
});
出力結果
以下のようなスプレッドシートが出力できれば成功です!
完成系コード
function myFunction() {
const startDate = new Date('2022-01-01');
const endDate = new Date('2023-12-31');
const holidayCalendarId = 'ja.japanese#holiday@group.v.calendar.google.com';
const calendar = CalendarApp.getCalendarById(holidayCalendarId);
const events = calendar.getEvents(startDate, endDate);
const outputSpreadsheetId = 'XXX'; //スプレッドシートのIDをセット
const spreadsheet = SpreadsheetApp.o.openById(outputSpreadsheetId);
const sheet = spreadsheet.getActiveSheet();
sheet.clear();
sheet.appendRow(['No','日付','タイトル'])
events.forEach((x, i) => {
sheet.appendRow([(i + 1),x.getAllDayStartDate().toLocaleDateString("ja-jp"), x.getTitle() ]);
});
}
コメント