以管理员身份运行谷歌表格插件



我有三个电子表格(文件),有三个不同的用户。Tech SSheet,Admin SSheet和Manager SSheet。当技术用户单击附加组件时,技术 SSheet 数据应发送给经理 SSheet。

管理员用户是所有三个文件的所有者。技术用户无权访问经理 SSheet。所有代码都放在管理表中,并创建附加。所以在这里我必须从技术表/用户调用管理表中的代码。

我创建了附加组件,但它以技术表为参考。由于技术表没有经理表的权限,因此复制数据失败。

是否有可能在不向技术用户提供权限的情况下以管理员身份运行附加组件?

是的,有可能这样做 - 使用服务帐户

工作流程

  • 创建 Google 服务帐号,启用全网域授权并为其提供必要的范围
  • 与服务帐户共享您的经理 SSheet
  • 编写应用脚本函数以获取服务帐户的访问令牌
  • 将此令牌用于工作表 API 将数据复制到管理器 SSheet 中

这样,用户就可以将数据从其电子表格传递到您的电子表格,而用户无权访问,但服务帐号有权访问。

下面是一个附加组件的脚本,它将格式化用户电子表格中的数据 到 CSV 并将它们粘贴到管理器 SSheet 中 电子表格.批处理更新


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);
}
}

在 G Suite 文档编辑器(包括 Google 表格)上,如果文档位于"我的单元"中,而不是"共享单元"(以前称为"团队云端硬盘")上,则权限角色为

  • 所有者
  • 编辑 器
  • 评论
  • 观众

换句话说,没有"管理员",另一方面,授予用户而不是"工作表"的权限。

引用

  • 从谷歌云端硬盘共享文件

最新更新