Google Workspace 外掛程式的資訊清單

外掛程式會使用manifest檔案,設定應用程式及其運作方式的特定詳細資料。

本文說明如何為 Google Workspace 外掛程式設定資訊清單。

Google Workspace 外掛程式的資訊清單結構

Google Workspace 外掛程式會使用資訊清單檔案,定義外掛程式外觀和行為的幾個面向。

Google Workspace 外掛程式的資訊清單屬性會整理在資訊清單物件結構的 addOns 部分下方。

Google Chat 的資訊清單

如果 Google Workspace 外掛程式擴充 Google Chat,您必須在 Google Cloud 控制台中啟用並設定 Google Chat API,設定 Google Chat 應用程式

常見的資訊清單設定 (包括 addons.common) 會在 Chat 中遭到忽略。請改用 Chat API 設定下列 Chat 設定,而非使用外掛程式資訊清單:

如果您已在 Apps Script 中建構外掛程式,則必須在資訊清單中新增或更新下列物件:

如要瞭解如何設定外掛程式的 Chat 設定,請參閱「設定 Google Chat 應用程式」一文。

Google Workspace 外掛程式資訊清單設定範例

以下資訊清單範例顯示資訊清單檔案中定義 Google Workspace 外掛程式的部分,包括下列各項:

  • 資訊清單的 addOns.common 部分會定義外掛程式的名稱、標誌網址、顏色和其他一般、不依主機設定的設定。
  • 資訊清單定義了一般首頁,但也定義了日曆、雲端硬碟、文件、試算表和簡報專屬的首頁。Gmail 會使用預設首頁。
  • 範例資訊清單設定可啟用下列項目:
    • 日曆 eventOpeneventUpdated 觸發條件。
    • (僅限 Apps Script) 兩種日曆會議解決方案
    • 兩個通用動作。
    • 雲端硬碟 onItemsSelectedTrigger
    • Gmail 撰寫動作和情境觸發條件。
    • Docs linkPreviewTriggers 物件。如要瞭解這個觸發條件,請參閱「使用智慧型方塊預覽連結」一文。
    • Docs createActionTriggers 物件。如要瞭解這個觸發條件,請參閱「透過 @ 選單建立第三方資源」。
    • Google 文件、試算表和簡報的檔案專屬介面。
  • oauthScopes 欄位會設定專案的授權範圍 (通常是外掛程式所需)。
  • (僅限 Apps Script) urlFetchWhitelist 欄位可確保任何擷取的端點都與指定的 HTTPS 網址前置字串清單相符。詳情請參閱「將網址加入許可清單」。

範例中的連結會直接連往 Apps ScriptHTTP Google Workspace 外掛程式的對應資訊清單參考說明文件,說明該欄位的用途。

Apps Script

