SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

高機能JavaScriptスプレッドシート部品「SpreadJS」の活用(AD)

ガントチャートをWebアプリに組み込める「ガントシート」でプロジェクト管理機能を作成してみよう

  • X ポスト
  • このエントリーをはてなブックマークに追加

レベル階層形式ガントシートの組み込み

 SpreadJSモジュールとカスタムCSSの準備ができたら、HTMLファイルなどを作成してガントシートを組み込んでいきましょう。

HTMLファイルの準備

 アプリの起点であるindex.htmlファイルを、以下のリストの内容で作業フォルダに作成します。(1)のCSSファイルの読み込みパスは、実際に使うCSSファイルに合わせてください。(2)以降のJavaScriptファイルの読み込みも同様です。(3)がガントシートアプリとデータの読み込みで、(4)がスプレッドシートが展開される要素です。

index.html
<!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フォルダに作成します。まずは、ガントシート作成処理以前の部分を、以下のリストの内容で作成します。

scripts/app.js(ワークブックの初期化)
// (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メソッドで描画を再開しています。

 続いて、レベル階層形式のガントシートの初期化関数です。

scripts/app.js(ガントシートの初期化)
// ガントシートの初期化関数(レベル階層)
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フォルダ配下に以下のリストの内容で作成します。全体は配布サンプルを参照してください。

scripts/data.js
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のようにガントシートが表示されれば、ここまでの手順はうまくいっています。以降は、コードの修正で自動的にページが更新されます。

図2 レベル階層によるガントチャートの例
図2 レベル階層によるガントシートの例

次のページ
ガントシートの活用例

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
高機能JavaScriptスプレッドシート部品「SpreadJS」の活用連載記事一覧

もっと読む

この記事の著者

WINGSプロジェクト 山内 直(WINGSプロジェクト ヤマウチ ナオ)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook <個人紹介>WINGSプロジェクト所属のテクニカルライター。出版社を経てフリーランスとして独立。ライター、エディター、デベロッパー、講師業に従事。屋号は「たまデジ。」。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

提供:メシウス株式会社

【AD】本記事の内容は記事掲載開始時点のものです 企画・制作 株式会社翔泳社

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/20541 2025/01/07 12:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング