2021/12/21に更新

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

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

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

こんな悩みを解決します


  • スプレッドシート上にカレンダーを作りたい。
  • 手動で作るのは面倒だし、セルに数式を入れる作り方も準備が面倒。
  • カレンダーテンプレートは2019年で更新が止まっているし・・・

用意するもの


特にありません。今お使いのスプレッドシートに組み込めます。

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


  • 任意の年月のカレンダーを出力できます。
  • カレンダーは日曜開始です。
  • 生成される位置は、現在選択されている(アクティブな)セルが起点になります。選択セルから下に6行、右に7列の値は消えてしまいますのでご注意ください。

使い方


1.スクリプトの起動

上部のメニューから「指定した年月のカレンダーを生成」を実行します。

2.年月の指定

ダイアログボックスが開きますので、カレンダーを生成したい年と月を/(スラッシュ)で区切って入力します。
半角の整数で入力してください。

3.カレンダーが生成されます。

選択中のセルを起点にカレンダーが生成されます。
業務で利用する場合はカレンダーが正しいかどうかご確認をお願いします。

4.エラーメッセージ

入力された年が1以上の整数ではない場合はエラーになり、スクリプトが停止します。

入力された月が1以上、12以下の整数ではない場合はエラーになり、スクリプトが停止します。

スクリプト


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

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

  const ui = SpreadsheetApp.getUi()

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

  // メニューに追加するボタン
  menu.addItem('指定した年月のカレンダーを生成', 'generate_calendar_month');

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

function generate_calendar_month() {

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

  // URLを入力する
  const response = ui.prompt('カレンダーの年月を入力してください', '(入力例:2022/12)', ui.ButtonSet.OK_CANCEL);

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

  // 年と月に分割する
  let year = response.getResponseText().split('/')[0];
  let month = response.getResponseText().split('/')[1];

  // 想定外の入力値の場合は終了する
  if (!(1 <= year)) {
    ui.alert('年は1以上の整数を入力してください')
    return;
  }

  if (!(1 <= month && month <= 12)) {
    ui.alert('月は1〜12の整数を入力してください')
    return;
  }


  // 指定月の月初と月末の日付を取得する
  let date_start_of_month = new Date(year, month - 1, 1);
  let date_end_of_month = new Date(year, month, 0);

  // カレンダーリスト格納用配列
  let calendar_list = [];

  // 月初1日(ついたち)の曜日の初期値を取得する
  let start_day_of_week = date_start_of_month.getDay();

  // 1ヶ月分の日付と曜日を準備する
  for (let i = date_start_of_month.getDate(); i <= date_end_of_month.getDate(); i++) {

    calendar_list.push([i, start_day_of_week]);

    // 曜日は日曜日が0、土曜日が6
    // 1日ずつ加算し、土曜日を迎えたら0にリセットする
    if (start_day_of_week == 6) {
      start_day_of_week = 0;
    } else {
      start_day_of_week++;
    }
  }

  // カレンダー(表形式)を作成する。結果を格納する配列。1次元目が週、2次元目が日付。
  let calendar_table = [[], [], [], [], [], []];

  // 月内の週をカウントする
  let week_counter = 0;

  // リストをもとに、表形式に変換する
  for (let i = 0; i < calendar_list.length; i++) {

    if (i > 0 && calendar_list[i][1] == 0) {
      // 2周め以降かつ曜日が0(日曜日)なら次の週になる
      week_counter++;
    }

    // [N週目][曜日] = 日付 の形式で配列に格納していく
    calendar_table[week_counter][calendar_list[i][1]] = calendar_list[i][0];

  }

  // 月によっては5,6週目が存在しないため、カラの配列があれば削除する。
  if (calendar_table[5].length == 0) {
    calendar_table.splice(5, 1);
  }
  if (calendar_table[4].length == 0) {
    calendar_table.splice(4, 1);
  }

  // 最終週は要素の数が7個無い場合があるので追加する
  if (!calendar_table[calendar_table.length - 1][6]) {
    calendar_table[calendar_table.length - 1][6] = null;
  }

  // 曜日を追加する
  calendar_table.unshift(['日', '月', '火', '水', '木', '金', '土']);

  // 年/月を追加する
  calendar_table.unshift([year + '/' + month, null, null, null, null, null, null]);

  // シートへの書き込み処理。選択されているセルを起点に書き込む。
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  let range = sheet.getActiveCell();
  let row_active = range.getRow();
  let col_active = range.getColumn();

  range = sheet.getRange(row_active, col_active, calendar_table.length, 7);

  range.setValues(calendar_table);

}

関連するアプリ


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

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

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

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

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

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

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

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

【GASで時短】予定をすべて非公開にする

Googleカレンダーの予定を全て非公開にするGoogle Apps Scriptです。組織内で使っているとカレンダー自体は共有されていますので、隠したい予定は個別に非公開化する必要があります。誤って公開している予定が大量にある時にどうぞ。

【GASで時短】連続した日付(曜日、祝日付き)を生成する

アクティブセルを起点に、Nヶ月後までの日付を出力するGoogle Apps Scriptです。日本の祝日も表示してくれますので、予定表やガントチャートを作るときにどうぞ。

【GASで時短】月内の最終営業日を求める

指定した年、月の最終営業日を調べるGoogle Apps Scriptです。土日と日本の祝日を除いた月内最後の平日を知ることができます。

【GASで時短】月内の第1営業日を求める

指定した年、月の第1営業日を調べるGoogle Apps Scriptです。土日や休日を考慮した最初の営業日(平日)を知ることが出来ます。

【GASでサボる】カレンダーの空き時間をすべて埋める

指定した日の空いている時間すべてに予定を入れてくれるGoogle Apps Scriptです。予定を入れられたくないときにいかがでしょうか?

タグ一覧

最新のアプリ

人気のアプリ

ページトップに戻る
myfunc.jp