{
  "addOns": {
    "calendar": {
      "createSettingsUrlFunction": "getConferenceSettingsPageUrl",
      "conferenceSolution": [{
        "id": "my-video-conf",
        "logoUrl": "https://lh3.googleusercontent.com/...",
        "name": "My Video Conference",
        "onCreateFunction": "onCreateMyVideoConference"
      }, {
        "id": "my-streamed-conf",
        "logoUrl": "https://lh3.googleusercontent.com/...",
        "name": "My Streamed Conference",
        "onCreateFunction": "onCreateMyStreamedConference"
      }],
      "currentEventAccess": "READ_WRITE",
      "eventOpenTrigger": {
        "runFunction": "onCalendarEventOpen"
      },
      "eventUpdateTrigger": {
        "runFunction": "onCalendarEventUpdate"
      },
      "eventAttachmentTrigger": {
        "label": "My Event Attachment",
        "runFunction": "onCalendarEventAddAttachment"
      },
      "homepageTrigger": {
        "runFunction": "onCalendarHomePageOpen",
        "enabled": true
      }
    },
    "common": {
      "homepageTrigger": {
        "runFunction": "onDefaultHomePageOpen",
        "enabled": true
      },
      "layoutProperties": {
        "primaryColor": "#ff392b",
        "secondaryColor": "#d68617"
      },
      "logoUrl": "https://ssl.gstatic.com/docs/script/images/logo/script-64.png",
      "name": "Demo Google Workspace Add-on",
      "openLinkUrlPrefixes": [
        "https://mail.google.com/",
        "https://script.google.com/a/google.com/d/",
        "https://drive.google.com/a/google.com/file/d/",
        "https://www.example.com/"
      ],
      "universalActions": [{
        "label": "Open settings",
        "runFunction": "getSettingsCard"
      }, {
        "label": "Open Help URL",
        "openLink": "https://www.example.com/help"
      }],
      "useLocaleFromApp": true
    },
    "drive": {
      "homepageTrigger": {
        "runFunction": "onDriveHomePageOpen",
        "enabled": true
      },
      "onItemsSelectedTrigger": {
        "runFunction": "onDriveItemsSelected"
      }
    },
    "gmail": {
      "composeTrigger": {
        "selectActions": [
          {
            "text": "Add images to email",
            "runFunction": "getInsertImageComposeCards"
          }
        ],
        "draftAccess": "METADATA"
      },
      "contextualTriggers": [
        {
          "unconditional": {},
          "onTriggerFunction": "onGmailMessageOpen"
        }
      ]
    },
    "docs": {
      "homepageTrigger": {
        "runFunction": "onEditorsHomepage"
      },
      "onFileScopeGrantedTrigger": {
        "runFunction": "onFileScopeGrantedEditors"
      },
      "linkPreviewTriggers": [
        {
        "runFunction": "onLinkPreview",
        "patterns": [
            {
              "hostPattern": "example.com",
              "pathPrefix": "example-path"
            }
        ],
        "labelText": "Link preview",
        "localizedLabelText": {
          "es": "Link preview localized in Spanish"
        },
        "logoUrl": "https://www.example.com/images/smart-chip-icon.png"
        }
      ],
      "createActionTriggers": [
        {
          "id": "exampleId",
          "labelText": "Example label text",
          "localizedLabelText": {
            "es": "Label text localized in Spanish"
          },
          "runFunction": "exampleFunction",
          "logoUrl": "https://www.example.com/images/case.png"
        }
      ]
    },
    "sheets": {
      "homepageTrigger": {
        "runFunction": "onEditorsHomepage"
      },
      "onFileScopeGrantedTrigger": {
        "runFunction": "onFileScopeGrantedEditors"
      }
    },
    "slides": {
      "homepageTrigger": {
        "runFunction": "onEditorsHomepage"
      },
      "onFileScopeGrantedTrigger": {
        "runFunction": "onFileScopeGrantedEditors"
      }
    }
  },
  "oauthScopes": [
    "https://www.googleapis.com/auth/calendar.addons.execute",
    "https://www.googleapis.com/auth/calendar.addons.current.event.read",
    "https://www.googleapis.com/auth/calendar.addons.current.event.write",
    "https://www.googleapis.com/auth/drive.addons.metadata.readonly",
    "https://www.googleapis.com/auth/gmail.addons.current.action.compose",
    "https://www.googleapis.com/auth/gmail.addons.current.message.metadata",
    "https://www.googleapis.com/auth/userinfo.email",
    "https://www.googleapis.com/auth/script.external_request",
    "https://www.googleapis.com/auth/script.locale",
    "https://www.googleapis.com/auth/script.scriptapp",
    "https://www.googleapis.com/auth/drive.file",
    "https://www.googleapis.com/auth/documents.currentonly",
    "https://www.googleapis.com/auth/spreadsheets.currentonly",
    "https://www.googleapis.com/auth/presentations.currentonly",
    "https://www.googleapis.com/auth/workspace.linkpreview"
  ],
  "urlFetchWhitelist": [
    "https://www.example.com/myendpoint/"
  ]
}

HTTP

