运行 Google Sheet 作为管理员加载项
Run Google Sheet Add-On as Admin
我有三个不同用户的三个电子表格(文件)。技术 SSheet、管理员 SSheet 和经理 SSheet。当技术用户单击附加组件时,技术 SSheet 数据应发送给经理 SSheet。
管理员用户是所有三个文件的所有者。技术用户无权访问经理 SSheet。所有代码都放在 Admin Sheet 中,并创建了 Add on。所以在这里我必须从 Tech Sheet/user.
调用 Admin Sheet 中的代码
我创建了附加组件,但它以技术 Sheet 作为参考。由于技术 Sheet 没有经理 Sheet 的权限,复制数据失败。
是否有可能 运行 在不向技术用户提供许可的情况下以管理员身份添加组件?
在 G Suite 文档编辑器上,包括 Google 表格,如果文档位于 "My Unit" 而不是 "Shared Unit"(以前的 "Team Drive"),则权限角色是
- 所有者
- 编辑器
- 评论者
- 观看者
换句话说,没有"admin",另一方面,权限被授予用户不"sheets"。
参考资料
是的,有可能做到这一点 - 使用 服务帐户。
工作流程
- Create Google Service account,启用全域委派并为其提供必要的范围
- 与服务帐户共享您的经理 SSheet
- 将 Apps 脚本函数写入 obtain an Access Token for the service account
- 使用此令牌 Sheets API 将数据复制到 Manager SSheet
这允许用户将数据从他的电子表格传递到您的电子表格,用户没有访问权限,但服务帐户可以访问。
Below is a script for an Add-on that will format data from user´s spreadsheet
into to CSV and paste them into Manager SSheet with
spreadsheets.batchUpdate
function onInstall(e) {
onOpen(e);
}
function onOpen(e) {
SpreadsheetApp.getUi()
.createMenu('Copy sheet')
.addItem('Copy now', 'run')
.addToUi();
}
function run() {
var service = getService();
if (service.hasAccess()) {
copySheet(service);
} else {
Logger.log(service.getLastError());
}
}
function getService() {
var PRIVATE_KEY ="-----BEGIN PRIVATE KEY----- XXX_YOUR_KEY_XXX -----END PRIVATE KEY-----\n";
var CLIENT_EMAIL = 'XXXX@XXXX-XXXX.iam.gserviceaccount.com';
return OAuth2.createService('myServiceAccount')
.setTokenUrl('https://oauth2.googleapis.com/token')
.setPrivateKey(PRIVATE_KEY)
.setIssuer(CLIENT_EMAIL)
.setPropertyStore(PropertiesService.getScriptProperties())
.setScope('https://www.googleapis.com/auth/spreadsheets');
}
function copySheet(service){
var sheet=SpreadsheetApp.getActive().getActiveSheet();
var valueRange=sheet.getDataRange().getValues();
var data='';
for(var i=0;i<valueRange.length;i++){
for(var j=0;j<valueRange[0].length;j++){
data+=(valueRange[i][j]+",");
}
data+=("\n")
}
var dId='ID_OF_Manager SSheet';
if(PropertiesService.getScriptProperties().getKeys().length==0){
PropertiesService.getScriptProperties().setProperty('i', '2');
}
var i=parseInt(PropertiesService.getScriptProperties().getProperty('i'));
var url='https://sheets.googleapis.com/v4/spreadsheets/'+dId+':batchUpdate';
var body = {requests: [
{
"addSheet": {
"properties": {
"sheetId": i
}
}
},{
"pasteData": {
"data": data,
"type": "PASTE_NORMAL",
"delimiter": ",",
"coordinate": {
"sheetId": i,
"rowIndex": 0,
"columnIndex": 0
}
}
}
]
};
var options = {
"method":"post",
"muteHttpExceptions": true,
"headers": {
"Authorization": "Bearer " + service.getAccessToken()
},
"contentType": "application/json",
"payload": JSON.stringify(body)
}
var r = UrlFetchApp.fetch(url,options);
if(r.getResponseCode()==200){
PropertiesService.getScriptProperties().setProperty('i', i+1);
}
}
我有三个不同用户的三个电子表格(文件)。技术 SSheet、管理员 SSheet 和经理 SSheet。当技术用户单击附加组件时,技术 SSheet 数据应发送给经理 SSheet。
管理员用户是所有三个文件的所有者。技术用户无权访问经理 SSheet。所有代码都放在 Admin Sheet 中,并创建了 Add on。所以在这里我必须从 Tech Sheet/user.
调用 Admin Sheet 中的代码我创建了附加组件,但它以技术 Sheet 作为参考。由于技术 Sheet 没有经理 Sheet 的权限,复制数据失败。
是否有可能 运行 在不向技术用户提供许可的情况下以管理员身份添加组件?
在 G Suite 文档编辑器上,包括 Google 表格,如果文档位于 "My Unit" 而不是 "Shared Unit"(以前的 "Team Drive"),则权限角色是
- 所有者
- 编辑器
- 评论者
- 观看者
换句话说,没有"admin",另一方面,权限被授予用户不"sheets"。
参考资料
是的,有可能做到这一点 - 使用 服务帐户。
工作流程
- Create Google Service account,启用全域委派并为其提供必要的范围
- 与服务帐户共享您的经理 SSheet
- 将 Apps 脚本函数写入 obtain an Access Token for the service account
- 使用此令牌 Sheets API 将数据复制到 Manager SSheet
这允许用户将数据从他的电子表格传递到您的电子表格,用户没有访问权限,但服务帐户可以访问。
Below is a script for an Add-on that will format data from user´s spreadsheet into to CSV and paste them into Manager SSheet with spreadsheets.batchUpdate
function onInstall(e) {
onOpen(e);
}
function onOpen(e) {
SpreadsheetApp.getUi()
.createMenu('Copy sheet')
.addItem('Copy now', 'run')
.addToUi();
}
function run() {
var service = getService();
if (service.hasAccess()) {
copySheet(service);
} else {
Logger.log(service.getLastError());
}
}
function getService() {
var PRIVATE_KEY ="-----BEGIN PRIVATE KEY----- XXX_YOUR_KEY_XXX -----END PRIVATE KEY-----\n";
var CLIENT_EMAIL = 'XXXX@XXXX-XXXX.iam.gserviceaccount.com';
return OAuth2.createService('myServiceAccount')
.setTokenUrl('https://oauth2.googleapis.com/token')
.setPrivateKey(PRIVATE_KEY)
.setIssuer(CLIENT_EMAIL)
.setPropertyStore(PropertiesService.getScriptProperties())
.setScope('https://www.googleapis.com/auth/spreadsheets');
}
function copySheet(service){
var sheet=SpreadsheetApp.getActive().getActiveSheet();
var valueRange=sheet.getDataRange().getValues();
var data='';
for(var i=0;i<valueRange.length;i++){
for(var j=0;j<valueRange[0].length;j++){
data+=(valueRange[i][j]+",");
}
data+=("\n")
}
var dId='ID_OF_Manager SSheet';
if(PropertiesService.getScriptProperties().getKeys().length==0){
PropertiesService.getScriptProperties().setProperty('i', '2');
}
var i=parseInt(PropertiesService.getScriptProperties().getProperty('i'));
var url='https://sheets.googleapis.com/v4/spreadsheets/'+dId+':batchUpdate';
var body = {requests: [
{
"addSheet": {
"properties": {
"sheetId": i
}
}
},{
"pasteData": {
"data": data,
"type": "PASTE_NORMAL",
"delimiter": ",",
"coordinate": {
"sheetId": i,
"rowIndex": 0,
"columnIndex": 0
}
}
}
]
};
var options = {
"method":"post",
"muteHttpExceptions": true,
"headers": {
"Authorization": "Bearer " + service.getAccessToken()
},
"contentType": "application/json",
"payload": JSON.stringify(body)
}
var r = UrlFetchApp.fetch(url,options);
if(r.getResponseCode()==200){
PropertiesService.getScriptProperties().setProperty('i', i+1);
}
}