运行 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"。

参考资料

是的,有可能做到这一点 - 使用 服务帐户

工作流程

这允许用户将数据从他的电子表格传递到您的电子表格,用户没有访问权限,但服务帐户可以访问。

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