Разблокируйте электронную таблицу Google, позвонив в веб-приложение - PullRequest
0 голосов
/ 17 мая 2019

Я создаю электронную таблицу продаж с помощью Google Sheets, и мне нужно, чтобы пользователи могли разблокировать определенный диапазон ячеек, нажав кнопку «Изменить», чтобы они могли редактировать существующую продажу. Проблема заключается в том, что пользователи не имеют прав доступа для ячеек, защищенных от изменения, и поэтому сценарий не может разблокировать ячейки при запуске ими. Поэтому мне нужно, чтобы любой пользователь мог снять защиту листа, на котором запущен скрипт, как я, автор.

Решение, которое я пробовал в течение двух дней, состоит в том, чтобы развернуть сценарий как веб-приложение, которое разблокирует ячейки, выполненные как я, и достигает его 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 и учетные данные моего проекта:

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 и получу доступ к URL-адресу веб-приложения из любого браузера, сценарий в функции doGet будет выполнен правильно, и ячейки на листе станут разблокированными.

Я в правильном направлении? Каков наилучший способ сделать это?

С уважением, спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...