# ヘッドレス実行とサーバー側計算

> Node.js の内容操作と Rust の事前計算を組み合わせ、Agent に構造化結果と視覚情報を提供します。

- Human documentation: [https://docs.univer.ai/ja-JP/overview/features/shared/server-calculation](https://docs.univer.ai/ja-JP/overview/features/shared/server-calculation)

- Agent Markdown: [https://docs.univer.ai/ja-JP/overview/features/shared/server-calculation.md](https://docs.univer.ai/ja-JP/overview/features/shared/server-calculation.md)

- Requested language: `ja-JP`

- Content language: `ja-JP`

- Documentation version: `1.3.0`

- Source: [features/shared/server-calculation.ja-JP.mdx](https://github.com/dream-num/documentation/blob/dev/content/docs/features/shared/server-calculation.ja-JP.mdx)

---

Univer は内容モデル、計算、UI を分離しています。ヘッドレス実行は Node.js で内容ランタイムを動かし、サーバー側計算は `univer-rs` で重い計算とファイル変換を処理します。アプリと Agent は同じ Snapshot を中心に両者を組み合わせられます。

## UI プラグインなしの Node.js 実行

コア、製品モデル、計算、Facade の必要なプラグインを登録し、メニューやツールバーなど DOM 依存の UI プラグインは登録しません。製品構成に応じて Sheet、Doc、Slide、Relational Table、Canvases、PDF を処理できます。Sheets と Docs は Node プリセット、他の製品は対応するプラグイン構成から始めます。

| 機能 | できること |
| --- | --- |
| 読み込みと解析 | Snapshot を読み込み、セル、段落、ページ、オブジェクト、レコードと構造を調べます。 |
| 計算 | 数式と配列の計算、ピボット更新、数値書式の表示値生成。 |
| 変更 | Facade API で内容と構造を編集し、Snapshot を保存または変更を送信します。 |
| ファイル処理 | Server SDK の変換機能と組み合わせて一括インポート・処理・エクスポート。 |
| 視覚的検証 | Render Runtime でスクリーンショットとレイアウト検査を生成します。 |

内容操作は Node.js で直接実行します。スクリーンショットとレイアウト検査には別途レンダリング環境を設定します。CLI の Render Runtime はヘッドレスブラウザーを使い PNG と検査結果を返します。

## 編集時の即時計算と、サーバーのバージョン別計算

フロントエンドとサーバーの両方に数式エンジンがあります。フロントエンドは編集に応答し、サーバーは Snapshot の生成やファイル処理時に、確定した内容のリビジョンを計算します。

- **編集中**：ブラウザーが影響を受ける数式を差分計算し、結果をすぐに表示します。Worker での実行も可能です。共同編集は内容の変更を記録・同期します。
- **Snapshot 生成時**：サーバーのスナップショット保存ポリシーに応じて保存処理を開始し、その処理の対象リビジョンを取得します。`univer-rs` で計算した後、同じリビジョンの内容と結果をまとめて保存します。
- **再度開くとき**：Snapshot 内の有効な計算結果を再利用し、その後の変更を適用して計算を続けることで、全体の重複計算を減らします。

```mermaid
flowchart LR
    F["フロントエンド編集<br/>即時計算"]
    C["内容の同期<br/>確定した変更"]
    R["Rust 計算<br/>リビジョン N"]
    S["Snapshot 保存<br/>saveSnapshot"]
    F <--> C
    C -->|"Snapshot 生成時"| R
    R --> S
```

**変更は継続的に同期します。サーバー計算は Snapshot の生成時に実行し、対応する内容のリビジョンとともに結果を保存します。**

保存済み結果に合わせて初期計算を設定します。

- `WHEN_EMPTY`：保存済みの値を再利用し、不足する結果だけ計算します。
- `NO_CALCULATION`：初期計算を省き、アプリが結果を提供します。
- `FORCED`：保存済み結果を更新するため全数式を再計算します。

これらは初回読み込みの設定です。その後の編集はフロントエンドで計算を続け、サーバーはリビジョン別の Snapshot 生成やファイル処理時に必要に応じて計算します。[数式設定](https://docs.univer.ai/ja-JP/guides/sheets/features/core/formula.md)、[共同編集の概要](https://docs.univer.ai/ja-JP/server/collaboration/overview.md)、[ファイル変換](https://docs.univer.ai/ja-JP/overview/features/shared/file-conversion.md)を参照してください。

### 数式エンジンの性能

10 冊の[Univer Rust 数式エンジンの性能実測](/blog/rust-formula-performance)では、Rust の入力読み込み、区間別時間、入力形式の範囲、サンプルのダウンロードを紹介しています。

## 配列数式の計算と展開

対応する関数と形式の範囲で、Rust は Excel の配列数式とスピル規則に従います。アンカー、展開範囲、各セルの結果を返し、動的配列と従来の配列数式の指定範囲を扱います。

例えば空の `A1` に `=SEQUENCE(3,2)` を入力すると、次の結果になります。

| A | B |
| --- | --- |
| 1 | 2 |
| 3 | 4 |
| 5 | 6 |

数式は `A1` に残り、結果は `A1:B3` に展開します。配列が縮むと古い展開値を消去し、展開先が塞がれている場合は `#SPILL!` を返します。ブラウザー、Agent、ファイル出力で計算済み Snapshot を再利用できます。

[関数の対応範囲](https://docs.univer.ai/ja-JP/guides/sheets/features/core/formula.md)と [Excel の配列動作](https://support.microsoft.com/en-us/excel/dynamic-array-formulas-and-spilled-array-behavior)を参照してください。

## Agent の実行と検証につなぐ

既存 Agent のモデル、会話、ツール制御を利用し、AI SDK から Office 操作を提供します。

1. 構造と対象の内容を読み取ります。
2. ヘッドレス環境で Facade による編集と必要な計算を実行します。
3. 計算とコミット完了を待ち、最新状態を読み戻します。
4. 値と構造を検証し、必要なら画像とレイアウトも確認します。

[内容操作](https://docs.univer.ai/ja-JP/ai/content-operations.md)と[視覚的検証](https://docs.univer.ai/ja-JP/ai/visual-inspection.md)を組み合わせられます。人によるレビューには [Worktree](https://docs.univer.ai/ja-JP/ai/worktree.md) で変更を隔離し、比較後にマージします。[Univer CLI](https://docs.univer.ai/ja-JP/overview/examples/cli.md)は Agent 向けアプリへの組み立て例です。

## 導入方法

| 機能 | できること |
| --- | --- |
| Node.js の内容ランタイム | [ヘッドレス Web SDK](https://docs.univer.ai/ja-JP/guides/sheets/getting-started/node.md)から必要な製品モデルと計算プラグインを構成します。 |
| バックグラウンドのファイル処理 | Rust 計算と [Node.js ファイル変換](https://docs.univer.ai/ja-JP/server/import-export/node.md)を組み合わせ、更新した Snapshot を保存・返却します。 |
| 共同編集と Agent | [共同編集](https://docs.univer.ai/ja-JP/server/collaboration/quick-start.md)と [AI SDK](https://docs.univer.ai/ja-JP/ai/content-operations.md)を接続し、確定済みの内容を操作します。 |

[機能一覧に戻る](https://docs.univer.ai/ja-JP/overview/features.md)
