概要と基本的な使い方

テーブルシートは、テーブルを簡単に設計できるように、組み込みの書式やセル型が定義された列(数値、テキスト、数式、ルックアップ、日付、チェックボックス、選択、通貨、パーセント、電話番号、メールアドレス、URL、作成日時、変更日時、添付ファイル、バーコード)の追加、更新、削除を行う機能を提供します。

説明
app.js
index.html
styles.css

テーブルシートでは、enableDefineColumnプロパティを設定することで、列ヘッダーに「+」(列の追加)ボタン、列ヘッダーのコンテキストメニューに「列を修正」、「列を削除」および「主キーの設定/解除」を表示に切り替えることができます:

interface GC.Spread.Sheets.TableSheet.ITableSheetOptions {
  // その他のプロパティ...
  enableDefineColumn?: boolean;
}

列のタイプ

interface GC.Data.IColumn {
    type: string, // 組込みの列タイプ: 数値、テキスト、数式、チェックボックス、日付、通貨、パーセント、電話番号、メールアドレス、URL、ルックアップ、作成日時、更新日時、添付ファイル、選択、バーコード
}

列のタイプの説明は以下の通りです:

列のタイプ データ型 説明
数値 number 指定された書式で数値を表示します。
テキスト string テキストを表示します。
数式 計算結果に依存 他のフィールドに基づいて計算します。
ルックアップ 関連データに依存 関連レコードの特定フィールドを参照します。
日付 date 日付を簡単に入力できます。
チェックボックス boolean TRUE/FALSEのデータ型でチェック/チェック外しを行います。
選択肢 オプションに依存 事前に定義されたリストからオプションを選択します。
通貨 number カルチャーに応じた書式で通貨を表示します。
パーセント number パーセントとして書式設定された数値を表示します。
電話番号 string マスク検証を使用して数値の文字列を表示します。
メールアドレス string マスク検証を使用してメールアドレスを表示します。
URL string URLを表示します。
作成日時 date レコードの作成日時を設定します。
更新日時 date レコードの更新日時を設定します。
添付ファイル object レコードに直接ファイルを添付することができます。
バーコード 入力値に依存 フィールドから指定されたバーコードを生成します。

構成

リモートテーブルと通信するためには、APIを設定する必要があります。

API 説明
getColumns テーブルから列を取得します。
addColumn テーブルに列を追加します。
updateColumn 列のプロパティを更新します。
removeColumn テーブルの列を削除します。
batch バッチモードで変更を一括送信します。
var apiForDataUrl = './orders', apiForColumnUrl = './tables/order/columns';
var orderTable = dataManager.addTable("orderTable", {
        remote: {
            read: {
                url: apiForDataUrl,
            },
            update: {
                url: apiForDataUrl,
                method: 'PUT'
            },
            create: {
                url: apiForDataUrl,
            },
            delete: {
                url: apiForDataUrl,
            },
            getColumns: {
                url: apiForColumnUrl
            },
            addColumn: {
                url: apiForColumnUrl,
                method: 'POST'
            },
            updateColumn: {
                url: apiForColumnUrl,
                method: 'PUT'
            },
            removeColumn: {
                url: apiForColumnUrl,
                method: 'DELETE'
            },
            // batch: {
            //     url: './batch',
            // }
        },
        autoSync: true,
        // batch: true
    });

列のリモートAPIは、 要求の処理の自己定義関数のように構成されます。

要求と応答

type Column = {
    field: string, // フィールド
    dataType: 'number' | 'string' | 'boolean', // リモートデータソースで別のデータ型に変換される可能性がある
    defaultValue?: 'number' | 'string' | 'boolean' | 'undefined', // デフォルト値
    isPrimaryKey?: boolean, // 主キーかどうかを設定
}
type ColumnData = {
    column: Column,
}
type ColumnWithDefaultData = {
    column: Column,
    data?: any[], // 場合によっては、クライアントからのデータをリモートデータソースに同期する必要がある
}
type ModifiedColumnData = {
    column: Column,
    originalColumn: Column,
}
type BatchItemData = {
    type: "updateColumn" | "addColumn" | "removeColumn", // 列の変更項目に関するオプションのみを表示し、全体の変更は列とデータが含まれる(存在する場合)
    column: Column,
    data?: any[],
    originalColumn?: Column,
}
type BatchResultData = {
    succeed: boolean,
    reason?: string,
}
操作 要求 応答
getColumns None Column[]
addColumn ColumnWithDefaultData ColumnData
updateColumn ModifiedColumnData ModifiedColumnData
removeColumn ColumnData ColumnData
batch BatchItemData[] BatchResultData[]

