次の方法で共有


Office アドインでカスタム コンテキスト タブを作成する

コンテキスト タブは、Office リボンの非表示のタブ コントロールであり、Office ドキュメントで指定したイベントが発生したときにタブ行に表示されます。 たとえば、テーブルが選択されている場合に Excel リボンに表示される [テーブル デザイン ] タブなどです。 Office アドインにカスタム コンテキスト タブを含め、表示または非表示のタイミングを指定するには、可視性を変更するイベント ハンドラーを作成します。 (ただし、カスタム コンテキスト タブはフォーカスの変更に応答しません)。

注:

この記事では、 アドイン コマンドの基本的な概念について理解していることを前提としています。 アドイン コマンド (カスタム メニュー項目とリボン ボタン) を最近使用していない場合は、確認してください。

前提条件

カスタム コンテキスト タブは現在、 Excel でのみサポートされており、次のプラットフォームとビルドでのみサポートされています。

  • Excel on the web
  • Excel on Windows: バージョン 2102 (ビルド 13801.20294) 以降。
  • Excel on Mac: バージョン 16.53 (21080600) 以降。

さらに、カスタム コンテキスト タブは、次の要件セットをサポートするプラットフォームでのみ機能します。 要件セットとその使用方法の詳細については、「 Office アプリケーションと API の要件を指定する」を参照してください。

ヒント

「ランタイムによるメソッドと要件セットのサポートのチェック」の説明に従って、ユーザーのホストとプラットフォームの組み合わせでこれらの要件セットがサポートされているかどうかをテストするには、コードの ランタイム チェックを使用します。 (マニフェストで要件セットを指定する手法は、この記事でも説明されていますが、RibbonApi 1.2 では現在機能しません)。または、 カスタム コンテキスト タブがサポートされていない場合に、代替 UI エクスペリエンスを実装することもできます。

カスタム コンテキスト タブの動作

カスタム コンテキスト タブのユーザー エクスペリエンスは、組み込みの Office コンテキスト タブのパターンに従います。 配置カスタム コンテキスト タブの基本原則を次に示します。

  • カスタム コンテキスト タブが表示されると、リボンの右端に表示されます。
  • アドインの 1 つ以上の組み込みコンテキスト タブと 1 つ以上のカスタム コンテキスト タブが同時に表示される場合、カスタム コンテキスト タブは常にすべての組み込みコンテキスト タブの右側に表示されます。
  • アドインに複数のコンテキスト タブがあり、複数のコンテキストが表示される場合は、アドインで定義されている順序で表示されます。 (方向は Office 言語と同じ方向です。つまり、左から右の言語では左から右、右から左の言語では右から左)。 定義方法の詳細については、「タブに表示されるグループとコントロール を定義する」を参照してください。
  • 特定のコンテキストで表示されるコンテキスト タブが複数のアドインにある場合は、アドインが起動された順序で表示されます。
  • カスタム コンテキスト タブは、カスタム コア タブとは異なり、Office アプリケーションのリボンに永続的に追加されません。 アドインが実行されている Office ドキュメントにのみ表示されます。

警告

現在、カスタム コンテキスト タブを使用すると、ユーザーが以前の Excel アクションを元に戻すことができなくなる可能性があります。 これは既知の問題 ( この GitHub スレッドを参照) であり、アクティブな調査中です。

アドインにコンテキスト タブを含める主な手順

アドインにカスタム コンテキスト タブを含める主な手順を次に示します。

  1. 共有ランタイムを使用するようにアドインを構成します
  2. コンテキスト タブのアイコンを指定します
  3. タブに表示されるグループとコントロールを定義します
  4. コンテキスト タブを Office に登録します
  5. タブが表示される状況を指定します

共有ランタイムを使用するようにアドインを構成する

カスタム コンテキスト タブを追加するには、アドインで 共有ランタイムを使用する必要があります。 詳細については、「 共有ランタイムを使用するようにアドインを構成する」を参照してください。

コンテキスト タブのアイコンを指定する

コンテキスト タブをカスタマイズするには、まず、アドインのマニフェストの [リソース] セクションで Image 要素を使用して表示されるアイコンを指定する必要があります。 各アイコンには、16x16 px、32x32 px、80x80 px の 3 つ以上のサイズが必要です。

次に例を示します。

