【GAS】祝日一覧をスプレッドシートに連携する方法

やりたいこと

スプレッドシートで営業日を用いてガントチャートなどを作りたいとき、週末と祝日の設定ができるWORKDAY.INTL関数が便利です。

しかし、スプレッドシートだけだと、祝日一覧を取得することはできないので、GASを使って「祝日一覧を取得 」→「 スプレッドシートに出力」という手順を踏む必要があります。(もちろんほかにも色々手はありますが、一例としてGASを使います)

連携方法

Google Calendarの「日本の祝日」カレンダーから祝日情報を取得する

  1. CalendaApp.getCalendarByIdに「日本の祝日」カレンダーのIDを渡し、カレンダー情報を取得する
    「日本の祝日」カレンダーのID:ja.japanese#holiday@group.v.calendar.google.com
  2. 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);

取得した祝日情報をスプレッドシートに出力する

  1. 出力したいスプレッドシートのIDを取得する。以下の赤字部分がID
    https://docs.google.com/spreadsheets/d/XXX/edit#gid=0
  2. SpreadsheetApp.openByIdにスプレッドシートIDを渡し、スプレッドシート情報を取得する
  3. SpreadsheetApp.SpreadsheetのgetAcrivesheetを実行し、出力するシートを取得する。
  4. シートに出力する前に、いったんすべてクリアしておく。
  5. 祝日一覧を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() ]);
  });
}

コメント

タイトルとURLをコピーしました