【jExcel.js】セルへのペースト時に数式が再計算されない(jExcel.js 3.0.1)
以前からWebのスプレッドシートが欲しかったので、ずっと探していたのだけれど、SlickGrid.jsが難しすぎたので結局jExcel.jsに行きつきました。
こちらの方がJavaScript初心者の自分には分かりやすかったでした。
ただ、まぁ未完成な部分が多いようで、機能不足やバグもちらほら。
なので、MITライセンスということがあるので、自分好みに修正をしていくことにしました。
※英語が話せないし、書けないので開発元にはNo連絡でございます。
今回は、動作確認している最中に、タイトル通りの現象があったので調べてみたところ、
obj.pasteの関数の4866行目辺りを、以下のようにobj.setValueからupdateFormulaChainの関数を持って来ればOKです。
// オリジナル
// Go through the columns to get the data
while (row = data[j]) {
i = 0;
var colIndex = parseInt(x);
while (row[i] != null) {
// Update and keep history
var record = obj.updateCell(colIndex, rowIndex, row[i]);
// Keep history
records.push(record)
// こんな感じにする
// Go through the columns to get the data
while (row = data[j]) {
i = 0;
var colIndex = parseInt(x);
while (row[i] != null) {
// Update and keep history
var record = obj.updateCell(colIndex, rowIndex, row[i]);
// Update formula chain
var updateFormulaChain = function(colIndex, rowIndex) {
var cellId = jexcel.getColumnNameFromId([colIndex, rowIndex]);
if (obj.formula[cellId] && obj.formula[cellId].length > 0) {
for (var loop_tmp = 0; loop_tmp < obj.formula[cellId].length; loop_tmp++) {
var cell = jexcel.getIdFromColumnName(obj.formula[cellId][loop_tmp], true);
// Update cell
var value = "" + obj.options.data[cell[1]][cell[0]];
if (value.substr(0,1) == "=") {
records.push(obj.updateCell(cell[0], cell[1], value, true));
} else {
// No longer a formula, remove from the chain
Object.keys(obj.formula)[loop_tmp] = null;
}
updateFormulaChain(cell[0], cell[1]);
}
}
}
updateFormulaChain(colIndex, rowIndex);
// Keep history
records.push(record);