调用网络应用来解锁Google电子表格

时间:2019-05-17 02:49:41

标签: javascript google-apps-script web-applications google-sheets http-status-code-401

我正在使用Google表格构建销售电子表格,我需要用户可以通过单击“编辑”按钮来解锁特定范围的单元格,以便他们可以编辑现有销售。问题在于用户无权授予受更改保护的单元,因此脚本在运行时无法解锁单元。因此,我需要任何用户都能够像作者本人一样保护运行脚本的工作表。

我已经尝试了两天的解决方案是将脚本作为Web应用程序部署,以解锁单元格,并以我的身份执行,并从另一个脚本访问其URL,因此用户可以使用我的凭据间接解锁单元格。我做了什么:

  1. 使用代码创建doPost函数以解锁单元格:

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

  1. 将上述脚本部署为网络应用,从而为我提供了https://script.google.com/macros/s/[WEB_APP]/exec URL。

  2. 最后,我创建了一个功能,该功能将在用户按下“编辑”按钮时触发。然后,此函数将使用其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函数中的脚本将正确执行,并且工作表中的单元格将被解锁。

我的方向正确吗?最好的方法是什么?

最好的问候,谢谢!

0 个答案:

没有答案