Я создаю электронную таблицу продаж с помощью Google Sheets, и мне нужно, чтобы пользователи могли разблокировать определенный диапазон ячеек, нажав кнопку «Изменить», чтобы они могли редактировать существующую продажу. Проблема заключается в том, что пользователи не имеют прав доступа для ячеек, защищенных от изменения, и поэтому сценарий не может разблокировать ячейки при запуске ими. Поэтому мне нужно, чтобы любой пользователь мог снять защиту листа, на котором запущен скрипт, как я, автор.
Решение, которое я пробовал в течение двух дней, состоит в том, чтобы развернуть сценарий как веб-приложение, которое разблокирует ячейки, выполненные как я, и достигает его URL из другого сценария, чтобы пользователь косвенно разблокировал ячейки, используя мои учетные данные. Что я сделал:
- Создана функция 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();
}
Развернул вышеупомянутый скрипт как веб-приложение, которое дало мне https://script.google.com/macros/s/[WEB_APP]/exec URL.
Наконец-то я создал функцию, которая будет срабатывать, когда пользователь нажимает кнопку «Редактировать». Затем эта функция будет вызывать веб-приложение, используя его 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 будет выполнен правильно, и ячейки на листе станут разблокированными.
Я в правильном направлении? Каков наилучший способ сделать это?
С уважением, спасибо!