コマンド

UI操作以外、コマンドを実行して列を定義することができます。

DefineColumn

DefineColumnコマンドで列を追加できます:

/**
 * GC.Spread.Sheets.Commands.DefineColumn: { canUndo: boolean, execute(context: GC.Spread.Sheets.Workbook, options: {sheetName: string, col?: number, column: GC.Data.IColumn}): any}
 * 列を定義するために使用されるコマンド。
 * @property {boolean} canUndo - コマンドが元に戻す (Undo) とやり直す (Redo) 操作をサポートしているかどうかを示します。
 * @property {function} execute - 実行または元に戻す操作を行います。
 * executeメソッドの引数は以下の通りです。
 * @param {GC.Spread.Sheets.Workbook} context 操作のワークブック。
 * @param {Object} options 操作のオプション。
 * @param {string} options.sheetName シート名。
 * @param {number} [options.col] 挿入列の列番号 (オプション)。
 * @param {GC.Data.IColumn} options.column 定義された列。
 * @param {boolean} isUndo 元に戻す操作が実行された場合は `true`、そうでない場合は `false`。
 */

spread.commandManager().execute({
  cmd: "DefineColumn",
  sheetName: spread.getActiveSheetTab().name(),
  // col: 3, // 列番号(オプション)
  column: {
    type: 'Number', // 列のタイプを指定
    value: 'Number1', // 値
    caption: '# Number1', // 列のキャプション
    style: { 
      formatter: '#,##0.00_);[Red](#,##0.00)' // 列の書式設定、UI操作から変更可能
    }
  } as GC.Data.IColumn,
});

ModifyColumn

ModifyColumnコマンドで列を変更できます:

/**
 * field GC.Spread.Sheets.Commands.ModifyColumn: { canUndo: boolean, execute(context: GC.Spread.Sheets.Workbook, options: {sheetName: string, col: number, column: GC.Data.IColumn}): any}
 * 列を変更するために使用されるコマンド。
 * @property {boolean} canUndo - コマンドが元に戻す (Undo) とやり直す (Redo) 操作をサポートしているかどうかを示します。
 * @property {function} execute - 実行または元に戻す操作を行います。
 * execute メソッドの引数は以下の通りです。
 * @param {GC.Spread.Sheets.Workbook} context 操作のワークブック。
 * @param {Object} options 操作のオプション。
 * @param {string} options.sheetName シート名。
 * @param {number} options.col 指定された列番号。
 * @param {GC.Data.IColumn} options.column 変更された列。
 * @param {boolean} isUndo 元に戻す操作が実行された場合は `true`、そうでない場合は `false`。
 */
spread.commandManager().execute({
  cmd: "ModifyColumn",
  sheetName: spread.getActiveSheetTab().name(),
  col: 3,
  column: {
    type: 'Text', // 列のタイプを指定
    value: 'Text1', // 値
    caption: 'A Text1', // 列のキャプション
  } as GC.Data.IColumn,
});

RemoveColumn

RemoveColumnコマンドで列を削除できます:

/**
 * field GC.Spread.Sheets.Commands.RemoveColumn: { canUndo: boolean, execute(context: GC.Spread.Sheets.Workbook, options: {sheetName: string, col: number}): any}
 * 列を削除するために使用されるコマンド。
 * @property {boolean} canUndo - コマンドが元に戻す (Undo) とやり直す (Redo) 操作をサポートしているかどうかを示します。
 * @property {function} execute - 実行または元に戻す操作を行います。
 * execute メソッドの引数は以下の通りです。
 * @param {GC.Spread.Sheets.Workbook} context 操作のワークブック。
 * @param {Object} options 操作のオプション。
 * @param {string} options.sheetName シート名。
 * @param {number} options.col 指定された列番号。
 * @param {GC.Data.IColumn} options.column 変更された列。
 * @param {boolean} isUndo 元に戻す操作が実行された場合は `true`、そうでない場合は `false`。
 */