{
  "addOns": {
    "calendar": {
      "currentEventAccess": "READ_WRITE",
      "eventOpenTrigger": {
        "runFunction": "https://myownpersonaldomain.com/mypage?trigger=onCalendarEventOpen"
      },
      "eventUpdateTrigger": {
        "runFunction": "https://myownpersonaldomain.com/mypage?trigger=onCalendarEventUpdate"
      },
      "eventAttachmentTrigger": {
        "label": "My Event Attachment",
        "runFunction": "https://myownpersonaldomain.com/mypage?trigger=onCalendarEventAddAttachment"
      },
      "homepageTrigger": {
        "runFunction": "https://myownpersonaldomain.com/mypage?trigger=onCalendarHomePageOpen",
        "enabled": true
      }
    },
    "common": {
      "homepageTrigger": {
        "runFunction": "https://myownpersonaldomain.com/mypage?trigger=onDefaultHomePageOpen",
        "enabled": true
      },
      "layoutProperties": {
        "primaryColor": "#ff392b",
        "secondaryColor": "#d68617"
      },
      "logoUrl": "https://ssl.gstatic.com/docs/script/images/logo/script-64.png",
      "name": "Demo Google Workspace Add-on",
      "openLinkUrlPrefixes": [
        "https://mail.google.com/",
        "https://script.google.com/a/google.com/d/",
        "https://drive.google.com/a/google.com/file/d/",
        "https://www.example.com/"
      ],
      "universalActions": [{
        "label": "Open settings",
        "runFunction": "https://myownpersonaldomain.com/mypage?trigger=getSettingsCard"
      }, {
        "label": "Open Help URL",
        "openLink": "https://www.example.com/help"
      }],
      "useLocaleFromApp": true
    },
    "drive": {
      "homepageTrigger": {
        "runFunction": "https://myownpersonaldomain.com/mypage?trigger=onDriveHomePageOpen",
        "enabled": true
      },
      "onItemsSelectedTrigger": {
        "runFunction": "https://myownpersonaldomain.com/mypage?trigger=onDriveItemsSelected"
      }
    },
    "gmail": {
      "composeTrigger": {
        "actions": [
          {
            "label": "Add images to email",
            "runFunction": "https://myownpersonaldomain.com/mypage?trigger=getInsertImageComposeCards"
          }
        ],
        "draftAccess": "METADATA"
      },
      "contextualTriggers": [
        {
          "unconditional": {},
          "onTriggerFunction": "https://myownpersonaldomain.com/mypage?trigger=onGmailMessageOpen"
        }
      ]
    },
    "docs": {
      "homepageTrigger": {
        "runFunction": "https://myownpersonaldomain.com/mypage?trigger=onEditorsHomepage"
      },
      "onFileScopeGrantedTrigger": {
        "runFunction": "https://myownpersonaldomain.com/mypage?trigger=onFileScopeGrantedEditors"
      },
      "linkPreviewTriggers": [
        {
          "runFunction": "https://myownpersonaldomain.com/mypage?trigger=onLinkPreview",
          "patterns": [
              {
                "hostPattern": "example.com",
                "pathPrefix": "example-path"
              }
          ],
          "labelText": "Link preview",
          "localizedLabelText": {
            "es": "Link preview localized in Spanish"
          },
          "logoUrl": "https://www.example.com/images/smart-chip-icon.png"
        }
      ],
      "createActionTriggers": [
        {
          "id": "exampleId",
          "labelText": "Example label text",
          "localizedLabelText": {
            "es": "Label text localized in Spanish"
          },
          "runFunction": "https://myownpersonaldomain.com/mypage?trigger=onCreateAction",
          "logoUrl": "https://www.example.com/images/case.png"
        }
      ]
    },
    "sheets": {
      "homepageTrigger": {
        "runFunction": "https://myownpersonaldomain.com/mypage?trigger=onEditorsHomepage"
      },
      "onFileScopeGrantedTrigger": {
        "runFunction": "https://myownpersonaldomain.com/mypage?trigger=onFileScopeGrantedEditors"
      }
    },
    "slides": {
      "homepageTrigger": {
        "runFunction": "https://myownpersonaldomain.com/mypage?trigger=onEditorsHomepage"
      },
      "onFileScopeGrantedTrigger": {
        "runFunction": "https://myownpersonaldomain.com/mypage?trigger=onFileScopeGrantedEditors"
      }
    }
  },
  "oauthScopes": [
    "https://www.googleapis.com/auth/calendar.addons.execute",
    "https://www.googleapis.com/auth/calendar.addons.current.event.read",
    "https://www.googleapis.com/auth/calendar.addons.current.event.write",
    "https://www.googleapis.com/auth/drive.addons.metadata.readonly",
    "https://www.googleapis.com/auth/gmail.addons.current.action.compose",
    "https://www.googleapis.com/auth/gmail.addons.current.message.metadata",
    "https://www.googleapis.com/auth/userinfo.email",
    "https://www.googleapis.com/auth/script.external_request",
    "https://www.googleapis.com/auth/script.locale",
    "https://www.googleapis.com/auth/script.scriptapp",
    "https://www.googleapis.com/auth/drive.file",
    "https://www.googleapis.com/auth/documents.currentonly",
    "https://www.googleapis.com/auth/spreadsheets.currentonly",
    "https://www.googleapis.com/auth/presentations.currentonly",
    "https://www.googleapis.com/auth/workspace.linkpreview"
  ]
}

