エディタのアドオン承認

多くの Apps Script ベースのアプリの認証は、 スクリプト プロジェクトは、権限が不足している場合に、 ありません。

この認証モデルでは、 エディタ アドオン: 複雑になりますが、その理由はいくつかあります。

  • ユーザーがファイルを作成すると、ユーザーがインストールしたすべてのアドオンが [拡張機能] メニューに表示されます。これらのアドオンがまだ承認されていない場合でも同様です。

  • これらのアドオンは、共同編集者と共有できる Google ドライブ内のファイルで動作します。編集者アドオンがインストールされていない共同編集者は、ファイル作成者が使用したドキュメントで編集者アドオンを確認できます。

  • エディタ アドオンは自動的に onOpen() を実行します ドキュメントを開いたときに行われます。

ユーザーデータを保護するため、onOpen() が一部のサービスを使用できないようにする認可モードが適用されます。このガイドでは、コードが何をいつ実行できるかを理解するのに役立ちます。

認可モデル

エディタのアドオンの承認モードは、 状態は誰がそれを使用しているか、そのアドオンをインストールしたユーザー、 共有することもできます。

エディタのアドオンの状態

[拡張機能] メニューの [エディタ アドオン] は、 インストール、有効化、またはその両方です。

  • 特定の特定の環境にアドオンがインストールされている場合 ユーザーまたは管理者が Google データへのアクセスを承認します。
  • アドオンがドキュメント、フォーム、デバイスで有効になっている プレゼンテーションやスプレッドシートで使用できるようになります。
  • 複数のユーザーがファイルを共同編集していて、そのうちの 1 人が 1 人のユーザーにインストールされていること、かつ 有効になっている

次の表に、インストール済みと有効の違いを示します。注: スクリプトをアドオンとしてテストする この状態のいずれか、または両方の状態でテストを実行できます。

インストール済み 有効
適用対象 ユーザー ドキュメント、フォーム、プレゼンテーション、スプレッドシート
原因 ストアからアドオンを取得する ドキュメント、フォーム、プレゼンテーション、スプレッドシートの使用中にストアからアドオンを取得する、または
以前にインストールしたアドオンをドキュメント、フォーム、プレゼンテーション、スプレッドシートで使用する
メニューの表示対象 開いたまたは作成したすべてのドキュメント、フォーム、プレゼンテーション、スプレッドシートで、そのユーザーのみ そのドキュメント、フォーム、プレゼンテーション、スプレッドシートのすべての共同編集者
onOpen() の認可モード AuthMode.NONE
有効になっている場合を除く。その場合は AuthMode.LIMITED)
AuthMode.LIMITED

認証モード

エディタ アドオンの onOpen() 関数は、ユーザーがドキュメント、フォーム、プレゼンテーション、スプレッドシートを開いたときに自動的に実行されます。ユーザーのデータを保護するため、Apps Script では onOpen() 関数の実行内容が制限されています。onOpen() 関数が実行される認可モードは、エディタ アドオンの状態によって決まります。

ファイル内でエディタ アドオンが有効になっている場合は、 フォーム、プレゼンテーション、スプレッドシートがあり、onOpen() の実行場所 AuthMode.LIMITED。アドオンが有効ではなく、 インストールのみの場合、onOpen()AuthMode.NONE で実行されます。

AuthMode.NONE で、アドオンが特定の ユーザーが Google Cloud でアドオンを操作できるようになるまで、 カスタム関数のクリックや実行などですアドオンが onOpen()onInstall()、またはグローバル スコープでこれらのサービスを使用しようとすると、権限が失敗し、メニューの入力などの他の呼び出しが停止します。サポートされているオプションはヘルプのみです。

制限付きサービスの呼び出しを実行するには、AuthMode.FULL 認証を使用する必要があります。 モードです。メニュー オプションのクリックや このモードでのみ実行されます。コードを AuthMode.FULL モードで実行すると、 ユーザーが承認したすべてのスコープを使用できます。

Apps Script は認証モードを渡します Apps Script の authMode プロパティとして指定する イベント パラメータe;価値 e.authMode は Apps Script の定数に対応します。 ScriptApp.AuthMode 列挙値。

認可モードは、スクリプト エディタ、メニュー項目、Apps Script の google.script.run 呼び出しからの実行など、すべての Apps Script 実行方法に適用されます。ただし、 e.authMode プロパティは、スクリプトが結果として実行された場合にのみ検査できます。 トリガーonOpen()onEdit() など) または onInstall()カスタム関数 Google スプレッドシートでは、独自の認証モードである AuthMode.CUSTOM_FUNCTION を使用します。 これは LIMITED に似ていますが、制限が少し異なります。その他のすべてのケースでは、次の表に示すように、スクリプトは AuthMode.FULL で実行されます。

NONE LIMITED CUSTOM_FUNCTION FULL
発生期間 onOpen()(ユーザーがアドオンをインストールしたが、ドキュメント、フォーム、プレゼンテーション、スプレッドシートで有効にしていない場合) onOpen()(上記以外の時間帯)
onEdit()(スプレッドシートのみ)
カスタム関数 その他のすべてのタイミング(以下を含む):
インストール可能なトリガー
onInstall()
google.script.run
ユーザーデータへのアクセス ロケールのみ 言語 / 地域のみ 言語 / 地域のみ
ドキュメント、フォーム、プレゼンテーション、スプレッドシートへのアクセス いいえ はい - 読み取り専用
管理画面へのアクセス メニュー アイテムを追加する メニュー アイテムを追加する いいえ
Properties へのアクセス いいえ
JdbcUrlFetch へのアクセス いいえ ×
その他のサービス Logger
Utilities
ユーザーデータにアクセスしないサービス ユーザーデータにアクセスしないサービス すべてのサービス