<Resources>
    <bt:Images>
        <bt:Image id="contextual-tab-icon-16" DefaultValue="https://cdn.contoso.com/addins/datainsertion/Images/Group16x16.png"/>
        <bt:Image id="contextual-tab-icon-32" DefaultValue="https://cdn.contoso.com/addins/datainsertion/Images/Group32x32.png"/>
        <bt:Image id="contextual-tab-icon-80" DefaultValue="https://cdn.contoso.com/addins/datainsertion/Images/Group80x80.png"/>
        <bt:Image id="contextual-button-icon-16" DefaultValue="https://cdn.contoso.com/addins/datainsertion/Images/WriteDataButton16x16.png"/>
        <bt:Image id="contextual-button-icon-32" DefaultValue="https://cdn.contoso.com/addins/datainsertion/Images/WriteDataButton32x32.png"/>
        <bt:Image id="contextual-button-icon-80" DefaultValue="https://cdn.contoso.com/addins/datainsertion/Images/WriteDataButton80x80.png"/>
    </bt:Images>
    ...
</Resources>

重要

アドインを開発から運用環境に移行する場合は、必要に応じてマニフェストの URL を更新してください (ドメインを localhost から contoso.comに変更するなど)。

タブに表示されるグループとコントロールを定義する

マニフェストで XML で定義されるカスタム コア タブとは異なり、カスタム コンテキスト タブは実行時に JSON BLOB で定義されます。 コードでは、BLOB を JavaScript オブジェクトに解析し、そのオブジェクトを Office.ribbon.requestCreateControls メソッドに 渡します。 カスタム コンテキスト タブは、アドインが現在実行されているドキュメントにのみ存在します。 これは、アドインのインストール時に Office アプリケーション リボンに追加され、別のドキュメントを開いたときに表示されるカスタム コア タブとは異なります。 また、 requestCreateControls メソッドは、アドインのセッションで 1 回だけ実行できます。 再度呼び出された場合は、エラーがスローされます。

注:

JSON BLOB のプロパティとサブプロパティ (およびキー名) の構造は、マニフェスト XML 内の CustomTab 要素とその子孫要素の構造とほぼ平行です。

