Excel アドインの共同編集機能

共同編集機能により、複数のユーザーが連携して同じ Excel ブックを同時に編集できるようになります。 ブックのすべての共同編集者は、他の共同編集者がブックを保存するとすぐに、その共同編集者による変更の内容を確認できます。 Excel ブックを共同編集するには、そのブックが OneDrive、OneDrive for Business、SharePoint Online のいずれかに保存されている必要があります。

重要

Excel for Microsoft 365では、左上隅に自動保存が表示されます。 [自動保存] をオンにすると、共同編集者はリアルタイムで変更内容を確認できます。 Excel アドインの設計時には、この動作の影響を考慮に入れておいてください。 ユーザーは、Excel ウィンドウの左上隅にあるスイッチで [自動保存] をオフに切り替えることができます。

共同編集機能の概要

ブックの内容に変更を加えると、その変更は Excel によってすべての共同編集者間で同期されます。 共同編集者はブックの内容を変更できますが、Excel アドイン内で実行するコードもブックの内容を変更できます。 たとえば、次の JavaScript コードが Office アドインで実行されている場合、範囲の値は Contoso に設定されます。

range.values = [['Contoso']];

すべての共同編集者間で 'Contoso' が同期されると、同じブックで作業するユーザーまたは実行中のアドインは、新しい範囲の値を認識するようになります。

共同編集機能では、共有ブック内の内容のみが同期されます。 ブックから Excel アドイン内の JavaScript 変数にコピーした値は同期されません。 たとえば、アドインが JavaScript 変数にセルの値 (たとえば 'Contoso') を保存しているときに、そのセルの値を共同編集者が 'Example' に変更すると、同期後に、そのセルの値はすべての共同編集者に対して 'Example' と表示されます。 ただし、JavaScript 変数の値は 'Contoso' に設定されたままです。 さらに、複数の共同編集者が同じアドインを使用しているときに、それぞれの共同編集者が独自に変数をコピーしている場合、その変数のコピーは同期されません。 ブックの内容を使用する変数を使用するときには、その変数を使用する前に、ブック内で更新された値について必ずチェックしてください。

イベントを使用したアドインのメモリ内の状態の管理

Excel アドインはブックの内容を読み込んで (非表示のワークシートおよび設定オブジェクトからの読み込み)、その内容を変数などのデータ構造に保存できます。 そのようなデータ構造に元の値がコピーされた後でも、共同編集者は元のブックの内容を更新できます。 つまり、データ構造にコピーした値は、ブックの内容と同期されなくなっているということです。 独自のアドインを構築するときには、ブックの内容とデータ構造に保存された値に関して、このような分離があることを必ず考慮に入れてください。

たとえば、カスタム視覚エフェクトを表示するコンテンツ アドインを作成するとします。 カスタム視覚エフェクトの状態は非表示のワークシートに保存することにします。 共同編集者が同じブックを使用すると、次のシナリオが発生する可能性があります。

  • ユーザー A がドキュメント開くと、カスタム視覚エフェクトがブックに表示されます。 カスタム視覚エフェクトは、非表示のワークシートからデータを読み込みます (たとえば、視覚エフェクトの色が青色に設定されているとします)。
  • ユーザー B が同じドキュメントを開いて、カスタム視覚エフェクトの変更を始めます。 ユーザー B は、カスタム視覚エフェクトの色を橙色に設定します。 橙色の設定が非表示のワークシートに保存されます。
  • ユーザー A の非表示のワークシートが新しい値の橙色で更新されます。
  • ユーザー A のカスタム視覚エフェクトは青色のままです。

ユーザー A のカスタム視覚エフェクトが、共同編集者によって非表示のワークシートに加えられた変更に呼応するようにするには、BindingDataChanged イベントを使用します。 これにより、共同編集者がブックの内容に加えた変更が、アドインの状態に反映されるようになります。

共同編集機能にイベントを使用する際の注意事項

前述したように、シナリオによっては、すべての共同編集者に向けてイベントをトリガーすることで、ユーザー エクスペリエンスが向上します。 ただし、この動作がユーザー エクスペリエンスの低下を招くシナリオも存在することに注意してください。

たとえば、データの入力規則のシナリオでは、一般に、イベントに呼応して UI を表示します。 前のセクションで説明した BindingDataChanged イベントは、ローカル ユーザーまたは共同編集者 (リモート) のどちらかがバインディングの範囲内でブックの内容を変更したときに実行されます。 イベントのイベント ハンドラーに BindingDataChanged UI が表示されている場合、ユーザーには、ブックで作業していた変更とは無関係の UI が表示され、ユーザー エクスペリエンスが低下します。 アドインでイベントを使用する場合は、UI の表示を避けるようにしてください。

テーブル行の共同編集の競合を回避する

API の呼び出し TableRowCollection.add によって共同編集の競合が発生する可能性がある既知の問題です。 他のユーザーがアドインのブックを編集しているときにアドインが実行されると予想される場合は、その API を使用しないことをお勧めします (特に、テーブルまたはテーブルの下の任意の範囲を編集している場合)。 次のガイダンスは、メソッドに関する問題を TableRowCollection.add 回避するのに役立ちます (また、ユーザーに更新を求める黄色のバー Excel の表示をトリガーしないようにします)。

  1. ではなく をTableRowCollection.add使用しますRange.values。 テーブルのすぐ下に Range 値を設定すると、テーブルが自動的に展開されます。 それ以外の場合、API を介してテーブル行を Table 追加すると、共同認証ユーザーのマージ競合が発生します。
  2. データ検証が列全体に適用されない限り、テーブルの下のセルに適用されるデータ検証ルールは存在しません。
  3. テーブルの下にデータがある場合、アドインは範囲の値を設定する前に、そのデータを処理する必要があります。 を使用して Range.insert 空の行を挿入すると、データが移動され、展開テーブルのスペースが作成されます。 それ以外の場合は、テーブルの下のセルを上書きするリスクがあります。
  4. を含むテーブル Range.valuesに空の行を追加することはできません。 テーブルの真下のセルにデータが存在する場合にのみ、テーブルが自動的に展開されます。 空のテーブル行を追加する回避策として、一時データまたは非表示の列を使用します。

関連項目