2022/01/16に更新

【GASで時短】様々な国の「国民の祝日」を取得する

スプレッドシートカレンダー小技

Googleが用意してくれている祝日カレンダーをもとに、1年間の祝日をスプレッドシートに出力するGoogle Apps Scriptです。 祝日は年によって変わったりするので確認が面倒なのと、国外との取引がある時にその国の祝日がわかれば便利だなと思い作成しました。

こんな悩みを解決します


  • 1年分のスケジュールを作成するにあたって、年によって変わる国民の祝日を確認したい
  • 国外の取引先とコンタクトしたりスケジューリングするときに、現地の祝日を把握したい

用意するもの


特にありませんが、表示するためにスプレッドシートを利用しています。
日常的に確認したい場合はGoogleカレンダーに各国の祝日を追加したほうが便利です。

このスクリプトで出来ること


  • 選択されているセルを起点に、指定された国の祝日を出力します。
  • 出力されるのはスクリプトを実行した月から12ヶ月分です。Googleが提供している祝日カレンダーは、向こう1年分しかデータが入っていないように見えるのと、最新の日付を出力したいのでこのような仕様にしています。

使い方


1.スクリプトの実行

上部メニューから「各国の国民の祝日を取得する」を実行します。

2.国の指定

国を指定するダイアログボックスが表示されます。
サンプルでいくつかの国の指定方法が表示されますが、ここにない国も(コードがわかれば)指定可能です。
日本の祝日を表示したい場合は「japanese」と入力してOKをクリックします。

3.出力結果の確認

選択していたセルを起点として、日付と祝日の名前の2列が出力されます。

アメリカ(usa)の祝日も出力してみました。日本よりだいぶ多い・・・?

4.注意点

カレンダーのイベントを取得するにはそのカレンダーを登録しないと参照できませんでした。
そのため、指定された国のカレンダーをGoogle カレンダーに追加してから祝日を取得する処理になっています。
このスクリプトで色々な国の祝日を出力すると、国の数だけカレンダーが増えてしまいますのであらかじめご了承ください。

スクリプト


/**
 * このスクリプトの説明、使い方はこちら。
 * https://myfunc.jp/items/00035/index.html
 */

function onOpen() {
  // スプレッドシートを開いたときに実行される関数

  const ui = SpreadsheetApp.getUi()

  // メニューの表示名
  const menu = ui.createMenu('スクリプト実行');

  // メニューに追加するボタン
  menu.addItem('各国の国民の祝日を取得する', 'get_national_holiday');

  // メニューを画面に追加する
  menu.addToUi();
}

function get_national_holiday() {

  // UIを取得
  const ui = SpreadsheetApp.getUi();

  // 表示するメッセージを準備
  const msg = [];
  msg.push('選択中のセルを起点に、今月から1年後までの国民の祝日を書き込みます。');
  msg.push('国コードを1つだけ入力してください\n');
  msg.push('日本: japanese');
  msg.push('アメリカ: usa');
  msg.push('イギリス: uk');
  msg.push('中国: china');
  msg.push('台湾: taiwan');
  msg.push('オーストラリア: australian\n\n');

  // 休日を取得したい国コードを入力させる
  // メッセージの表示にないコードも入力可能。
  const response = ui.prompt(msg.join('\n'), ui.ButtonSet.OK_CANCEL);

  // キャンセルが押されたらスクリプトを終了する
  if(response.getSelectedButton() == ui.Button.CANCEL){
    return;
  }

  // 入力されたコードをもとに、カレンダーIDを組み立てる
  const calendar_id = 'ja.' + response.getResponseText() + '#holiday@group.v.calendar.google.com';

  // 未登録のカレンダーは取得不可能なため、登録する
  CalendarApp.subscribeToCalendar(calendar_id);

  // カレンダーを取得
  const calendar = CalendarApp.getCalendarById(calendar_id)

  // カレンダーの取得期間を設定するための準備
  // 祝日は変わりうるため今月から12ヶ月後までの期間とする
  const date = new Date(); // 現在日時の取得
  const year_now = Utilities.formatDate(date, 'JST', 'yyyy'); // 今年を取得
  const month_now = Utilities.formatDate(date, 'JST', 'MM'); // 今月を取得
  const year_next = Number(year_now) + 1; // 来年を取得

  // 結果格納用の配列を準備
  let result = [];

  // 範囲を指定するためのdateオブジェクトを作成
  const period_from = new Date(year_now + '/' + month_now + '/01');
  const period_to = new Date(year_next + '/' + month_now + '/01');

  // 期間を指定してイベントを取得
  const events = calendar.getEvents(period_from, period_to);

  // 終日イベントの開始日と、イベントのタイトルを配列に格納しておく
  for(let i = 0; i < events.length; i++){
    result.push([events[i].getAllDayStartDate(), events[i].getTitle()]);
  }

  // シートへの書き込み処理
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); // アクティブシートを取得
  let range_active = sheet.getActiveCell(); // アクティブなセル範囲を取得

  let row_start = range_active.getRow(); // アクティブなセルの行番号を取得
  let col_start = range_active.getColumn(); // アクティブなセルの列番号を取得

  let range = sheet.getRange(row_start, col_start, result.length, result[0].length); // 書き込み範囲を取得

  range.setValues(result); // 書き込みの実行

}

関連するアプリ


【GASで時短】指定した月のカレンダーを生成する

年と月を指定すると、セルにカレンダーが出現するGoogle Apps Scriptです。カレンダーを入れたくなって調べてみたら標準機能にはなく、数式でやるにも結構面倒な感じだったので一発で作ってくれるGASを書いてみました。想像の3倍は面倒でした・・・。

【GASで時短】指定した年の12ヶ月分のカレンダーを生成する

指定した年の12ヶ月分のカレンダーを生成してくれるGoogle Apps Scriptです。前回作成した「指定した月のカレンダーを生成する」スクリプトをベースに、1年分出力するように変更してみました。横3 ✕ 縦4の形式で生成されます。

【GASで時短】CSVファイルを直接シートに読み込む

インターネット上にあるCSVファイルをシートに直接取り込むGoogle Apps Scriptです。オープンデータ等の取り込みが楽になるかもしれません。

【GASで時短】カレンダーの予定をスプレッドシートに出力する

Google カレンダーの予定を、スプレッドシートにまとめて出力するGoogle Apps Scriptです。カレンダーIDはダイアログボックスで入力できます。

【GASで時短】カレンダーの予定を一括で作成する

スプレッドシートに入力した値を元に、カレンダーの予定をまとめて作成することができるGoogle Apps Scriptです。

タグ一覧

最新のアプリ

人気のアプリ

myfunc.jp