コンテキスト タブ JSON BLOB の例を段階的に作成します。 コンテキスト タブ JSON の完全なスキーマは 、dynamic-ribbon.schema.jsonにあります。 Visual Studio Code で作業している場合は、このファイルを使用して IntelliSense を取得し、JSON を検証できます。 詳細については、「 Visual Studio Code を使用した JSON の編集 - JSON スキーマと設定」を参照してください。

  1. まず、 actionstabs という名前の 2 つの配列プロパティを持つ JSON 文字列を作成します。 actions配列は、コンテキスト タブのコントロールによって実行できるすべての関数の仕様です。tabs配列は、1 つ以上のコンテキスト タブ (最大 20 個) を定義します。

    '{
      "actions": [
    
      ],
      "tabs": [
    
      ]
    }'
    
  2. コンテキスト タブのこの単純な例では、ボタンが 1 つしかないため、アクションは 1 つだけです。 actions配列の唯一のメンバーとして、次を追加します。 このマークアップについては、次の点に注意してください。

    • idプロパティとtypeプロパティは必須です。
    • typeの値は、"ExecuteFunction" または "ShowTaskpane" のいずれかです。
    • functionName プロパティは、typeの値がExecuteFunctionされている場合にのみ使用されます。 これは、FunctionFile で定義されている関数の名前です。 FunctionFile の詳細については、「 アドイン コマンドの基本的な概念」を参照してください。
    • 後の手順では、このアクションをコンテキスト タブのボタンにマップします。
    {
      "id": "executeWriteData",
      "type": "ExecuteFunction",
      "functionName": "writeData"
    }
    
  3. tabs配列の唯一のメンバーとして、次を追加します。 このマークアップについては、次の点に注意してください。

    • id プロパティは必須です。 アドイン内のすべてのコンテキスト タブで一意の簡単でわかりやすい ID を使用します。
    • label プロパティは必須です。 コンテキスト タブのラベルとして機能するわかりやすい文字列です。
    • groups プロパティは必須です。 タブに表示されるコントロールのグループを定義します。少なくとも 1 つのメンバーを持 ち、20 以下である必要があります。 (カスタム コンテキスト タブで使用できるコントロールの数にも制限があり、グループの数も制限されます。詳細については、次の手順を参照してください)。

    注:

    tab オブジェクトには、オプションの visible プロパティを使用して、アドインの起動時にタブをすぐに表示するかどうかを指定することもできます。 コンテキスト タブは通常、ユーザー イベントによって可視性がトリガーされるまで非表示になるため (ユーザーがドキュメント内の何らかの種類のエンティティを選択する場合など)、 visible プロパティの既定値は存在しない場合に false されます。 後のセクションでは、イベントに応答して プロパティを true に設定する方法について説明します。

    {
      "id": "CtxTab1",
      "label": "Contoso Data",
      "groups": [
    
      ]
    }
    
  4. 単純な進行中の例では、コンテキスト タブのグループは 1 つだけです。 groups配列の唯一のメンバーとして、次を追加します。 このマークアップについては、次の点に注意してください。

    • すべてのプロパティが必要です。
    • id プロパティは、マニフェスト内のすべてのグループ間で一意である必要があります。 最大 125 文字の簡単でわかりやすい ID を使用します。
    • labelは、グループのラベルとして機能するわかりやすい文字列です。
    • icon プロパティの値は、リボンと Office アプリケーション ウィンドウのサイズに応じて、グループがリボンに表示するアイコンを指定するオブジェクトの配列です。
    • controls プロパティの値は、グループ内のボタンとメニューを指定するオブジェクトの配列です。 少なくとも 1 つ必要です。

    重要

    タブ全体のコントロールの合計数は、20 以下にすることができます。 たとえば、それぞれ 6 つのコントロールを持つ 3 つのグループと 2 つのコントロールを持つ 4 つ目のグループを含めることができますが、それぞれ 6 つのコントロールを持つ 4 つのグループを持つすることはできません。

    {
        "id": "CustomGroup111",
        "label": "Insertion",
        "icon": [
    
        ],
        "controls": [
    
        ]
    }
    
  5. すべてのグループには、16x16 px、32x32 px、80x80 px の少なくとも 3 つのサイズのアイコンが必要です。 必要に応じて、サイズ 20x20 px、24x24 px、40x40 px、48x48 px、64x64 px のアイコンを使用することもできます。 Office は、リボンと Office アプリケーション ウィンドウのサイズに基づいて、使用するアイコンを決定します。 アイコン配列に次のオブジェクトを追加します。 (ウィンドウとリボンのサイズが、グループのコントロールの少なくとも 1 つを表示するのに十分な大きさの場合、グループ アイコンはまったく表示されません。たとえば、Word ウィンドウを縮小して展開するときに、Word リボンの [スタイル] グループをwatchします)。このマークアップについては、次の点に注意してください。

    • どちらのプロパティも必要です。
    • sizeプロパティの測定単位はピクセルです。 アイコンは常に正方形であるため、数値は高さと幅の両方です。
    • sourceLocation プロパティは、アイコンの完全な URL を指定します。 その値は、マニフェストの <Resources> セクションの <Image> 要素で指定された URL と一致する必要があります (「コンテキスト タブのアイコンを指定する」を参照してください)。

    重要

    通常、開発から運用環境に移行するときにアドインのマニフェストの URL を変更する必要があるのと同様に、コンテキスト タブの JSON の URL も変更する必要があります。

    {
        "size": 16,
        "sourceLocation": "https://cdn.contoso.com/addins/datainsertion/Images/Group16x16.png"
    },
    {
        "size": 32,
        "sourceLocation": "https://cdn.contoso.com/addins/datainsertion/Images/Group32x32.png"
    },
    {
        "size": 80,
        "sourceLocation": "https://cdn.contoso.com/addins/datainsertion/Images/Group80x80.png"
    }
    
  6. 簡単な進行中の例では、グループには 1 つのボタンしかありません。 controls配列の唯一のメンバーとして、次のオブジェクトを追加します。 このマークアップについては、次の点に注意してください。

    • enabledを除くすべてのプロパティが必要です。
    • type はコントロールの種類を指定します。 値には、"Button"、"Menu"、または "MobileButton" を指定できます。
    • id は最大 125 文字です。
    • actionId は、 actions 配列で定義されているアクションの ID である必要があります。 (このセクションの手順 1 を参照してください)。
    • label は、ボタンのラベルとして機能するわかりやすい文字列です。
    • superTip は、豊富なツール ヒントを表します。 titleプロパティとdescriptionプロパティの両方が必要です。
    • icon ボタンのアイコンを指定します。 グループ アイコンに関する以前の説明もここに適用されます。
    • enabled (省略可能) コンテキスト タブが起動したときにボタンを有効にするかどうかを指定します。 存在しない場合の既定値は trueです。
    {
        "type": "Button",
        "id": "CtxBt112",
        "actionId": "executeWriteData",
        "enabled": false,
        "label": "Write Data",
        "superTip": {
            "title": "Data Insertion",
            "description": "Use this button to insert data into the document."
        },
        "icon": [
            {
                "size": 16,
                "sourceLocation": "https://cdn.contoso.com/addins/datainsertion/Images/WriteDataButton16x16.png"
            },
            {
                "size": 32,
                "sourceLocation": "https://cdn.contoso.com/addins/datainsertion/Images/WriteDataButton32x32.png"
            },
            {
                "size": 80,
                "sourceLocation": "https://cdn.contoso.com/addins/datainsertion/Images/WriteDataButton80x80.png"
            }
        ]
    }
    

