$p.events.on_crosstab_load
概要¶
クロス集計を読み込んだとき、もしくはフィルタ等で表示する内容が変わったときに実行するメソッドの指定方法を説明します。
制限事項¶
- 意図しないタイミングで処理が実行されてしまう等の影響がある場合を除き、出力先は「全て」を選択してください。
-
複数のスクリプトを作成し各スクリプトの内容に本関数を記述すると、スクリプトが上書きされるため、最新のもの以外は動作しません。回避策は以下FAQを参照してください。
構文¶
JavaScript¶
使用例¶
以下のサンプルコードをプリザンターのスクリプトへ設定すると、クロス集計画面を読み込んだときに画面下部にメッセージを表示します。
JavaScript¶
$p.events.on_crosstab_load = function () {
$p.setMessage('#Message', JSON.stringify({
Css: 'alert-success',
Text: 'クロス集計を読み込みました。'
})
);
}
サンプルコード¶
Note
コード内の【 ... 】は適宜修正してください。
1. クロス集計で、工数の上限を超えたセルを色で強調する
作業日報をクロス集計で「担当者×月」の工数合計として表示するとき、各セルの値を読み、月の上限(例:45時間)を超えたセルを赤、上限の8割以上のセルを黄色で塗ります。セルにマウスを乗せると「上限45時間に対し50時間」のように表示します。$p.events.on_crosstab_loadは、クロス集計を開いたときに加えて、前後の期間への移動や、行・列などの設定を変えて描き直すたびに発火するので、そのたびに色を付け直します。
実務での使いどころ¶
クロス集計は数字の表のため、担当者が多く月数が長いと、上限を超えている人を目で探すのは大変です。このサンプルを使うと、上限を超えたセルと、超えそうなセルが色で分かるため、残業時間の管理や、担当者ごとの負荷の偏りの確認にそのまま使えます。
集計の条件(担当者×月、合計)はクロス集計の標準の設定で行い、スクリプトは表示された値に色を付けるのみです。上限の値と色を変えれば、売上の目標達成率や、在庫数の下限割れなど、ほかの「しきい値を超えたセルを目立たせる」用途にも使えます。
事前準備¶
1:テーブル(記録テーブル)に以下の項目を有効化してください。
| 項目コード | 内容 |
|---|---|
| タイトル(Title) | 作業内容 |
| 担当者(Owner) | 担当者(クロス集計の行) |
| 日付A(DateA) | 作業日(クロス集計の列) |
| 数値A(NumA) | 工数(時間)(クロス集計の値) |
2:スクリプトを登録します。
2-1:「テーブルの管理 > スクリプト」タブで「新規作成」を選択する。
2-2:タイトル: 任意の名前(例:工数の上限の強調)
2-3:スクリプト: 下記サンプルコードを貼り付け
2-4:出力先:「クロス集計」にチェック。一覧画面からビューの切り替えでクロス集計にする使い方もする場合は「一覧」にもチェック
3:クロス集計を開き、行を「担当者」、列を「日付A」、期間を「月」、集計種別を「合計」、値を「数値A」にします。
JavaScript¶
/**
* ================================================================
* サンプル クロス集計で、工数の上限を超えたセルを色で強調する
* ================================================================
*
* 【概要】
* 作業日報をクロス集計で「担当者×月」の工数合計として表示するとき、
* 各セルの値を読み、月の上限(例:45時間)を超えたセルを赤、
* 上限の8割以上のセルを黄色で塗ります。セルにマウスを乗せると
* 「上限45時間に対し50時間」のように表示します。
* $p.events.on_crosstab_load は、クロス集計を開いたときだけでなく、
* 前後の期間への移動や、行・列などの設定を変えて描き直すたびに発火します。
* 描き直すと色は消えるため、発火のたびに付け直します。
*
* 【前提】
* クロス集計の設定:行=担当者、列=作業日(期間:月次)、
* 集計種別=合計、値=工数(数値項目)。
* 集計種別が「件数」など合計以外のときも同じように色を付けるため、
* 上限の値はその集計に合わせて決めてください。
*
* 【スクリプトの出力先】
* 「クロス集計」にチェックしてください。一覧画面からビューの切り替えで
* クロス集計にする使い方もする場合は「一覧」にもチェックしてください
* (ビューの切り替えでは画面が読み込み直されず、一覧画面で読み込んだ
* スクリプトのまま動くため)。
* ================================================================
*/
// ===== 設定 =====
// 月の上限(時間)
const MONTHLY_LIMIT = 45;
// 上限に対してこの割合以上なら注意の色にする
const WARNING_RATIO = 0.8;
// セルの背景色
const OVER_COLOR = '#ffc7c7'; // 上限超え
const WARNING_COLOR = '#fff2b3'; // 上限の8割以上
// ===== 処理 =====
// セルの値を数値で読む。
// セルには「集計値の文字」のあとに棒グラフ(svg)が続くことがあるため、
// セル全体の文字ではなく、最初の文字のかたまりだけを読む。
// 桁区切りのカンマは取り除く。値が無いセルは null を返す。
function readCellValue($cell) {
const textNode = $cell.contents().filter(function () {
return this.nodeType === Node.TEXT_NODE && this.nodeValue.trim() !== '';
})[0];
if (!textNode) {
return null;
}
const value = Number(textNode.nodeValue.replace(/,/g, '').trim());
return isNaN(value) ? null : value;
}
// クロス集計を開いたとき、期間の移動や設定の変更で描き直すたびに呼ばれる
$p.events.on_crosstab_load = function () {
// 本体の行(tr.crosstab-row)の td だけを対象にする。
// 列の見出し(thead th)と、行の見出し(行の先頭の th。「担当者 : 合計」の形)は
// 合計を表すので対象にしない
$('#CrosstabBody tr.crosstab-row > td').each(function () {
const $cell = $(this);
const value = readCellValue($cell);
if (value === null) {
return;
}
let color = '';
if (value > MONTHLY_LIMIT) {
color = OVER_COLOR;
} else if (value >= MONTHLY_LIMIT * WARNING_RATIO) {
color = WARNING_COLOR;
}
if (color) {
$cell
.css('background-color', color)
.attr('title', `上限${MONTHLY_LIMIT}時間に対し${value}時間`);
}
});
};
注意点¶
- 色を付けるのは集計値のセルのみです。列の見出し(「2026/10 : 93」)と行の見出し(「Administrator : 90」)は合計を表すので、対象にしていません。
- セルの値は、セルの最初の文字から読みます。セルには集計値のあとに棒グラフが続くことがあるためです。桁区切りのカンマは取り除いてから数値にします。
- 集計種別が「件数」「平均」などでも同じように色を付けます。上限の値は、その集計に合わせて決めてください。