spread.commandManager().execute({
  cmd: "RemoveColumn",
  sheetName: spread.getActiveSheetTab().name(),
  col: 3,
});
テーブルシートでは、enableDefineColumnプロパティを設定することで、列ヘッダーに「+」(列の追加)ボタン、列ヘッダーのコンテキストメニューに「列を修正」、「列を削除」および「主キーの設定/解除」を表示に切り替えることができます: 列のタイプ 列のタイプの説明は以下の通りです: 列のタイプ データ型 説明 数値 number 指定された書式で数値を表示します。 テキスト string テキストを表示します。 数式 計算結果に依存 他のフィールドに基づいて計算します。 ルックアップ 関連データに依存 関連レコードの特定フィールドを参照します。 日付 date 日付を簡単に入力できます。 チェックボックス boolean TRUE/FALSEのデータ型でチェック/チェック外しを行います。 選択肢 オプションに依存 事前に定義されたリストからオプションを選択します。 通貨 number カルチャーに応じた書式で通貨を表示します。 パーセント number パーセントとして書式設定された数値を表示します。 電話番号 string マスク検証を使用して数値の文字列を表示します。 メールアドレス string マスク検証を使用してメールアドレスを表示します。 URL string URLを表示します。 作成日時 date レコードの作成日時を設定します。 更新日時 date レコードの更新日時を設定します。 添付ファイル object レコードに直接ファイルを添付することができます。 バーコード 入力値に依存 フィールドから指定されたバーコードを生成します。 構成 リモートテーブルと通信するためには、APIを設定する必要があります。 API 説明 getColumns テーブルから列を取得します。 addColumn テーブルに列を追加します。 updateColumn 列のプロパティを更新します。 removeColumn テーブルの列を削除します。 batch バッチモードで変更を一括送信します。 列のリモートAPIは、 要求の処理の自己定義関数のように構成されます。 要求と応答 操作 要求 応答 getColumns None Column[] addColumn ColumnWithDefaultData ColumnData updateColumn ModifiedColumnData ModifiedColumnData removeColumn ColumnData ColumnData batch BatchItemData[] BatchResultData[] コマンド UI操作以外、コマンドを実行して列を定義することができます。 DefineColumn DefineColumnコマンドで列を追加できます: ModifyColumn ModifyColumnコマンドで列を変更できます: RemoveColumn RemoveColumnコマンドで列を削除できます:
/*REPLACE_MARKER*/ /*DO NOT DELETE THESE COMMENTS*/ window.onload = function() { var spread = new GC.Spread.Sheets.Workbook(document.getElementById("ss"), { sheetCount: 0 }); initSpread(spread); }; function initSpread(spread) { spread.suspendPaint(); spread.options.autoFitType = GC.Spread.Sheets.AutoFitType.cellWithHeader; spread.clearSheets(); var dataManager = spread.dataManager(); initDefineOrderTable(spread, dataManager); spread.resumePaint(); } function initDefineOrderTable(spread, dataManager) { spread.options.allowDynamicArray = true; var apiUrl = getApiUrl("DefineOrder"), apiColumnUrl = getColumnApiUrl("DefineOrder"); var orderTable = dataManager.addTable("orderTable", { remote: { read: { url: apiUrl, }, update: { url: apiUrl, method: 'PUT' }, create: { url: apiUrl, }, delete: { url: apiUrl, }, getColumns: { url: apiColumnUrl }, addColumn: { url: apiColumnUrl, method: 'POST' }, updateColumn: { url: apiColumnUrl, method: 'PUT' }, removeColumn: { url: apiColumnUrl, method: 'DELETE' }, // batch: { // url: apiUrl + 'Collection' // } }, schema: { // テーブルに存在している列のオプションを定義できます columns: { Id: { isPrimaryKey: true }, OrderDate: { dataType: 'date' }, RequiredDate: { dataType: 'date' }, ShippedDate: { dataType: 'date' }, ShipVia: { dataType: 'number', type: 'Select', style: { cellType: { type: 'combobox', editorValueType: 'value', items: [ { text: 'Speedy Express', value: 1 }, { text: 'United Package', value: 2 }, { text: 'Federal Shipping', value: 3 } ] } }, }, Freight: { dataType: 'number', type: 'Currency', style: { formatter: '[$$-409]#,##0.00' }, }, CreatedTime: { type: "CreatedTime", dataType: 'date', trigger: { when: "onNew", formula: "=NOW()" }, readonly: true, defaultValue: '=NOW()', style: { formatter: "m/d/yy h:mm;@" }, }, ModifiedTime: { type: "ModifiedTime", dataType: 'date', trigger: { when: "onNewAndUpdate", formula: "=NOW()", fields: "*" }, readonly: true, style: { formatter: "[$-409]m/d/yy h:mm AM/PM;@" }, }, OrderAttachment: { type: 'Attachment', style: { cellType: { type: 'fileUpload' } }, }, OrderCode: { type: 'Barcode', defaultValue: '=FLOOR.MATH(RAND()*100000000)', style: { formatter: '=BC_GS1_128([@OrderCode],"#000000","#FFFFFF",false,,,,,,,,,,,)' }, }, } }, autoSync: true, // batch: true, }); var employeeTable = dataManager.addTable("employeeTable", { remote: { read: { url: getApiUrl("Employee") } }, schema: { columns: { Id: { isPrimaryKey: true }, BirthDate: { dataType: 'date' }, HireDate: { dataType: 'date' }, } }, autoSync: true }); var customerTable = dataManager.addTable("customerTable", { remote: { read: { url: getApiUrl("Customer") } }, schema: { columns: { Id: { isPrimaryKey: true }, } }, autoSync: true }); dataManager.addRelationship(orderTable, "EmployeeId", "employee", employeeTable, "Id", "orders"); dataManager.addRelationship(orderTable, "CustomerId", "customer", customerTable, "Id", "orders"); var tableSheet = spread.addSheetTab(0, "Orders", GC.Spread.Sheets.SheetType.tableSheet); tableSheet.options.allowAddNew = true; tableSheet.options.enableDefineColumn = true; var rowActions = GC.Spread.Sheets.TableSheet.BuiltInRowActions; var options = tableSheet.rowActionOptions(); options.push( rowActions.removeRow, rowActions.saveRow, rowActions.resetRow, ); tableSheet.rowActionOptions(options); var orderView = orderTable.addView("orderView", [ { value: "Id", width: 50 }, { value: "CustomerId", defaultValue: 'ALFKI', visible: false }, { value: "EmployeeId", defaultValue: 1, visible: false }, { value: "customer.ContactName", caption: 'Contact', width: 100 }, { value: '=CONCAT([@employee.FirstName], " ", [@employee.LastName])', caption: 'Employee', width: 110 }, { value: "OrderDate", width: 100, style: { formatter: "m/d/yyyy", allowEditInCell: false } }, { value: "ShipVia", width: 140 }, { value: "Freight", width: 80, defaultValue: 0 }, { value: "ShipName" }, { value: '=CONCAT([@ShipState], ", ", [@ShipCity], ", ", [@ShipRegion])', caption: 'Ship State', visible: false }, { value: 'OrderAttachment', caption: 'Attachment', visible: false }, { value: 'OrderCode', caption: 'Logistic Code', width: 160, visible: false }, { value: 'CreatedTime', caption: 'Created Time', width: 160, visible: false }, { value: 'ModifiedTime', caption: 'Modified Time', width: 160, visible: false }, ], null, { defaultColumnWidth: 120 }); orderView.fetch().then(function () { tableSheet.setDataView(orderView); }); } function getBaseApiUrl() { return window.location.href.match(/http.+spreadjs\/demos\//)[0] + 'server/api'; } function getApiUrl(tableName) { return getBaseApiUrl() + "/" + tableName; } function getColumnApiUrl(tableName) { return getBaseApiUrl() + "/tables/" + tableName + "/columns"; }
<!doctype html> <html style="height:100%;font-size:14px;"> <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta name="spreadjs culture" content="ja-jp" /> <link rel="stylesheet" type="text/css" href="$DEMOROOT$/ja/purejs/node_modules/@mescius/spread-sheets/styles/gc.spread.sheets.excel2013white.css"> <!-- Promise Polyfill for IE, https://www.npmjs.com/package/promise-polyfill --> <script src="https://cdn.jsdelivr.net/npm/promise-polyfill@8/dist/polyfill.min.js"></script> <script src="$DEMOROOT$/ja/purejs/node_modules/@mescius/spread-sheets/dist/gc.spread.sheets.all.min.js" type="text/javascript"></script> <script src="$DEMOROOT$/ja/purejs/node_modules/@mescius/spread-sheets-barcode/dist/gc.spread.sheets.barcode.min.js" type="text/javascript"></script> <script src="$DEMOROOT$/ja/purejs/node_modules/@mescius/spread-sheets-tablesheet/dist/gc.spread.sheets.tablesheet.min.js" type="text/javascript"></script> <script src="$DEMOROOT$/ja/purejs/node_modules/@mescius/spread-sheets-resources-ja/dist/gc.spread.sheets.resources.ja.min.js" type="text/javascript"></script> <script src="$DEMOROOT$/spread/source/js/license.js" type="text/javascript"></script> <script src="app.js" type="text/javascript"></script> <link rel="stylesheet" type="text/css" href="styles.css"> </head> <body> <div class="sample-tutorial"> <div id="ss" class="sample-spreadsheets"></div> </div> </html>
.sample-tutorial { position: relative; height: 100%; overflow: hidden; } body { position: absolute; top: 0; bottom: 0; left: 0; right: 0; } .sample-spreadsheets { width: 100%; height: 100%; overflow: hidden; float: left; }