JSON BLOB の完全な例を次に示します。

`{
  "actions": [
    {
      "id": "executeWriteData",
      "type": "ExecuteFunction",
      "functionName": "writeData"
    }
  ],
  "tabs": [
    {
      "id": "CtxTab1",
      "label": "Contoso Data",
      "groups": [
        {
          "id": "CustomGroup111",
          "label": "Insertion",
          "icon": [
            {
                "size": 16,
                "sourceLocation": "https://cdn.contoso.com/addins/datainsertion/Images/Group16x16.png"
            },
            {
                "size": 32,
                "sourceLocation": "https://cdn.contoso.com/addins/datainsertion/Images/Group32x32.png"
            },
            {
                "size": 80,
                "sourceLocation": "https://cdn.contoso.com/addins/datainsertion/Images/Group80x80.png"
            }
          ],
          "controls": [
            {
                "type": "Button",
                "id": "CtxBt112",
                "actionId": "executeWriteData",
                "enabled": false,
                "label": "Write Data",
                "superTip": {
                    "title": "Data Insertion",
                    "description": "Use this button to insert data into the document."
                },
                "icon": [
                    {
                        "size": 16,
                        "sourceLocation": "https://cdn.contoso.com/addins/datainsertion/Images/WriteDataButton16x16.png"
                    },
                    {
                        "size": 32,
                        "sourceLocation": "https://cdn.contoso.com/addins/datainsertion/Images/WriteDataButton32x32.png"
                    },
                    {
                        "size": 80,
                        "sourceLocation": "https://cdn.contoso.com/addins/datainsertion/Images/WriteDataButton80x80.png"
                    }
                ]
            }
          ]
        }
      ]
    }
  ]
}`

requestCreateControls を使用してコンテキスト タブを Office に登録する

コンテキスト タブは、 Office.ribbon.requestCreateControls メソッドを呼び出すことによって Office に登録されます。 これは通常、 Office.initialize に割り当てられている関数または Office.onReady 関数で実行されます。 これらの関数とアドインの初期化の詳細については、「 Office アドインの初期化」を参照してください。 ただし、初期化後はいつでも メソッドを呼び出すことができます。

重要

requestCreateControls メソッドは、アドインの特定のセッションで 1 回だけ呼び出されることがあります。 再度呼び出されるとエラーがスローされます。

次に例を示します。 JSON 文字列を JavaScript 関数に渡すには、 JSON.parse メソッドを使用して JavaScript オブジェクトに変換する必要があることに注意してください。

Office.onReady(async () => {
    const contextualTabJSON = ` ... `; // Assign the JSON string such as the one at the end of the preceding section.
    const contextualTab = JSON.parse(contextualTabJSON);
    await Office.ribbon.requestCreateControls(contextualTab);
});

タブが requestUpdate で表示されるコンテキストを指定する

通常、ユーザーが開始したイベントがアドイン コンテキストを変更すると、カスタム コンテキスト タブが表示されます。 (Excel ブックの既定のワークシート上の) グラフがアクティブ化されている場合にのみ、タブを表示するシナリオを検討してください。

まず、ハンドラーを割り当てます。 これは一般的に、次の例のように Office.onReady 関数で行われます。これは、ハンドラー (後の手順で作成) をワークシート内のすべてのグラフの onActivated イベントと onDeactivated イベントに割り当てます。

