レベル階層形式ガントシートの組み込み
SpreadJSモジュールとカスタムCSSの準備ができたら、HTMLファイルなどを作成してガントシートを組み込んでいきましょう。
HTMLファイルの準備
アプリの起点であるindex.htmlファイルを、以下のリストの内容で作業フォルダに作成します。(1)のCSSファイルの読み込みパスは、実際に使うCSSファイルに合わせてください。(2)以降のJavaScriptファイルの読み込みも同様です。(3)がガントシートアプリとデータの読み込みで、(4)がスプレッドシートが展開される要素です。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="stylesheet" type="text/css" href="css/gc.spread.sheets.excel2013white.17.1.5.css"> (1)
<script src="scripts/gc.spread.sheets.all.17.1.5.min.js"></script> (2)
<script src="scripts/gc.spread.sheets.tablesheet.17.1.5.min.js"></script>
<script src="scripts/gc.spread.sheets.ganttsheet.17.1.5.min.js"></script>
<script src="scripts/gc.spread.sheets.resources.ja.17.1.5.min.js"></script>
<script src="scripts/app.js"></script> (3)
<script src="scripts/data.js"></script>
<link rel="stylesheet" type="text/css" href="css/styles.css">
</head>
<body style="height: 100%; font-size: 14px;">
<div class="sample">
<div id="ss" class="spreadsheets"></div> (4)
</div>
</body>
</html>
JavaScriptファイルの準備
ガントシートを表示するためのapp.jsファイルを、scriptsフォルダに作成します。まずは、ガントシート作成処理以前の部分を、以下のリストの内容で作成します。
// (1)ライセンスキーと言語の設定
//GC.Spread.Sheets.LicenseKey = "ここにSpreadJSのライセンスキーを設定します";
GC.Spread.Common.CultureManager.culture("ja-jp");
// (2)ページ読み込み後にワークブックを初期化する
window.onload = () => {
const spread = new GC.Spread.Sheets.Workbook(document.getElementById("ss"), {
sheetCount: 0
});
initSpread(spread); // スプレッドシートの初期化
};
// (3)スプレッドシートの初期化関数
function initSpread(spread) {
spread.suspendPaint(); // 描画の停止
initGanttSheetLevel(spread); // レベル階層形式ガントシートの初期化
spread.resumePaint(); // 描画の再開
}
(1)のライセンスキーの設定では、各自が入手したライセンスキーを記述してください。ライセンスキーを設定せずにトライアル版として利用する場合には、1行目をコメントアウトしてください。この場合、実行時にトライアル版であることを示すメッセージが表示されます。
(2)は、ページ読み込み終了時のイベントハンドラ(onload)で、ワークブックを初期化しています。表示領域となるHTML要素(id="ss")を指定してWorkbookオブジェクトを生成します。sheetCountプロパティをゼロに設定しているのは、初期状態でシートを作成しないことを意味します。
(3)は、ワークブックの生成後に呼び出されるinitSpread関数です。ここでは、ガントシート描画中の画面のちらつきを抑えるために、suspendPaintメソッドで描画を保留し、initGanttSheetLevel関数の呼び出し後に、resumePaintメソッドで描画を再開しています。
続いて、レベル階層形式のガントシートの初期化関数です。
// ガントシートの初期化関数(レベル階層)
function initGanttSheetLevel(spread) {
// (1)データマネージャの取得とテーブルの作成
const dataManager = spread.dataManager();
const table = dataManager.addTable("linkTable", {
data: getDataLevel(), // バインドするデータの指定
batch: true, // 同期モードにバッチを指定
schema: { // スキーマの指定
hierarchy: {
type: "Level", // レベル階層形式の指定
column: "level" // レベルはlevelプロパティで指定
}
}
});
// (2)ガントシートの追加と外見の設定
const ganttSheet = spread.addSheetTab(0, "レベル階層プロジェクト",
GC.Spread.Sheets.SheetType.ganttSheet); // ガントシートのシートを追加
//ganttSheet.project.startDate = new Date("2024/11/13 09:00"); // 開始日時(省略時は現在日時)
ganttSheet.gridlines.bottomTierColumn.lineType = // 縦線をダッシュに
GC.Spread.Sheets.GanttSheet.GanttGridlineType.dashed;
ganttSheet.gridlines.ganttRows = { // 横線は細線のグレー
lineType: GC.Spread.Sheets.GanttSheet.GanttGridlineType.thin,
lineColor: "lightgray",
}
// (3)ビューの作成
const view = table.addView("linkView", [
{ value: "taskNumber", caption: "NO.", width: 70 },
{ value: "name", caption: "タスク名", width: 260 },
{ value: "pic", caption: "担当責任者", width: 120 },
{ value: "duration", caption: "予定工数", width: 90 }
]);
// (4)データの読み込みとビューのバインド
view.fetch().then(() => {
ganttSheet.bindGanttView(view);
}).then(() => {
// (5)タイムスケールの設定
const tierMode =
GC.Spread.Sheets.GanttSheet.TimescaleTierMode.topMiddleBottom; // 上段、中段、下段の全てを指定
ganttSheet.project.timescale.tierMode = tierMode;
ganttSheet.project.timescale.topTier.unit =
GC.Spread.Sheets.GanttSheet.TimescaleUnit.months; // 上部は月表示
ganttSheet.project.timescale.topTier.formatter = "yyyy年mm月"; // 月表示のフォーマット
});
}
initGanttSheetLevel関数は、ガントシートを初期化します。
(1)以降は、データ管理をつかさどるデータマネージャオブジェクトをdataManagerで取得し、addTableメソッドでテーブルを追加しています。テーブルは、名前("linkTable")とオプションで構成されます。以下は、それぞれのプロパティの意味です。
- data:バインドするデータを表します。ここでは後述するgetDataLevel関数から返される配列を渡しています。
- batch:リモートデータベースの更新方法をBatchモードに指定します。通信効率の向上のために、スプレッドシートの変更を保存し、一度に更新するようになります。サンプルには更新処理はありませんが、ガントシートでは、batchプロパティをtrueに設定する必要があります。
- schema:データの構成を指定します。レベル階層形式では、hierarchy.typeプロパティに"Level"を、columnプロパティにはレベルを指定するデータソース上のプロパティ(この場合は"level")を指定します。
(2)以降は、addSheetTabメソッドでシートタブを追加し、外見を設定しています。addSheetTabメソッドの引数は、前から「位置(ここでは0=先頭)」「名前(ここでは"レベル階層プロジェクト")」を意味します。gridlinesプロパティは、名前の通り、グリッド線の見た目を設定します。なお、サンプルではコメントアウトしていますが、project.startDateプロパティを設定すると、プロジェクトの開始日を指定できます。省略時は、現在日時となります。
(3)以降では、テーブルに対応するビューを作成します。ここで、個々の列情報を指定できます。それぞれのプロパティの意味は、以下の通りです。
- value:列名
- caption:キャプション
- width:表示幅
- visible:列を表示するか
表示したい列を追加する場合には、ここに列情報を追加していきます。
あとは、(4)のfetchメソッドでデータを読み込み、bindGanttViewメソッドでガントシートにバインドするだけです。なお、必須ではありませんが、(5)のように、タイムスケールの表示をカスタマイズすることも可能です。なお、タイムスケールとはガントチャート部の列ヘッダーです。最大3段階の表示が可能で、月、週、日などの期間を表示できます。
データソースの準備
レベル階層形式のデータソースとして、data.jsファイルをscriptsフォルダ配下に以下のリストの内容で作成します。全体は配布サンプルを参照してください。
function getDataLevel() {
const Gantt_Data = [
{
"id": 1,
"level": 0, (1)
"taskNumber": 1,
"name": "要件定義",
"duration": "6 days",
"pic": "正門 恵子"
},
…略
]
return Gantt_Data;
}
データソースにおけるポイントは(1)のlevelプロパティで、レベル階層形式においてレベルを指定することです。スキーマ設定におけるhierarchy.columnプロパティに指定した名前である必要があります。値には、レベルを整数値で指定します。数値に応じた階層に項目が配置されます。
実行確認
ここまで作成すると、実行確認できます。VSCodeのエクスプローラーからindex.htmlファイルを右クリックして、メニューから[Open with Live Server]をクリックしてサーバを起動します。図2のようにガントシートが表示されれば、ここまでの手順はうまくいっています。以降は、コードの修正で自動的にページが更新されます。

