我正在使用Google表格构建销售电子表格,我需要用户可以通过单击“编辑”按钮来解锁特定范围的单元格,以便他们可以编辑现有销售。问题在于用户无权授予受更改保护的单元,因此脚本在运行时无法解锁单元。因此,我需要任何用户都能够像作者本人一样保护运行脚本的工作表。
我已经尝试了两天的解决方案是将脚本作为Web应用程序部署,以解锁单元格,并以我的身份执行,并从另一个脚本访问其URL,因此用户可以使用我的凭据间接解锁单元格。我做了什么:
function doPost() {
var app = SpreadsheetApp;
var ss = app.openByUrl('https://docs.google.com/spreadsheets/d/[SPREADSHEET_ID]');
var activeSheet = ss.getSheetByName('Create-Edit Sales');
//change cells' color to white
activeSheet.getRange('A5:B5').setBackground('#ffffff');
//remove cells' protection
var allProtections = activeSheet.getProtections(SpreadsheetApp.ProtectionType.RANGE);
var matchingProtections = allProtections.filter(function(existingProtection) {
return existingProtection.getRange().getA1Notation() == 'A5:B5';
});
var protection = matchingProtections[0];
protection.remove();
}
将上述脚本部署为网络应用,从而为我提供了https://script.google.com/macros/s/[WEB_APP]/exec URL。
最后,我创建了一个功能,该功能将在用户按下“编辑”按钮时触发。然后,此函数将使用其URL和我的项目凭据来调用Web应用程序:
function UnlockCells(form) {
var CLIENT_ID = 'CLIENT_ID.apps.googleusercontent.com';
var CLIENT_SECRET = 'CLIENT_SECRET';
var url = "https://script.google.com/macros/s/[WEB_APP]/exec";
var options = {
headers: {"Authorization": "Basic " + Utilities.base64Encode(CLIENT_ID + ':' + CLIENT_SECRET)},
method: "post",
payload: form, //don't know what to use in payload
}
var response = UrlFetchApp.fetch(url, options);
Logger.log('responseCode: ' + response);//View the Logs
}
运行UnlockCells函数时,我收到以下消息:
Request failed for https://script.google.com/macros/s/[WEB_APP]/exec returned code 401. Truncated server response: <!DOCTYPE html><html lang="en"><head><meta name="description" content="Web word processing, presentations and spreadsheets"><meta name="viewport" c... (use muteHttpExceptions option to examine full response) (line 461, file "Sales Scripts")
对于我在网络上搜索的内容,此错误401与身份验证问题有关,但我检查了所有OAuth和API的配置,但找不到问题。
**注意:如果我将doPost函数更改为doGet并从任何浏览器访问Web应用程序URL,则doGet函数中的脚本将正确执行,并且工作表中的单元格将被解锁。
我的方向正确吗?最好的方法是什么?
最好的问候,谢谢!