Надстройка использует файл манифеста для настройки определенных сведений о приложении и его работе.
В этой документации описаны подробности настройки манифеста для надстройки Google Workspace.
Структура манифеста для дополнений Google Workspace
Надстройки Google Workspace используют файл манифеста для определения некоторых аспектов внешнего вида и поведения надстройки.
Свойства манифеста для надстроек Google Workspace организованы в разделе addOns
структуры объекта манифеста.
- Информацию о файлах манифеста Apps Script см. в разделе Структура манифеста .
- Информацию о файлах манифеста для надстроек, созданных с использованием конечных точек HTTP, см. на ресурсе REST:
projects.deployments
Пример конфигурации манифеста надстройки Google Workspace
В следующем образце манифеста показан раздел файла манифеста, определяющий надстройку Google Workspace, включая следующие аспекты:
- Раздел манифеста
addOns.common
определяет имя, URL-адрес логотипа, цвета и другие общие, независимые от хоста параметры надстройки. - Манифест определяет общую домашнюю страницу, а также определяет домашние страницы Календаря, Диска, Документов, Таблиц и Слайдов. Gmail использует домашнюю страницу по умолчанию.
- Примеры настроек манифеста позволяют следующее:
- Триггеры
eventOpen
иeventUpdated
календаря. - (Только Apps Script) Два решения для конференций Calendar.
- Два универсальных действия.
- Диск
onItemsSelectedTrigger
. - Действие создания сообщения Gmail и контекстный триггер.
- Объект
linkPreviewTriggers
в Документах. Подробнее об этом триггере см. в разделе Предварительный просмотр ссылок со смарт-чипами . - Объект
createActionTriggers
в Документах. Дополнительные сведения об этом триггере см. в разделе Создание сторонних ресурсов из меню @ . - Интерфейсы для файлов для документов, таблиц и слайдов.
- Триггеры
- Поле
oauthScopes
задает области авторизации для проекта (обычно требуется для надстроек). - (Только для Apps Script) Поле
urlFetchWhitelist
— это поле, которое гарантирует, что все выбранные конечные точки соответствуют указанному списку префиксов URL-адресов HTTPS. Дополнительную информацию см. в разделе URL-адреса белого списка .
Ссылки в примере ведут на описания этого поля в соответствующей справочной документации манифеста для Apps Script и HTTP -надстроек Google Workspace.
Скрипт приложений
{ "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" ] }
URL-адреса белого списка
Вы используете белые списки для обозначения определенных URL-адресов, которые предварительно одобрены для доступа вашим скриптом или надстройкой. Белые списки помогают защитить пользовательские данные; Когда вы определяете список разрешений, проекты сценариев не могут получить доступ к URL-адресам, которые не были добавлены в список разрешений.
Это поле является необязательным при установке тестового развертывания, но является обязательным при создании версионного развертывания.
Вы используете белые списки, когда ваш скрипт или надстройка выполняет следующие действия:
- Извлекает или извлекает информацию из внешнего расположения (например, конечных точек HTTPS) с помощью службы
UrlFetch
скрипта приложений. Чтобы добавить URL-адреса в список разрешенных для извлечения, включите полеurlFetchWhitelist
в файл манифеста. - Открывает или отображает URL-адрес в ответ на действие пользователя (требуется для надстроек Google Workspace, которые открывают или отображают URL-адреса, внешние по отношению к Google). Чтобы открыть URL-адреса, разрешенные для открытия, включите поле
addOns.common.openLinkUrlPrefixes
в файл манифеста.
Добавление префиксов в белый список
Когда вы указываете белые списки в файле манифеста (путем включения поля addOns.common.openLinkUrlPrefixes
или urlFetchWhitelist
), вы должны включить список префиксов URL-адресов. Префиксы, добавляемые в манифест, должны удовлетворять следующим требованиям:
- Каждый префикс должен быть действительным URL-адресом.
- Каждый префикс должен использовать
https://
, а неhttp://
. - Каждый префикс должен иметь полный домен.
- Каждый префикс должен иметь непустой путь. Например,
https://www.google.com/
действителен, аhttps://www.google.com
– нет. - Вы можете использовать подстановочные знаки для сопоставления префиксов субдоменов URL.
- В поле
addOns.common.openLinkUrlPrefixes
можно использовать один подстановочный знак*
, чтобы сопоставить все ссылки, но это не рекомендуется, поскольку это может подвергнуть риску данные пользователя и продлить процесс проверки надстройки . Используйте подстановочный знак только в том случае, если этого требуют функции вашего дополнения.
При определении соответствия URL-адреса префиксу в белом списке применяются следующие правила:
- Сопоставление путей чувствительно к регистру.
- Если префикс идентичен URL-адресу, это совпадение.
- Если URL-адрес тот же или дочерний по отношению к префиксу, это совпадение.
Например, префикс https://example.com/foo
соответствует следующим URL-адресам:
-
https://example.com/foo
-
https://example.com/foo/
-
https://example.com/foo/bar
-
https://example.com/foo?bar
-
https://example.com/foo#bar
Использование подстановочных знаков
Вы можете использовать один подстановочный знак ( *
) для сопоставления поддомена как для полей urlFetchWhitelist
, так и для полей addOns.common.openLinkUrlPrefixes
. Вы не можете использовать более одного подстановочного знака для сопоставления нескольких субдоменов, и подстановочный знак должен представлять собой ведущий префикс URL-адреса.
Например, префикс https://*.example.com/foo
соответствует следующим URL-адресам:
-
https://subdomain.example.com/foo
-
https://any.number.of.subdomains.example.com/foo
Префикс https://*.example.com/foo
не соответствует следующим URL-адресам:
-
https://subdomain.example.com/bar
(несоответствие суффикса) -
https://example.com/foo
(должен присутствовать хотя бы один субдомен)
Некоторые правила префикса применяются при попытке сохранить манифест. Например, следующие префиксы вызывают ошибку, если они присутствуют в вашем манифесте при попытке сохранения:
-
https://*.*.example.com/foo
(множественные подстановочные знаки запрещены) -
https://subdomain.*.example.com/foo
(в качестве ведущего префикса необходимо использовать подстановочные знаки)