以另一个用户身份临时运行脚本

Mik*_*rne 5 google-sheets google-apps-script spreadsheet-protection

我有一个包含许多工作表的 Google 电子表格,我使用“除了某些单元格”例程对每个工作表进行保护,以保护共享用户不编辑他们不应该编辑的区域。

我还有一个插入行的功能,但由于保护而以共享用户身份运行时,这显然会失败。

插入行功能 100% 有效,无需添加任何保护。

如何在脚本运行时暂时将活动用户更改为“我”,然后在完成后“删除我”,使工作表保持原始状态(包括所有保护)?

Jac*_*own 6

最可行的选择是使用网络应用程序在需要的位置插入行。您可以通过 get 或 post 方法传递工作表名称和行号。下面的方法使用了 get 方法。你的谷歌脚本看起来像这样:

function insertRow() {
  var ss = SpreadsheetApp.getActive()
  var sheetName = ss.getActiveSheet().getName()
  var row = ss.getActiveRange().getRow()
  // Below URL is the link to  web App, you will generate it by publish >Deploy as web app. Code for Web app is below. 
  var url ="Put the generated URL here"
  var queryString = "?sheetName="+sheetName+"&rowNo="+row
  url = url + queryString
  Logger.log(url)
  var request = UrlFetchApp.fetch(url)
  if (request != 'Success')
    Browser.msgBox("Sorry Unable to insertRow")
}
Run Code Online (Sandbox Code Playgroud)

接下来,您将部署一个 Web 应用程序,它将处理获取请求并向工作表添加新行。代码如下所示:

function doGet(e) {
  var SheetID = "Your Sheet ID here"
  var param = e.queryString
  var parameters = param.split("&")
  // This just checks only 2 parameters are present else gives a invalid link
  if (param != null && parameters.length == 2){
    param = e.parameter
    var name = param.sheetName
    var row = Number(param.rowNo)
    } else {
    return ContentService.createTextOutput("Failed")
    }
  try{  
     var ss = SpreadsheetApp.openById(sheetID)  
     var sheet = ss.getSheetByName(name)
     sheet.insertRowAfter(row)
     sheet.getRange(row + 1,1).setValue("Inserted Row")
     }
     catch (err){
      return ContentService.createTextOutput("Failed")
     }
 return ContentService.createTextOutput("Success")
}
Run Code Online (Sandbox Code Playgroud)

确保运行一次网络应用程序以授予其编辑您的谷歌表格的授权/权限。由于 webApp 将在您的授权下运行,因此无需权限问题即可插入行。此外,您可以将唯一 ID(有效用户的电子邮件 ID?)添加到获取请求,以确保仅处理来自 google 表格脚本内的有效请求。

如果您想了解有关网络应用程序的更多详细信息,可以在这里找到: https: //developers.google.com/apps-script/guides/web