Office.onReady(async () => {
    const contextualTabJSON = ` ... `; // Assign the JSON string.
    const contextualTab = JSON.parse(contextualTabJSON);
    await Office.ribbon.requestCreateControls(contextualTab);

    await Excel.run(context => {
        const charts = context.workbook.worksheets
            .getActiveWorksheet()
            .charts;
        charts.onActivated.add(showDataTab);
        charts.onDeactivated.add(hideDataTab);
        return context.sync();
    });
});

次に、ハンドラーを定義します。 次に、 showDataTabの簡単な例を示しますが、より堅牢なバージョンの関数については、この記事の後半の 「HostRestartNeeded エラーの処理 」を参照してください。 このコードについては、以下の点に注意してください。

  • Office では、リボンの状態を更新するタイミングが制御されます。 Office.ribbon.requestUpdate メソッドは、更新要求をキューに入れます。 メソッドは、リボンが実際に更新されたときではなく、要求をキューに入れるとすぐに、 Promise オブジェクトを解決します。
  • requestUpdate メソッドのパラメーターは RibbonUpdaterData オブジェクトで、(1) は JSON で指定されたとおりに ID でタブを指定し、(2) はタブの可視性を指定します。
  • 同じコンテキストで表示する必要がある複数のカスタム コンテキスト タブがある場合は、 tabs 配列に追加のタブ オブジェクトを追加するだけです。
async function showDataTab() {
    await Office.ribbon.requestUpdate({
        tabs: [
            {
                id: "CtxTab1",
                visible: true
            }
        ]});
}

タブを非表示にするハンドラーは、 visible プロパティを false に戻す点を除いて、ほぼ同じです。

Office JavaScript ライブラリには、RibbonUpdateData オブジェクトの構築を容易にするために、いくつかのインターフェイス (型) も用意されています。 TypeScript の showDataTab 関数を次に示します。これらの型を使用します。

const showDataTab = async () => {
    const myContextualTab: Office.Tab = {id: "CtxTab1", visible: true};
    const ribbonUpdater: Office.RibbonUpdaterData = { tabs: [ myContextualTab ]};
    await Office.ribbon.requestUpdate(ribbonUpdater);
}

タブの表示とボタンの有効な状態を同時に切り替える

requestUpdate メソッドは、カスタム コンテキスト タブまたはカスタム コア タブのカスタム ボタンの有効または無効の状態を切り替えるためにも使用されます。詳細については、「アドイン コマンドを有効または無効にする」を参照してください。 タブの表示とボタンの有効な状態の両方を同時に変更するシナリオがある場合があります。 これを行うには、 requestUpdateを 1 回呼び出します。 次に、コンテキスト タブと同時にコア タブのボタンを有効にする例を示します。

function myContextChanges() {
    Office.ribbon.requestUpdate({
        tabs: [
            {
                id: "CtxTab1",
                visible: true
            },
            {
                id: "OfficeAppTab1",
                groups: [
                    {
                        id: "CustomGroup111",
                        controls: [
                            {
                                id: "MyButton",
                                enabled: true
                            }
                        ]
                    }
                ]
            ]}
        ]
    });
}

次の例では、有効になっているボタンは、表示されるコンテキスト タブとまったく同じです。

function myContextChanges() {
    Office.ribbon.requestUpdate({
        tabs: [
            {
                id: "CtxTab1",
                visible: true,
                groups: [
                    {
                        id: "CustomGroup111",
                        controls: [
                            {
                                id: "MyButton",
                                enabled: true
                           }
                       ]
                   }
               ]
            }
        ]
    });
}

コンテキスト タブから作業ウィンドウを開く

カスタム コンテキスト タブのボタンから作業ウィンドウを開くには、のを含むアクションを JSON に作成します。 次に、 actionId プロパティがアクションの id に設定されているボタンを定義します。 これにより、マニフェストの <Runtime> 要素で指定された既定の作業ウィンドウが開きます。

`{
  "actions": [
    {
      "id": "openChartsTaskpane",
      "type": "ShowTaskpane",
      "title": "Work with Charts",
      "supportPinning": false
    }
  ],
  "tabs": [
    {
      // some tab properties omitted
      "groups": [
        {
          // some group properties omitted
          "controls": [
            {
                "type": "Button",
                "id": "CtxBt112",
                "actionId": "openChartsTaskpane",
                "enabled": false,
                "label": "Open Charts Taskpane",
                // some control properties omitted
            }
          ]
        }
      ]
    }
  ]
}`

