Jspreadsheet 使い方メモ４-3（メソッド）

# はじめに
これは、[Jspreadsheet Advent Calendar 2024](https://qiita.com/advent-calendar/2024/jspreadsheet)の25日目の記事となります。

「[Handsontable 使い方メモ４（メソッド）](https://qiita.com/opengl-8080/items/e756af444147771fab18)」と比較しながら書いていきます。

※全てのメソッドは網羅していません。

全てのメソッドを確認したい場合は、[公式ドキュメント](https://bossanova.uk/jspreadsheet/v4/docs/quick-reference)を参照

メソッドの記事は長かったため、分割することにしました。

## 注意
現時点(2025/03/09)では、Jspreadsheet CE Version 4 を対象としています。
Version 5 のリリースにより見直す予定です。

https://bossanova.uk/jspreadsheet/docs/upgrade-from-v4-to-v5

# メソッド
## セルを指定してメタデータを設定する
Handsontableの`setCellMeta`のような機能はない。

Pro版なら、1つのセルに異なるセルタイプを設定する機能がある。

https://jspreadsheet.com/docs/examples/payment-calculator

`updateTable`オプションを使用することで、セルごとにスタイルなどの変更は可能。

https://bossanova.uk/jspreadsheet/v4/examples/table-scripting

## セルを指定して値を設定する
Handsontableの`setDataAtCell`の機能に近いものは、`setValue`にあたる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14053/95fd2e12-7428-4693-b20c-7daef6d773cc.png)

```js
let grid = document.getElementById('grid');

let table = new jspreadsheet(grid, {
  minDimensions: [5,5]
});

table.setDataAtCell = function(row, col, value) {
  this.setValue(this.getCellFromCoords(col, row), value);
}

table.setValue('B2', 'hoge');
table.setDataAtCell(2, 1, 'fuga');
```

* セル名(A1形式)を指定して値を取得する

セルのインデックスを指定して値を取得するには別途関数を作成する必要がある。
Handsontableに合わせて、引数は行,列の順番とした。

```js
table.setDataAtCell = function(row, col, value) {
  this.setValue(this.getCellFromCoords(col, row), value);
}
```

## 列名を指定してセルに値を設定する
Handsontableの`setDataAtRowProp`がないため、別途関数を作成する必要がある。

```js
let grid = document.getElementById('grid');

let table = new jspreadsheet(grid, {
  data: [
    { name: 'hoge' },
    { name: 'fuga' },
    { name: 'piyo' }
  ],
  columns: [
    { title: 'A', name: 'hoge' },
    { title: 'B', name: 'fuga' },
    { title: 'C', name: 'piyo' },
  ]
});

table.propToCol = function(prop) {
  const getIndex = (arr, target) => arr.findIndex(item => item.name === target);
  return getIndex(table.options.columns, prop);
}

table.setDataAtRowProp = function(row, prop, value) {
  const col = this.propToCol(prop);
  this.setDataAtCell(row, col, value);
}

table.setDataAtRowProp(2, 'fuga', 'FUGA');
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14053/88239f07-8ae7-4333-8337-2a9a21b27fe0.png)

## 列の要素を取り除きつつ、新しい要素を追加する
Handsontableの`spliceCol`のような機能はない。

## 行の要素を取り除きつつ、新しい要素を追加する
Handsontableの`spliceRow`のような機能はない。

## カラムを指定してソートする
Handsontableの`sort`の機能に近いものは、`orderBy`にあたる。

```js
let grid = document.getElementById('grid');

let table = new jspreadsheet(grid, {
  columnSorting: true,
  defaultColWidth: 80,
  data: [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
  ]
});

table.orderBy(2, 1);
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14053/bb6a7a47-5485-4369-bc3e-5538e8eba778.png)

* 第一引数に、ソートするカラムのインデックスを指定する
* 第二引数に、ソートの向きを指定する（0 が昇順、 1 が降順）

## オプションを更新する
Handsontableの`updateSettings`のような機能はない。
`options`プロパティで値を変更することは出来るが、それだけでは画面に反映されない。
`textContent`を使用することで画面に反映される。

```js
let grid = document.getElementById('grid');

let table = new jspreadsheet(grid, {
  colWidths: [200, 50]
});

document.getElementById('button').addEventListener('click', function() {
  ['one', 'two', 'three', 'four'].map((title, column) => {
    table.options.columns[column].title = title;
    table.headers[column].textContent = title;
    table.headers[column].setAttribute('title', title);
  });
});
```

ヘッダーの変更なら、`setHeader`メソッドがあるため、下記のように書き換えできる。

```js
document.getElementById('button').addEventListener('click', function() {
  ['one', 'two', 'three', 'four'].map((title, column) => {
    table.setHeader(column, title);
  });
});
```

![update.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14053/5ca1d333-eb8d-4cf7-9ea2-e10392181d70.gif)

## 全てのセルのバリデージョンを実行する
Handsontableの`validateCells`のような機能はない。

## アンドゥ・リドゥ
Handsontableの`undo`および`redo`と同じ機能がある。

![undoredo.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14053/3cfaff1e-2d13-42ca-8dad-64308702af82.gif)