エディタのアドオンの承認ライフサイクル

現在のユーザー用にアドオンがインストールされているか、現在のファイルで有効になっている場合、そのファイルが開かれると、ドキュメント、フォーム、プレゼンテーション、スプレッドシートにアドオンが読み込まれます。アドオンが [拡張機能] メニューに表示され、シンプル トリガー onInstall()onOpen()onEdit() のリッスンを開始します。ユーザーが 拡張機能のメニュー項目です。実行します。

エディタのアドオンがインストールされました

ストアからエディタ アドオンをインストールすると、その onInstall() 関数は AuthMode.FULL で実行されます。この承認モードでは、アドオンは複雑な設定ルーティンを実行できます。また、 メニュー項目を作成するには onInstall() を使用します。ドキュメント、フォーム、プレゼンテーション、 またはスプレッドシートがすでに開いていて、onOpen() 関数が実行されていません。 次のサンプルは、onInstall() 関数から onOpen() 関数を呼び出す方法を示しています。

function onInstall(e) {
  onOpen(e);
  // Perform additional setup as needed.
}

エディタのアドオンが開きます

ドキュメント、フォーム、プレゼンテーション、スプレッドシートを開くと、 現在のユーザーがインストールしたエディタ アドオン、または そのファイルで共同編集者が有効にしていることを確認し、 それぞれの onOpen() 関数を使用します。onOpen() が実行される認可モードは、アドオンがインストールされているか有効かによって異なります。

基本メニューのみを作成するアドオンの場合、このモードは 関係ありません。次のサンプルは、基本的な onOpen() 関数を示しています。

function onOpen(e) {
  SpreadsheetApp.getUi().createAddonMenu() // Or DocumentApp.
      .addItem('Insert chart', 'insertChart')
      .addItem('Update charts', 'updateCharts')
      .addToUi();
}

保存されている Apps Script のプロパティに基づいて動的メニュー アイテムを追加したり、現在のファイルの内容を読み取ったり、その他の高度なタスクを実行したりするには、認可モードを特定して適切に処理する必要があります。

次のサンプルは、高度な onOpen() 関数を示しています。この関数は、 認可モードに応じてアクションを制御します。

function onOpen(e) {
  var menu = SpreadsheetApp.getUi().createAddonMenu(); // Or DocumentApp.
  if (e && e.authMode == ScriptApp.AuthMode.NONE) {
    // Add a normal menu item (works in all authorization modes).
    menu.addItem('Start workflow', 'startWorkflow');
  } else {
    // Add a menu item based on properties (doesn't work in AuthMode.NONE).
    var properties = PropertiesService.getDocumentProperties();
    var workflowStarted = properties.getProperty('workflowStarted');
    if (workflowStarted) {
      menu.addItem('Check workflow status', 'checkWorkflow');
    } else {
      menu.addItem('Start workflow', 'startWorkflow');
    }
  }
  menu.addToUi();
}

注: アドオンは、 AuthMode.LIMITEDメニュー項目を使用できます を使用してサイドバーとダイアログを開くことができます。これらは AuthMode.FULL で実行されるためです。

ユーザーがエディタのアドオンを実行する

ユーザーが [拡張機能] メニュー項目をクリックすると、Apps Script はまずユーザーがアドオンをインストールしているかどうかを確認し、インストールしていない場合はインストールするよう促します。ユーザーがアドオンを承認すると、スクリプトは AuthMode.FULL のメニュー項目に対応する関数を実行します。「 アドオンが有効になっているドキュメント、フォーム、 プレゼンテーション、スプレッドシートを作成できます。

アドオン メニューが表示されない問題のトラブルシューティング

コードで認可モードが正しく管理されていない場合、アドオン メニューがレンダリングされないことがあります。例:

  • アドオンが Apps Script を実行しようとする 現在の認証モードでサポートされていないサービス アカウントが使用されます。

  • アドオンが、ユーザーが操作する前にサービス呼び出しを実行しようとしている。

権限エラーの原因となっているサービス呼び出しを AuthMode.NONE さん、次の操作をお試しください。

  1. アドオンの Apps Script プロジェクトを開き、onOpen() 関数を見つけます。
  2. onOpen() 関数で Apps Script への言及を検索する サービスやオブジェクトに関連する PropertiesServiceSpreadsheetApp、または GmailApp
  3. UI 要素の作成以外の目的でサービスを使用する場合は、 コメントブロックで囲むこともできます 残すメソッドは .getUi().createMenu().addItem().addToUi() のみです。また、関数の外部にあるサービスを見つけて削除します。
  4. 前の手順でコメント化または削除されたコード行が含まれている可能性のある関数(特に、生成された情報を使用している関数)を特定し、サービス呼び出しを必要とする関数に移動します。並べ替えまたは書き換え コードベースを更新して、前のステップで行った変更に対応できるようにします。
  5. コードを保存して、テスト用のデプロイメントを作成します。

    テストデプロイを作成する場合は、[Config] フィールドが 現在のユーザーにインストールされており、かつ [Config] ボックスの下のテキストに [Installed for current user] と表示されていること。 AuthMode.None でのテスト

  6. テストデプロイを起動し、[拡張機能] メニューを開きます。

  7. すべてのメニュー項目が表示される場合、問題は解決しています。 [ヘルプ] メニューのみが表示される場合は、ステップ 1 に戻ります。サービス コールを見逃した可能性があります。