既定の作業ウィンドウではない作業ウィンドウを開くには、アクションの定義で sourceLocation プロパティを指定します。 次の例では、別のボタンから 2 つ目の作業ウィンドウが開きます。

重要

  • アクションに sourceLocation が指定されている場合、作業ウィンドウは共有ランタイムを使用 しません 。 新しい個別のランタイムで実行されます。
  • 共有ランタイムを使用できる作業ウィンドウは複数ないため、sourceLocation プロパティを省略できるShowTaskpane型のアクションは 1 つ以上ありません。
`{
  "actions": [
    {
      "id": "openChartsTaskpane",
      "type": "ShowTaskpane",
      "title": "Work with Charts",
      "supportPinning": false
    },
    {
      "id": "openTablesTaskpane",
      "type": "ShowTaskpane",
      "title": "Work with Tables",
      "supportPinning": false
      "sourceLocation": "https://MyDomain.com/myPage.html"
    }
  ],
  "tabs": [
    {
      // some tab properties omitted
      "groups": [
        {
          // some group properties omitted
          "controls": [
            {
                "type": "Button",
                "id": "CtxBt112",
                "actionId": "openChartsTaskpane",
                "enabled": false,
                "label": "Open Charts Taskpane",
                // some control properties omitted
            },
            {
                "type": "Button",
                "id": "CtxBt113",
                "actionId": "openTablesTaskpane",
                "enabled": false,
                "label": "Open Tables Taskpane",
                // some control properties omitted
            }
          ]
        }
      ]
    }
  ]
}`

JSON テキストをローカライズする

requestCreateControlsに渡される JSON BLOB は、カスタム コア タブのマニフェスト マークアップがローカライズされるのと同じ方法でローカライズされません (マニフェストからのローカライズの制御に関するページで説明されています)。 代わりに、ロケールごとに個別の JSON BLOB を使用して実行時にローカライズを行う必要があります。 Office.context.displayLanguage プロパティをテストするswitch ステートメントを使用することをお勧めします。 次に例を示します。

function GetContextualTabsJsonSupportedLocale () {
    const displayLanguage = Office.context.displayLanguage;

        switch (displayLanguage) {
            case 'en-US':
                return `{
                    "actions": [
                        // actions omitted
                     ],
                    "tabs": [
                        {
                          "id": "CtxTab1",
                          "label": "Contoso Data",
                          "groups": [
                              // groups omitted
                          ]
                        }
                    ]
                }`;

            case 'fr-FR':
                return `{
                    "actions": [
                        // actions omitted 
                    ],
                    "tabs": [
                        {
                          "id": "CtxTab1",
                          "label": "Contoso Données",
                          "groups": [
                              // groups omitted
                          ]
                       }
                    ]
               }`;

            // Other cases omitted
       }
}

次に、次の例のように、コードで 関数を呼び出して、 requestCreateControlsに渡されるローカライズされた BLOB を取得します。

const contextualTabJSON = GetContextualTabsJsonSupportedLocale();

カスタム コンテキスト タブのベスト プラクティス

カスタム コンテキスト タブがサポートされていない場合に代替 UI エクスペリエンスを実装する

プラットフォーム、Office アプリケーション、Office ビルドの組み合わせによっては、 requestCreateControlsがサポートされていません。 アドインは、これらの組み合わせのいずれかでアドインを実行しているユーザーに代替エクスペリエンスを提供するように設計する必要があります。 以降のセクションでは、フォールバック エクスペリエンスを提供する 2 つの方法について説明します。

非コンテキスト タブまたはコントロールを使用する

マニフェスト要素 OverriddenByRibbonApi は、カスタム コンテキスト タブをサポートしていないアプリケーションまたはプラットフォームでアドインが実行されているときにカスタム コンテキスト タブを実装するフォールバック エクスペリエンスをアドインに作成するように設計されています。

