Manifes untuk Add-on Google Workspace

Project Apps Script menggunakan file manifes untuk mengonfigurasi detail tertentu tentang skrip dan operasinya. Untuk mempelajari cara melihat dan mengedit manifes, lihat Manifes.

Dokumentasi ini membahas detail cara mengonfigurasi manifes untuk add-on Google Workspace.

Struktur manifes untuk Add-on Google Workspace

Add-on Google Workspace menggunakan file manifes project Apps Script untuk menentukan beberapa aspek penampilan dan perilaku add-on. Properti manifes untuk Add-on Google Workspace diatur di bagian addOns struktur objek manifes.

Contoh konfigurasi manifes Add-on Google Workspace

Contoh manifes berikut menunjukkan bagian file manifes yang menentukan Add-on Google Workspace, termasuk aspek berikut:

  • Bagian addOns.common manifes menentukan nama, URL logo, warna, dan setelan umum lainnya yang tidak bergantung pada host untuk add-on.
  • Manifes menentukan halaman beranda umum, tetapi juga menentukan halaman beranda khusus Kalender, Drive, Dokumen, Spreadsheet, dan Slide. Gmail menggunakan halaman beranda default.
  • Setelan manifes contoh memungkinkan hal berikut:
    • Pemicu eventOpen dan eventUpdated Kalender, serta dua solusi konferensi Kalender.
    • Dua tindakan universal.
    • onItemsSelectedTrigger Drive.
    • Tindakan compose Gmail dan pemicu kontekstual.
    • linkPreviewTrigger Dokumen. Untuk mempelajari pemicu ini, lihat Melihat pratinjau link dengan smart chip.
    • Antarmuka khusus file untuk Dokumen, Spreadsheet, dan Slide.
  • Kolom oauthScopes menetapkan cakupan otorisasi untuk project (Biasanya diperlukan untuk add-on).
  • Kolom urlFetchWhitelist adalah kolom yang memastikan bahwa setiap endpoint yang diambil cocok dengan daftar awalan URL HTTPS yang ditentukan. Untuk informasi selengkapnya, lihat Daftar URL yang Diizinkan.

Link dalam contoh mengarah ke deskripsi kolom tersebut dalam dokumentasi referensi manifes.

{
  "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://en.wikipedia.org/wiki/",
        "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"
        }
      ]
    },
    "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/"
  ]
}

Daftar URL yang diizinkan

Anda dapat menggunakan daftar yang diizinkan untuk menentukan URL tertentu yang telah disetujui sebelumnya untuk diakses oleh skrip atau add-on Anda. Daftar yang diizinkan membantu melindungi data pengguna; saat Anda menentukan daftar yang diizinkan, project skrip tidak dapat mengakses URL yang belum diizinkan.

Kolom ini bersifat opsional saat Anda menginstal deployment uji coba, tetapi diperlukan saat Anda membuat deployment berversi.

Anda menggunakan daftar yang diizinkan saat skrip atau add-on melakukan tindakan berikut:

  • Mengambil atau mengambil informasi dari lokasi eksternal (seperti endpoint HTTPS) menggunakan layanan UrlFetch Apps Script. Guna mengizinkan URL untuk diambil, sertakan kolom urlFetchWhitelist di file manifes Anda.
  • Membuka atau menampilkan URL sebagai respons atas tindakan pengguna (Diperlukan untuk Add-on Google Workspace yang membuka atau menampilkan URL yang berada di luar Google). Guna mengizinkan URL untuk dibuka, sertakan kolom addOns.common.openLinkUrlPrefixes dalam file manifes Anda.

Menambahkan awalan ke daftar yang diizinkan

Saat menentukan daftar yang diizinkan dalam file manifes (dengan menyertakan kolom addOns.common.openLinkUrlPrefixes atau urlFetchWhitelist), Anda harus menyertakan daftar awalan URL. Awalan yang Anda tambahkan ke manifes harus memenuhi persyaratan berikut:

  • Setiap awalan harus berupa URL yang valid.
  • Setiap awalan harus menggunakan https://, bukan http://.
  • Setiap awalan harus memiliki domain lengkap.
  • Setiap awalan harus memiliki jalur yang tidak kosong. Misalnya, https://www.google.com/ valid, tetapi https://www.google.com tidak.
  • Anda dapat menggunakan karakter pengganti untuk mencocokkan awalan subdomain URL.
  • Satu karakter pengganti * dapat digunakan di kolom addOns.common.openLinkUrlPrefixes untuk mencocokkan semua link, tetapi hal ini tidak direkomendasikan karena dapat mengekspos data pengguna pada risiko dan dapat memperpanjang proses peninjauan add-on. Hanya gunakan karakter pengganti jika fungsi add-on Anda memerlukannya.

Saat menentukan apakah URL cocok dengan awalan yang diizinkan, aturan berikut berlaku:

  • Pencocokan jalur peka huruf besar/kecil.
  • Jika awalan sama persis dengan URL, maka awalannya cocok.
  • Jika URL sama atau merupakan turunan dari awalan, maka akan cocok.

Misalnya, awalan https://example.com/foo cocok dengan URL berikut:

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

Menggunakan karakter pengganti

Anda dapat menggunakan satu karakter pengganti (*) untuk mencocokkan subdomain untuk kolom urlFetchWhitelist dan addOns.common.openLinkUrlPrefixes. Anda tidak dapat menggunakan lebih dari satu karakter pengganti untuk mencocokkan beberapa subdomain, dan karakter pengganti harus mewakili awalan URL.

Misalnya, awalan https://*.example.com/foo cocok dengan URL berikut:

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

Awalan https://*.example.com/foo tidak cocok dengan URL berikut:

  • https://subdomain.example.com/bar (akhiran tidak cocok)
  • https://example.com/foo (setidaknya harus ada satu subdomain)

Beberapa aturan awalan diterapkan saat Anda mencoba menyimpan manifes. Misalnya, awalan berikut menyebabkan error jika ada dalam manifes saat Anda mencoba menyimpan:

  • https://*.*.example.com/foo (beberapa karakter pengganti dilarang)
  • https://subdomain.*.example.com/foo (karakter pengganti harus digunakan sebagai awalan utama)