コンテンツにスキップ

$p.events.on_calendar_load

概要

カレンダーを読み込んだとき、もしくはフィルタ等で表示する内容が変わったときに実行するメソッドの指定方法を説明します。

制限事項

  1. 意図しないタイミングで処理が実行されてしまう等の影響がある場合を除き、出力先は「全て」を選択してください。
  2. 複数のスクリプトを作成し各スクリプトの内容に本関数を記述すると、スクリプトが上書きされるため、最新のもの以外は動作しません。回避策は以下FAQを参照してください。

構文

JavaScript
$p.events.on_calendar_load = function () {
    //処理内容
}

使用例

以下のサンプルコードをプリザンターのスクリプトへ設定すると、カレンダー画面を読み込んだときに画面下部にメッセージを表示します。

JavaScript
$p.events.on_calendar_load = function () {
    $p.setMessage('#Message', JSON.stringify({
        Css: 'alert-success',
        Text: 'カレンダー画面を読み込みました。'
        })
    );
}

サンプルコード

Note

コード内の【 ... 】は適宜修正してください。

1. カレンダーに祝日・会社休日を色付きで表示する

設備予約などのテーブルでカレンダーを開いたとき、別テーブル「祝日カレンダー」に登録した祝日・会社休日を取得し、該当する日のセルに色を付けて、名称をツールチップで表示します。$p.events.on_calendar_loadは、カレンダーを開いたときに加えて、前後の月への移動や月・週・日の表示切り替えのたびに発火するので、そのたびに表示中の期間の祝日を取得し直して色を付けます。

実務での使いどころ

カレンダーは設備・会議室の予約、貸出管理、休暇申請などでよく使われますが、標準で色が付くのは土曜・日曜のみで、祝日や会社独自の休日(年末年始・創立記念日など)は平日と同じに見えます。そのため、休日に予約や作業予定を入れてしまう、ということが起こります。

祝日カレンダーを1つ用意しておけば、予約・シフト・作業予定など、カレンダーを使うどのテーブルにもこのスクリプトを貼り付ければ祝日が表示されます。祝日カレンダーは、祝日を取り込むサンプル(items.Upsert・$p.apiUpsertに掲載)で作るテーブルをそのまま使えます。会社休日も同じテーブルに登録しておけば、色を分けて表示できます。

事前準備

1:祝日カレンダーとなる記録テーブルを用意してください。祝日を取り込むサンプルで作成したテーブルをそのまま使えます。

項目コード 内容
日付A(DateA) 日付
分類A(ClassA) 名称(例:文化の日、創立記念日)
分類B(ClassB) 区分。選択肢に「国民の祝日」「会社休日」を設定(会社休日の色を分ける場合のみ追加)

カレンダーを見る人には、祝日カレンダーの閲覧権限を付けてください。

2:祝日を表示したいテーブル(例:設備予約)で、「テーブルの管理 > カレンダー」タブの「カレンダー」を有効にしてください。項目の追加は不要です。

3:祝日を表示したいテーブルにスクリプトを登録します。

3-1:「テーブルの管理 > スクリプト」タブで「新規作成」を選択する。
 3-2:タイトル: 任意の名前(例:祝日表示)
 3-3:スクリプト: 下記サンプルコードを貼り付け、【サイトID】を祝日カレンダーのサイトIDに置き換える
 3-4:出力先:「一覧」と「カレンダー」の両方にチェック

出力先を「カレンダー」のみにすると、一覧画面からビューの切り替えでカレンダーを表示したときに祝日が表示されません。ビューの切り替えでは画面が読み込み直されず、一覧画面で読み込んだスクリプトのままカレンダーが表示されるためです。

JavaScript
/**
 * ================================================================
 * サンプル  カレンダーに祝日・会社休日を色付きで表示する
 * ================================================================
 *
 * 【概要】
 *   設備予約などのテーブルでカレンダーを開いたとき、別サイト「祝日カレンダー」に
 *   登録した祝日・会社休日を $p.apiGet で取得し、該当する日のセルに色を付けて、
 *   名称をツールチップで表示します。
 *   $p.events.on_calendar_load は、カレンダーを開いたときだけでなく、前後の月への
 *   移動や月・週・日の表示切り替えのたびに発火し、そのたびにセルが描き直されます。
 *   そのため、発火のたびに表示中の期間の分だけ祝日を取得し直して色を付けます。
 *
 * 【前提】
 *   祝日カレンダーは、祝日を取り込むサンプル(upsert-holidays-from-api.js /
 *   upsert-holidays-from-api-client.js)で作成したテーブルを使います。
 *     ・DateA : 日付
 *     ・ClassA: 名称(例:文化の日、創立記念日)
 *     ・ClassB: 区分(国民の祝日/会社休日)。会社休日の色を分ける場合だけ追加
 *   カレンダーを見る人は、祝日カレンダーの閲覧権限が必要です。
 *   カレンダーの種類は既定の FullCalendar を前提にしています。
 *
 * 【スクリプトの出力先】
 *   「一覧」と「カレンダー」の両方にチェックしてください。
 *   一覧画面からビューの切り替えでカレンダーにした場合、画面は読み込み直されず、
 *   一覧画面で読み込んだスクリプトのまま動きます。出力先を「カレンダー」だけに
 *   すると、この操作では on_calendar_load が登録されず、祝日が表示されません。
 *
 * コード内の【 ... 】は適宜修正してください。
 * ================================================================
 */

