我將多個 Google Apps 腳本部署為庫并添加到 Google 表格中。
當我與其他用戶共享這些作業表時,問題就開始了。為了讓他們看到用戶選單加載,我需要給他們編輯訪問我的庫腳本的權限。僅查看訪問權限是不夠的。然后我從他們那里收到以下錯誤訊息“例外:尚未為您的 Apps 腳本管理的云平臺專案啟用服務管理 SDK API”
我知道我得到這個是因為使用函式 AdminDirectory.Members.insert(...); 我不想在 GSuite 中為它們添加 API 權限。
以下 oauthScopes 正在使用中:
"oauthScopes": [
"https://www.googleapis.com/auth/drive",
"https://www.googleapis.com/auth/spreadsheets",
"https://www.googleapis.com/auth/檔案”、
“https://www.googleapis.com/auth/script.send_mail”、
“https://www.googleapis.com/auth/script.external_request”、
“https://www.googleapis.com/” auth/userinfo.email",
"https://www.googleapis.com/auth/admin.directory.group.member"
]
我正在尋找的是一種創建這些腳本的解決方案,我可以將它們添加到我的 Google 表格中,在那里可以從腳本加載用戶選單并由用戶呼叫。庫/附加組件中的所有腳本代碼(例如:GSuite 創建新用戶/將用戶添加到組/打開、編輯檔案/打開、編輯作業表)都應通過我的憑據運行,而不是使用他們的憑據。用戶不應能夠查看/編輯庫/附加腳本的代碼。
他們應該能夠查看和編輯的唯一代碼是作業表腳本檔案中的微小 onOpen 腳本。他們必須有權訪問腳本庫/附加組件,但只能運行它,從中呼叫函式。他們不應該能夠閱讀和編輯庫/附加腳本代碼。他們在電子表格中的代碼會非常小。只是一個 onOpen 觸發器,它會從腳本加載選單并訪問可以從選單呼叫的主要功能。這些將是公共職能。其余的都是私人的。
作業表中的腳本

名為“腳本”的庫
這就是我的腳本如何在表格中加載選單并通過它呼叫函式的方式。

uj5u.com熱心網友回復:
問題:
如果我正確理解你的情況:
- 您有一個編輯器插件,您希望通過它來執行訪問 Admin SDK 的功能(通過自定義選單)。
- 您希望域中沒有權限訪問 Admin SDK 的用戶能夠執行這些功能。
- 您是域管理員,可以訪問所需的 Admin SDK 服務。
您不會通過將代碼放入庫中來實作這一點,因為無法“委托”庫函式的執行:庫函式將在執行選單功能的用戶的權限下運行。
解決方案:
在這種情況下,我建議以下替代方案:
- 創建服務帳戶。
- 按照本指南授予服務帳戶域范圍的委派,以便它可用于模擬您域中的任何帳戶:在本例中為您的帳戶。
- 匯入并使用OAuth2 for Apps Script庫,以便在您的 Apps 腳本專案中使用服務帳戶。
- 使用UrlFetchApp呼叫所需的 API,使用來自服務帳戶的訪問令牌。
代碼示例:
例如,如果您想呼叫 Directory API 的users.get以從當前執行此操作的用戶檢索資料,您可以執行以下操作:
function getService() {
const service = OAuth2.createService("Service account")
.setTokenUrl('https://accounts.google.com/o/oauth2/token')
.setPrivateKey(SERVICE_ACCOUNT_PRIVATE_KEY)
.setIssuer(SERVICE_ACCOUNT_EMAIL)
.setSubject(IMPERSONATED_EMAIL)
.setPropertyStore(PropertiesService.getScriptProperties())
.setParam('access_type', 'offline')
.setScope('https://www.googleapis.com/auth/admin.directory.user')
return service;
}
function getActiveUserData() {
const service = getService();
if (service.hasAccess()) {
const userKey = Session.getActiveUser();
const url = `https://admin.googleapis.com/admin/directory/v1/users/${userKey}`;
const options = {
headers: {
'Authorization': "Bearer " service.getAccessToken(),
'Content-Type': 'application/json'
},
muteHttpExceptions: true
}
const resp = UrlFetchApp.fetch(url, options);
const userData = JSON.parse(resp.getContentText());
return userData;
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/404521.html
標籤:
