許多 Apps Script 應用程式的授權流程相當簡單明瞭,因為 有人嘗試執行指令碼專案時,會要求提供任何缺少的必要權限 以便使用。
授權模型 編輯器外掛程式為 但可能的原因如下:
使用者建立檔案時,使用者會安裝的所有外掛程式 列在 [擴充功能] 選單 如果使用者尚未授權這些外掛程式
這些外掛程式適用於 可與協作者共用的 Google 雲端硬碟。協作者: 已安裝編輯器外掛程式,即可在文件中查看 供檔案建立者使用
編輯器外掛程式會自動執行
onOpen()
函式。
為保護使用者資料,系統會套用授權模式,將部分服務
無法使用 onOpen()
。本指南可協助您瞭解自己的程式碼
以及何時能做的事
授權模式
編輯器外掛程式的授權模式取決於 狀態,取決於安裝者的身分:安裝外掛程式的使用者 或協作者
編輯器外掛程式狀態
「擴充功能」選單中的編輯器外掛程式為 已安裝和/或啟用
- 針對特定應用程式安裝外掛程式 使用者或管理員從 Google Workspace Marketplace 並授權其存取 Google 資料。
- 已在文件、表單或 簡報或試算表
- 有人協作檔案時,其中一位成員會使用 已為單一使用者安裝安裝應用程式,且 已啟用。
下表摘要說明安裝與啟用之間的差異。 請注意, 以外掛程式形式測試指令碼 您就能以其中一種狀態或兩種狀態執行測試
已安裝 | 已啟用 | |
---|---|---|
套用對象 | 使用者 | 文件、表單、簡報或試算表 |
原因: | 在商店取得外掛程式 | 在使用時從商店取得外掛程式
文件、表單、簡報或試算表, 使用先前安裝的外掛程式 文件、表單、簡報或試算表 |
誰能看到菜單 | 在所有文件、表單、簡報中 或是開啟或建立的試算表 | 所有擁有該文件、表單、簡報 或試算表 |
onOpen() 的授權模式 |
AuthMode.NONE 個(除非尺寸也已啟用,否則 AuthMode.LIMITED) |
AuthMode.LIMITED |
授權模式
編輯器外掛程式執行作業的 onOpen()
函式
在使用者開啟文件、表單、簡報或試算表時,自動顯示相關資訊。
為了保護使用者資料,Apps Script 的作用是限制
onOpen()
函式可執行的操作。編輯器外掛程式狀態
決定 onOpen()
函式在哪個授權模式中執行。
如果檔案已啟用編輯器外掛程式,
表單、簡報或試算表,onOpen()
於
AuthMode.LIMITED
。如果外掛程式未啟用,且
只已安裝,onOpen()
會在 AuthMode.NONE
中執行。
在 AuthMode.NONE
中,外掛程式無法執行某些特定功能
直至使用者與外掛程式互動
只要點選或執行自訂函式如果您的
外掛程式會在 onOpen()
中使用這些服務,
onInstall()
或全域範圍,權限失敗及其他呼叫,例如
繼續填滿選單,停下來。「說明」是唯一的支援選項。
如要執行受限制的服務呼叫,您必須使用 AuthMode.FULL
授權
模式。使用者互動函式,例如點選選單選項
只會在這個模式下執行程式碼在 AuthMode.FULL
模式下執行後,
外掛程式可以使用使用者授權的所有範圍。
Apps Script 通過授權模式
做為 Apps Script 的 authMode
屬性
事件參數、e
;值
e.authMode
對應 Apps Script 中的常數
ScriptApp.AuthMode
列舉。
授權模式適用於所有 Apps Script 執行方法,
包括從指令碼編輯器、選單項目或 Apps Script 執行
google.script.run
呼叫。不過
只有在指令碼將結果執行時,才能檢查 e.authMode
屬性
觸發條件,例如 onOpen()
、onEdit()
或 onInstall()
。自訂函式
在 Google 試算表中使用專屬的授權模式 AuthMode.CUSTOM_FUNCTION
,
與 LIMITED
類似,但限制稍有不同所有
其他情況則是在 AuthMode.FULL
中執行指令碼,如下所述
表格。
NONE |
LIMITED |
CUSTOM_FUNCTION |
FULL |
|
---|---|---|---|---|
出現以下時間: | onOpen() (如果使用者安裝了
外掛程式,但在文件、表單
簡報或試算表) |
onOpen() (所有其他時間)onEdit() (僅適用於 Google 試算表) |
自訂函式 | 所有其他時間,包括: 可安裝觸發條件 onInstall()
google.script.run |
存取使用者資料 | 僅限語言代碼 | 僅限語言代碼 | 僅限語言代碼 | 是 |
文件、表單、簡報或試算表的存取權 | 否 | 是 | 是 - 唯讀 | 是 |
存取使用者介面 | 新增菜單品項 | 新增菜單品項 | 否 | 是 |
使用 Properties |
否 | 是 | 是 | 是 |
有權存取「Jdbc 」和「UrlFetch 」 |
否 | 否 | 是 | 是 |
其他服務 | Logger Utilities |
所有不會存取使用者資料的服務 | 所有不會存取使用者資料的服務 | 所有服務 |
編輯器外掛程式的授權生命週期
為目前的使用者安裝外掛程式時
在目前的檔案中啟用或已啟用
已為文件、表單、簡報載入外掛程式
或試算表外掛程式為
「擴充功能」選單中列出的應用程式,並開始監聽
簡單觸發條件 onInstall()
,
onOpen()
和 onEdit()
。如果使用者點選
如果為「擴充功能」選單項目,系統會執行。
已安裝編輯器外掛程式
如果從商店安裝編輯器外掛程式,
onInstall()
函式會在 AuthMode.FULL
中執行。在授權模式中,
外掛程式可以執行複雜的設定日常安排。我們也建議您
請使用 onInstall()
建立選單項目,因為文件、表單、簡報
或試算表已開啟,且 onOpen()
函式尚未執行。
以下範例說明如何呼叫 onOpen()
函式
從 onInstall()
函式執行:
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
,請嘗試以下動作:
- 開啟外掛程式的 Apps Script 專案,然後找出
onOpen()
函式。 - 在
onOpen()
函式中搜尋提及 Apps Script 或與這些物件相關聯的服務或物件PropertiesService
、SpreadsheetApp
或GmailApp
。 - 如果服務用於建立 UI 元素以外的其他用途,
請將其移除或納入評論區塊中
僅保留以下方法:
.getUi()
、.createMenu()
、.addItem()
、 和.addToUi()
。 另外,請找出並移除函式以外的任何服務。 - 找出可能包含註解或已移除程式碼行的函式 特別是使用他們提供的資訊 並將服務呼叫移至需要這些函式的函式重新排列或重新撰寫 以配合先前步驟所做的變更。
儲存程式碼並建立測試部署作業。
建立測試部署作業時,請確認 Config 欄位 「Installed for 目前使用者」,且「設定」方塊下方的文字顯示: 在
AuthMode.None
中測試啟動測試部署作業,並開啟「Extensions」選單。
如果顯示所有選單項目,表示問題已解決。 如果只看到「說明」選單,請返回步驟 1。 你可能未接聽服務來電。