この要素を使用する最も簡単な方法は、アドイン内のカスタム コンテキスト タブのリボンのカスタマイズを複製するカスタム コア タブ (つまり、 コンテキストに依存しない カスタム タブ) をマニフェストに定義することです。 ただし、 <OverriddenByRibbonApi>true</OverriddenByRibbonApi> を、カスタム コア タブの重複する GroupControl、menu <Item> 要素の最初の子要素として追加します。 その効果は次のとおりです。

  • カスタム コンテキスト タブをサポートするアプリケーションとプラットフォームでアドインが実行されている場合、カスタム コア グループとコントロールはリボンに表示されません。 代わりに、アドインが requestCreateControls メソッドを呼び出すと、カスタム コンテキスト タブが作成されます。
  • アドインが、requestCreateControlsをサポートしていないアプリケーションまたはプラットフォームで実行されている場合、要素はカスタム コア タブに表示されます。

次に例を示します。 カスタム コンテキスト タブがサポートされていない場合にのみ、カスタム コア タブに "MyButton" が表示されることに注意してください。 ただし、カスタム コンテキスト タブがサポートされているかどうかに関係なく、親グループとカスタム コア タブが表示されます。

<OfficeApp ...>
  ...
  <VersionOverrides ...>
    ...
    <Hosts>
      <Host ...>
        ...
        <DesktopFormFactor>
          <ExtensionPoint ...>
            <CustomTab ...>              
              ...
              <Group ...>
                ...
                <Control ... id="Contoso.MyButton1">
                  <OverriddenByRibbonApi>true</OverriddenByRibbonApi>
                  ...
                  <Action ...>
...
</OfficeApp>

その他の例については、「 OverriddenByRibbonApi」を参照してください。

親グループまたはメニューが <OverriddenByRibbonApi>true</OverriddenByRibbonApi> でマークされている場合、そのグループは表示されず、カスタム コンテキスト タブがサポートされていない場合、その子マークアップはすべて無視されます。 そのため、これらの子要素のいずれかが <OverriddenByRibbonApi> 要素を持っているか、その値が何であるかは関係ありません。 これは、メニュー項目またはコントロールをすべてのコンテキストで表示する必要がある場合、メニュー項目またはコントロールを <OverriddenByRibbonApi>true</OverriddenByRibbonApi>でマークする必要があるだけでなく、 先祖のメニューとグループもこのようにマークしてはならないということです。

重要

グループまたはメニュー のすべての 子要素に <OverriddenByRibbonApi>true</OverriddenByRibbonApi>マークを付けないでください。 前の段落で指定した理由で親要素が <OverriddenByRibbonApi>true</OverriddenByRibbonApi> でマークされている場合、これは無意味です。 さらに、親の <OverriddenByRibbonApi> を省略すると (または falseに設定)、カスタム コンテキスト タブがサポートされているかどうかに関係なく親が表示されますが、サポートされている場合は空になります。 そのため、カスタム コンテキスト タブがサポートされているときにすべての子要素が表示されない場合は、親を <OverriddenByRibbonApi>true</OverriddenByRibbonApi> でマークします。

指定したコンテキストで作業ウィンドウを表示または非表示にする API を使用する

<OverriddenByRibbonApi>の代わりに、アドインは、カスタム コンテキスト タブでコントロールの機能を複製する UI コントロールを含む作業ウィンドウを定義できます。次に、Office.addin.showAsTaskpane メソッドと Office.addin.hide メソッドを使用して、コンテキスト タブがサポートされている場合に作業ウィンドウを表示します。 これらの方法の使用方法の詳細については、「 Office アドインの作業ウィンドウを表示または非表示にする」を参照してください。

HostRestartNeeded エラーを処理する

一部のシナリオでは、Office はリボンを更新できず、エラーを返します。 たとえば、アドインがアップグレードされ、アップグレードされたアドインに異なるカスタム アドイン コマンドのセットがある場合は、Office アプリケーションを閉じてから、もう一度開く必要があります。 それまでの間、requestUpdate メソッドは HostRestartNeeded エラーを返します。 コードでこのエラーを処理する必要があります。 方法の例を次に示します。 この場合、reportError メソッドがユーザーにエラーを表示します。

function showDataTab() {
    try {
        Office.ribbon.requestUpdate({
            tabs: [
                {
                    id: "CtxTab1",
                    visible: true
                }
            ]});
    }
    catch(error) {
        if (error.code == "HostRestartNeeded"){
            reportError("Contoso Awesome Add-in has been upgraded. Please save your work, then close and reopen the Office application.");
        }
    }
}

リソース