[]
        
(Showing Draft Content)

スレッド形式のコメント

スレッド式コメントを使用すると、特定のセルに対して文脈に沿ったディスカッションを追加し、コメントに返信できます。

各スレッドは会話のコンテナとして機能し、チームが内容を議論・確認・解決する際に役立ちます。

以下の例では、チームメンバーがスレッド式コメントを使用して四半期予算をレビューする方法を示します。

image

主な特徴

  • 共同作業と文脈に沿ったフィードバックを可能にします。

  • 返信でユーザーのメンション(@ユーザー名)やハイパーリンクを使用できます。

  • イベントベースの連携と、元に戻す/やり直しをサポートします。

  • 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 の「ノート」に相当します。

簡易的な注釈やメモ

image(API で色/サイズを調整できます)

image

スレッド式コメント

セルに紐づくディスカッションスレッドで、複数の返信、メンション (@user)、状態管理(解決/未解決)をサポートします。Excel の「コメント」に相当します。

共同作業、レビュー、複数ユーザーでの議論

  • 未解決: image

  • 解決済: image

(固定スタイル、状態に基づく色)

image

注意:

  • コメントとスレッド式コメントは同じブック内に共存できますが、セルにはどちらか一方のみ設定できます。

アーキテクチャ概要

次の表は、スレッド式コメントのコアコンポーネントをまとめたものです。

コンポーネント

説明

コメントマネージャー

シート内のすべてのスレッド式コメントを管理し、スレッドの作成と検索の起点になります。

image

コメントスレッド

特定のセルに紐づくコメントスレッドで、複数のコメントを保持し、解決状態を管理します。

image

コメント

スレッド内の単一メッセージで、messagecreatedAtauthor を含みます。

authoridnameemailavatarcolorをサポートします。

image

コンテンツブロック

テキスト、メンション(@)、リンクブロックなど、メッセージ内容の内部構造を定義します。

image

UI 操作

これらの操作は UI を通じて実行でき、対応する API でも利用できます。

操作

説明

スレッド式コメントの追加

選択セルに新しいコメントスレッドを作成します。

スレッドには作成者情報とタイムスタンプが含まれます。

返信の追加

既存スレッド内に返信を追加します。返信は時系列で追加されます。

編集/更新

既存のコメントまたは返信を編集します。

編集しても元のタイムスタンプを保持します。

削除

コメントまたは返信を削除します。

権限がある場合、他ユーザーのエントリを削除できます。

解決/再オープン

スレッドを解決済にする(新規返信を無効化)または再度開きます。

コピー/切り取り/貼り付け

セルをコピー/切り取り/貼り付けする際にスレッドコメントを保持します。

元に戻す/やり直す

追加、編集、削除操作を元に戻す/やり直します。

詳細機能

イベント

イベント

トリガー

ThreadedCommentChanging

スレッドまたは返信が更新される前にトリガーされます。

ThreadedCommentChanged

スレッドまたは返信が更新された後にトリガーされます。

UserMentioning

メンションがトリガーされる直前に発生します。キャンセルをサポートします。

UserMentioned

返信内でユーザーがメンションされたときにトリガーされます。

コラボレーションモデル

  • 編集者: スレッド式コメントの追加、編集、削除、解決処理を行えます。

  • 閲覧者: 読み取り専用で、操作ボタンや返信エディタは表示されません。

メンション(@)

有効化の要件

メンション機能を使用するには、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(⌘) を使用します。

基盤 API

スレッド式コメントは SpreadJS のいくつかの主要クラスとイベントに依存します。

主要オブジェクト

クラス

目的

GC.Spread.Sheets.ThreadedComments

ワークシートセルに紐づくコメントスレッドを管理します。

GC.Spread.Sheets.ThreadedComments.ThreadedComment

単一のスレッド式コメントまたは返信を表し、内容の編集や解決状態の管理を行います。

GC.Spread.Sheets.Events

ThreadedCommentChangingThreadedCommentChangedUserMentioningUserMentioned など、コメント関連のイベントを提供します。

GC.Spread.Common.UserManager

コメント作成者としての現在ユーザーを設定および管理します。

そのほかのサポートされる操作

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);

image

例 — 更新、返信、状態変更、削除

この例は前のサンプルに基づきます。

// 特定のスレッドを取得
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);
});