我有一个包含许多工作表的 Google 电子表格,我使用“除了某些单元格的例程外,以保护共享用户免受他们不应该编辑的区域的影响。”
我还有一个插入行的功能,但是由于保护,这在作为共享用户运行时显然失败了。
插入行功能 100% 工作,没有添加保护。
如何在脚本运行时将事件用户临时更改为“我”,然后在完成后将工作表保留为原始状态(包括所有保护)“删除我”?
最佳答案
最可行的选择是让一个网络应用程序在需要的地方插入行。您可以通过 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")
}
接下来,您将部署一个 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")
}
确保运行 webApp 一次以授予它授权/许可 编辑您的谷歌表格。
由于 webApp 将在您的授权下运行,因此它可以在没有许可的情况下插入 Row。此外,您可以向 get 请求添加唯一 ID(有效用户的电子邮件 ID?),以确保仅处理来自 google 表格脚本中的有效请求。
如果您想了解有关 Web 应用程序的更多详细信息,可以在此处找到它:https://developers.google.com/apps-script/guides/web
关于google-apps-script - Google Apps 脚本 : Temporarily run script as another user,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42809202/