[]
スレッド式コメントを使用すると、特定のセルに対して文脈に沿ったディスカッションを追加し、コメントに返信できます。
各スレッドは会話のコンテナとして機能し、チームが内容を議論・確認・解決する際に役立ちます。
以下の例では、チームメンバーがスレッド式コメントを使用して四半期予算をレビューする方法を示します。

共同作業と文脈に沿ったフィードバックを可能にします。
返信でユーザーのメンション(@ユーザー名)やハイパーリンクを使用できます。
イベントベースの連携と、元に戻す/やり直しをサポートします。
SpreadJS の API や Excel エクスポートと互換性があります。
スレッド式コメントは、SpreadJS本体のライブラリを参照するか、必要なサブモジュールを個別に読み込むことで利用できます。
方法 1 – フルパッケージを使用する
次のように、SpreadJS本体のライブラリファイルを参照します:
<script src="gc.spread.sheets.all.<version>.min.js"></script>方法 2 – モジュールパッケージを使用する
個別モジュールを読み込む場合、スレッド式コメント機能を有効にするために次のパッケージをロードします:
<script src="gc.spread.sheets.comments.<version>.min.js"></script>
<script src="gc.spread.sheets.components.<version>.min.js"></script>
<script src="gc.spread.sheets.threadedcomments.<version>.min.js"></script>スレッド式コメントは、コメントを作成または返信するユーザーを識別するために GC.Spread.Common.UserManager コンポーネントを使用します。
ユーザーが明示的に設定されていない場合、既定の ゲスト ユーザーが自動的に生成されます。
ユーザーのグローバルな設定方法については ユーザー管理 を参照してください。
構造と API の詳細に入る前に、スレッド式コメントが従来のセルコメント(コメント)とどのように異なるかを確認します。
種類 | 説明 | 主な用途 | アイコン | 例 |
|---|---|---|---|---|
コメント | セルに付加する単一のテキストノートです。返信やメンションをサポートしません。Excel の「ノート」に相当します。 | 簡易的な注釈やメモ |
|
|
スレッド式コメント | セルに紐づくディスカッションスレッドで、複数の返信、メンション ( | 共同作業、レビュー、複数ユーザーでの議論 |
(固定スタイル、状態に基づく色) |
|
注意:
コメントとスレッド式コメントは同じブック内に共存できますが、セルにはどちらか一方のみ設定できます。
次の表は、スレッド式コメントのコアコンポーネントをまとめたものです。
コンポーネント | 説明 | 図 |
|---|---|---|
コメントマネージャー | シート内のすべてのスレッド式コメントを管理し、スレッドの作成と検索の起点になります。 |
|
コメントスレッド | 特定のセルに紐づくコメントスレッドで、複数のコメントを保持し、解決状態を管理します。 |
|
コメント | スレッド内の単一メッセージで、message、createdAt、author を含みます。 author は id、name、email、avatar 、colorをサポートします。 |
|
コンテンツブロック | テキスト、メンション(@)、リンクブロックなど、メッセージ内容の内部構造を定義します。 |
|
これらの操作は UI を通じて実行でき、対応する API でも利用できます。
操作 | 説明 |
|---|---|
スレッド式コメントの追加 | 選択セルに新しいコメントスレッドを作成します。 スレッドには作成者情報とタイムスタンプが含まれます。 |
返信の追加 | 既存スレッド内に返信を追加します。返信は時系列で追加されます。 |
編集/更新 | 既存のコメントまたは返信を編集します。 編集しても元のタイムスタンプを保持します。 |
削除 | コメントまたは返信を削除します。 権限がある場合、他ユーザーのエントリを削除できます。 |
解決/再オープン | スレッドを解決済にする(新規返信を無効化)または再度開きます。 |
コピー/切り取り/貼り付け | セルをコピー/切り取り/貼り付けする際にスレッドコメントを保持します。 |
元に戻す/やり直す | 追加、編集、削除操作を元に戻す/やり直します。 |
イベント
イベント | トリガー |
|---|---|
| スレッドまたは返信が更新される前にトリガーされます。 |
| スレッドまたは返信が更新された後にトリガーされます。 |
| メンションがトリガーされる直前に発生します。キャンセルをサポートします。 |
| 返信内でユーザーがメンションされたときにトリガーされます。 |
編集者: スレッド式コメントの追加、編集、削除、解決処理を行えます。
閲覧者: 読み取り専用で、操作ボタンや返信エディタは表示されません。
有効化の要件
メンション機能を使用するには、GC.Spread.Common.UserManager を設定する必要があります。
UserManager が設定されていない場合、メンション機能は無効になります。
この状態で @ を入力すると、文字はプレーンテキストとして挿入され、ユーザー候補リストのポップアップは表示されません。メンションブロックは作成されず、メンション関連のイベントも発生しません。
UserManager が設定されている場合、スレッド コメント エディターでメンション機能を使用できます。
動作フロー
ユーザーは、スレッド コメント エディターで @ を入力することで、返信内に共同編集者をメンションできます。
@ を入力したとき
ユーザー候補リストのポップアップが表示される前に、UserMentioning イベントが同期的に発生します。
開発者は args.cancel = true を設定することでポップアップの表示を抑止し、@ をプレーンテキストとして扱うことができます。
メンションがキャンセルされた場合、メンションブロックは作成されず、UserMentioned イベントは発生しません。
返信を投稿したとき
1 件以上のメンションを含む返信が投稿されると、UserMentioned イベントが発生します。
メンション候補リストには最大 20 名のユーザーが表示されます。
一致する候補がさらに存在する場合は、追加の結果があることを示すメッセージが表示されます。
スレッドは resolved フラグを保持します。
紫色フラグ: 未解決
灰色フラグ: 解決済
編集ルール
複数のスレッド式コメントを同時に編集できます。
コメントを非表示にすると未保存の編集は破棄されます。
明示的な編集状態フラグは維持しません。
メンションとリンク
メンション(@user)をクリックしてもユーザー情報カードは表示されません。
ハイパーリンク編集の動作はブラウザによって異なります:
Safari: 投稿後に貼り付けまたは入力した URL を自動的にハイパーリンクに変換します。
その他のブラウザ: Space または Enter を押したときに変換します。
エクスポートと互換性の制限
Excel にエクスポートする際、ユーザー ID は UUID 形式に従う必要があります:
{XXXXXXXX‑XXXX‑XXXX‑XXXX‑XXXXXXXXXXXX}
この形式に合わない場合、SpreadJS は Excel 仕様に合わせて ID を調整します。
その結果、再インポート時に編集権限が保持されない可能性があります。
構造上の制限
スレッド式コメントは現在ネスト構造をサポートしておらず、すべての返信は 単一階層(フラット)構造になります。
プレゼンス制限
スレッド式コメントはリアルタイムの同時編集状態(プレゼンス)をサポートしません。
スレッド式コメントで使用できるショートカットは次のとおりです。
ショートカット | 機能 |
|---|---|
Ctrl + Alt + M | 選択セルに新しいスレッド式コメントを挿入します。 |
Ctrl + Enter | 編集中の返信を投稿します。 |
Enter | 選択中のスレッド式コメントを展開または折りたたみます。 |
Esc | 編集中の返信を保存せずにキャンセルします。 |
注意:
macOS では Ctrl の代わりに Command(⌘) を使用します。
スレッド式コメントは SpreadJS のいくつかの主要クラスとイベントに依存します。
主要オブジェクト
クラス | 目的 |
|---|---|
| ワークシートセルに紐づくコメントスレッドを管理します。 |
| 単一のスレッド式コメントまたは返信を表し、内容の編集や解決状態の管理を行います。 |
|
|
| コメント作成者としての現在ユーザーを設定および管理します。 |
そのほかのサポートされる操作
GC.Spread.Sheets.Search および GC.Spread.Sheets クラスは、検索、コピー、切り取り、クリア、使用範囲などの一般的な操作を拡張して、スレッド式コメントデータを含めます。
このセクションでは、SpreadJS API を使用してスレッド式コメントを操作する基本例を紹介します。
基本例 — コメントを追加する
この例では、現在ユーザーによって E3 セルに新しいスレッド式コメントを作成します。
コメントインジケーターはセルに自動的に表示されます。
// ワークブックを初期化
const spread = new GC.Spread.Sheets.Workbook("ss");
const sheet = spread.getActiveSheet();
// ユーザー情報を定義
var users = [
{ id: "user1", name: "Aiko Sato", email: "alice.aiko@company.com",},
{ id: "user2", name: "Taro Suzuki", email: "bob.taro@company.com",}
];
GC.Spread.Common.UserManager.configure({
get: async (userId) => {
if (userId === undefined) {
return;
}
return new Promise((resolve) => {
const user = users.find(u => u.id === userId);
resolve(user);
});
},
search: async (query) => {
return new Promise((resolve) => {
resolve(users.filter(u =>
u.name.toLowerCase().includes(query.toLowerCase()) ||
u.email.toLowerCase().includes(query.toLowerCase())
));
});
}
});
// 現在のユーザーを設定
GC.Spread.Common.UserManager.current("user1");
// コメントを作成
const comment_1 = {
message: [
{ type: GC.Spread.Sheets.ThreadedComments.ContentType.text, value: "こんにちは " },
{ type: GC.Spread.Sheets.ThreadedComments.ContentType.mention, userId: "user2" },
{ type: GC.Spread.Sheets.ThreadedComments.ContentType.text, value: "さん、開発部門の予算差異を確認してください。こちらをご参照ください: " },
{ type: GC.Spread.Sheets.ThreadedComments.ContentType.link, href: "https://example.com/budget-policy", text: "Budget Policy" }
],
authorId: "user1",
createdAt: new Date("2025-12-10T15:44:00")
};
// セル B4 にスレッド式コメントを追加
const threadedCommentManager = sheet.threadedComments;
const threadedComment = threadedCommentManager.add(2, 4);
threadedComment.add(comment_1);
例 — 更新、返信、状態変更、削除
この例は前のサンプルに基づきます。
// 特定のスレッドを取得
const thread = threadedCommentManager.get(2, 4);
console.log(thread.row()); // 出力: 2
// 返信を作成
const reply_1 = {
message: [
{
type: GC.Spread.Sheets.ThreadedComments.ContentType.text,
value: "確認いたしました。 "
}
],
authorId: "user2",
createdAt: new Date("2025-12-12T11:47:00")
};
// 返信を追加
thread.add(reply_1);
// 既存の返信を編集
thread.set(0, {
message: [
{
type: GC.Spread.Sheets.ThreadedComments.ContentType.text,
value: 'この値をご確認ください。'
}
]
});
// 返信を削除
thread.remove(1);
// 解決/再オープン
thread.resolved(true);例 — スレッド式コメントイベントの処理
イベントを購読してカスタム処理を実行します。
sheet.bind(GC.Spread.Sheets.Events.ThreadedCommentChanging, function (e, info) {
// スレッド式コメントのプロパティ変更または返信の変更を処理
});
// UserMentioning は、ユーザーが @ を入力してポップアップが表示される前に発火します。
// args.cancel = true を設定すると、ポップアップの表示を抑止し、@ をテキストとして扱います。
sheet.bind(GC.Spread.Sheets.Events.UserMentioning, function (e, args) {
args.cancel = true; // suppress the mention user-list popup
});
sheet.bind(GC.Spread.Sheets.Events.UserMentioned, function (e, info) {
console.log(args);
});