許可清單網址

您可以使用許可清單指定特定網址,讓指令碼或外掛程式預先核准存取這些網址。許可清單有助於保護使用者資料;定義許可清單後,指令碼專案就無法存取未加入許可清單的網址。

安裝測試部署時,這個欄位為選填,但建立版本化部署時則為必填。

當指令碼或外掛程式執行下列動作時,您就會使用許可清單:

  • 使用 Apps Script UrlFetch 服務,從外部位置 (例如 HTTPS 端點) 擷取或擷取資訊。如要將網址加入取得的許可清單,請在資訊清單檔案中加入 urlFetchWhitelist 欄位。
  • 根據使用者動作開啟或顯示網址 (如果 Google Workspace 外掛程式會開啟或顯示 Google 以外的網址,則必須使用此方法)。如要將網址加入許可清單,請在資訊清單檔案中加入 addOns.common.openLinkUrlPrefixes 欄位。

在許可清單中新增前置字串

在資訊清單檔案中指定許可清單 (透過加入 addOns.common.openLinkUrlPrefixesurlFetchWhitelist 欄位) 時,您必須加入網址前置字串清單。您在資訊清單中新增的前置字串必須符合下列規定:

  • 每個前置字串都必須是有效的網址。
  • 每個前置字串都必須使用 https://,而非 http://
  • 每個前置字串都必須有完整網域。
  • 每個前置字串都必須有非空白路徑。例如,https://www.google.com/ 有效,但 https://www.google.com 無效。
  • 您可以使用萬用字元比對網址子網域前置字串。
  • 您可以在 addOns.common.openLinkUrlPrefixes 欄位中使用單一 * 萬用字元,比對所有連結,但我們不建議這麼做,因為這可能會使使用者資料暴露在風險中,並延長外掛程式審查程序。只有在外掛程式功能需要時,才使用萬用字元。

判斷網址是否與允許清單中的前置字串相符時,會套用下列規則:

  • 路徑比對會區分大小寫。
  • 如果前置字串與網址相同,則代表相符。
  • 如果網址相同或為前置字串的子項,則表示符合。

舉例來說,前置字串 https://example.com/foo 會比對下列網址:

  • https://example.com/foo
  • https://example.com/foo/
  • https://example.com/foo/bar
  • https://example.com/foo?bar
  • https://example.com/foo#bar

使用萬用字元

您可以使用單一萬用字元 (*) 比對 urlFetchWhitelistaddOns.common.openLinkUrlPrefixes 欄位的子網域。您無法使用多個萬用字元比對多個子網域,且萬用字元必須代表網址的前置字串。

例如,前置字串 https://*.example.com/foo 會比對下列網址:

  • https://subdomain.example.com/foo
  • https://any.number.of.subdomains.example.com/foo

前置字串 https://*.example.com/foo「不」符合下列網址:

  • https://subdomain.example.com/bar (後置字串不相符)
  • https://example.com/foo (至少須提供一個子網域)

嘗試儲存資訊清單時,系統會強制執行部分前置字詞規則。舉例來說,如果您嘗試儲存時,資訊清單中出現下列前置字串,就會發生錯誤:

  • https://*.*.example.com/foo (禁止使用多個萬用字元)
  • https://subdomain.*.example.com/foo (萬用字元必須用於前置字串)