// ===== 設定 =====
// 祝日カレンダーのサイトID
const HOLIDAY_SITE_ID = 【サイトID】;
// 祝日カレンダーの項目
const HOLIDAY_DATE_COLUMN = 'DateA'; // 日付
const HOLIDAY_NAME_COLUMN = 'ClassA'; // 名称
const HOLIDAY_KIND_COLUMN = 'ClassB'; // 区分(使わない場合は '' にする)
// 区分がこの値のときは会社休日の色にする
const COMPANY_HOLIDAY_KIND = '会社休日';
// セルの背景色
const HOLIDAY_COLOR = '#ffe4e4'; // 国民の祝日
const COMPANY_HOLIDAY_COLOR = '#e4ecff'; // 会社休日

// FullCalendar の日のセルには data-date="2026-10-01"(ハイフン区切り)が付く。
// 月表示では td、週表示では見出しの th に付くため、属性だけで両方を拾う。
const DAY_CELL_SELECTOR = '[data-date]';

// ===== 処理 =====
// 表示中のセルから、表示期間の最初と最後の日(yyyy-mm-dd)を求める。
// 月表示は前後の月の日(例:10/26〜12/6)も含むため、月からではなくセルから求める。
function getDisplayedRange() {
    const dates = $(DAY_CELL_SELECTOR)
        .map(function () {
            return String($(this).attr('data-date')).slice(0, 10);
        })
        .get()
        .sort();
    if (dates.length === 0) {
        return null;
    }
    return { from: dates[0], to: dates[dates.length - 1] };
}

// 該当する日のセルに色とツールチップを付ける
function markHoliday(holiday) {
    // API の日付は「2026/11/03」のスラッシュ区切りで返るため、セルの形式に合わせる
    const date = String(holiday[HOLIDAY_DATE_COLUMN]).slice(0, 10).replace(/\//g, '-');
    const name = holiday[HOLIDAY_NAME_COLUMN] || '';
    const isCompanyHoliday =
        HOLIDAY_KIND_COLUMN !== '' && holiday[HOLIDAY_KIND_COLUMN] === COMPANY_HOLIDAY_KIND;

    $(DAY_CELL_SELECTOR)
        .filter(function () {
            return String($(this).attr('data-date')).slice(0, 10) === date;
        })
        .css('background-color', isCompanyHoliday ? COMPANY_HOLIDAY_COLOR : HOLIDAY_COLOR)
        .attr('title', name);
}

// カレンダーを開いたとき、月の移動や表示形式の切り替えのたびに呼ばれる
$p.events.on_calendar_load = function () {
    const range = getDisplayedRange();
    if (!range) {
        return;
    }

    // 取得する項目(区分を使わない場合は除く)
    const columns = [HOLIDAY_DATE_COLUMN, HOLIDAY_NAME_COLUMN];
    if (HOLIDAY_KIND_COLUMN !== '') {
        columns.push(HOLIDAY_KIND_COLUMN);
    }

    $p.apiGet({
        id: HOLIDAY_SITE_ID,
        data: {
            View: {
                // 項目名をキーにした形式で受け取る(DateA は「2026/11/03」の文字列になる)。
                // この2つは View の中に書く(View の外に書くと既定の形式で返る)
                ApiDataType: 'KeyValues',
                ApiColumnKeyDisplayType: 'ColumnName',
                GridColumns: columns,
                // 日付の範囲は配列形式の文字列で、開始と終了をカンマで区切る
                ColumnFilterHash: {
                    [HOLIDAY_DATE_COLUMN]: JSON.stringify([
                        `${range.from.replace(/-/g, '/')},${range.to.replace(/-/g, '/')}`,
                    ]),
                },
            },
        },
        done: function (data) {
            try {
                (data.Response.Data || []).forEach(markHoliday);
            } catch (e) {
                // 表示に失敗してもカレンダー自体は止めない
                console.log(`祝日の表示に失敗しました: ${e}`);
            }
        },
        fail: function (data) {
            // 取得に失敗してもカレンダーの表示は止めず、コンソールに記録するだけにする
            console.log('祝日カレンダーの取得に失敗しました', data);
        },
    });
};

HOLIDAY_SITE_IDには祝日カレンダーのサイトIDを指定します。区分(ClassB)を使わない場合は、HOLIDAY_KIND_COLUMNを''にしてください。すべて国民の祝日の色で表示されます。

注意点

  • スクリプトの出力先は「一覧」と「カレンダー」の両方にしてください。一覧画面からビューの切り替えでカレンダーにした場合、画面は読み込み直されず(URLのみが/calendarに変わります)、一覧画面で読み込んだスクリプトのまま動きます。出力先が「カレンダー」のみだと、この操作では$p.events.on_calendar_loadが登録されないため、祝日が表示されません。サイドメニューなどから直接カレンダーを開いた場合は、「カレンダー」のみでも動きます。
  • カレンダーの種類は既定のFullCalendarを前提にしています。日のセルに付くdata-date属性(2026-10-01のハイフン区切り)から表示期間を求め、色を付けるセルを探します。月表示では日のセル、週表示では日付の見出しに色が付きます。
  • 月表示には前後の月の日も含まれるため、表示期間は表示中のセルから求めています。
  • APIで取得した日付は2026/11/03のスラッシュ区切りの文字列で返るため、セルの形式(ハイフン区切り)に直して突き合わせています。
  • $p.apiGetのApiDataType・ApiColumnKeyDisplayTypeは、Viewの中に書いてください。Viewの外に書くと無視され、既定の形式で返ります。
  • 祝日カレンダーの取得に失敗しても、カレンダーの表示はそのまま続きます。失敗の内容はブラウザの開発者ツールのコンソールに出力されます。

関連情報