У меня есть лист с защищенным диапазоном, разрешения которого установлены, чтобы разрешить мне его редактировать. У меня есть функция в скрипте листа, которая редактирует ячейки в защищенном диапазоне. Я включил функцию, чтобы активировать редактирование, которое позволяет другим пользователям, кроме меня, успешно запускать эту функцию, поскольку она выполняется с использованием моих разрешений.Как разрешить пользователям редактировать защищенный диапазон через скрипт?
Так что сценарий все в порядке и денди, однако я усложняю ситуацию, желая отобразить загрузочное сообщение во время работы функции. Для этого я создал HTML файл ниже:
<script>
function onSuccess() {
google.script.host.close();
}
function onFailure() {
var div = document.getElementById('result');
div.innerHTML = '<div>Data failed to load.</div>';
}
google.script.run.withSuccessHandler(onSuccess).withFailureHandler(onFailure).process();
</script>
<div id='result'><img src="https://c4a54d10381f750e81dcc323aed21e2c95725815.googledrive.com/host/0Bwyqwd2fAHMMallsNkNOV0RfcTg/wait_progress.gif"></div>
HTML, отображается, когда следующая функция инициируется на редактирования события:
function refresh() {
var html = HtmlService.createHtmlOutputFromFile('loading').setSandboxMode(HtmlService.SandboxMode.IFRAME).setWidth(100).setHeight(100);
SpreadsheetApp.getUi().showModalDialog(html, 'Processing...');
}
Пользователь получает ошибку о том, что он/она не может редактировать защищенную ячейку. Я предполагаю, что это происходит, потому что функция refresh() работает с моими разрешениями, но функция process() работает со своими разрешениями. Любые идеи о том, как я могу заставить эту работу работать для меня?
Edit - Я пытался использовать следующий код, чтобы решить мою проблему:
function refresh() {
setPermission(1);
SpreadsheetApp.flush();
var html = HtmlService.createHtmlOutputFromFile('loading').setSandboxMode(HtmlService.SandboxMode.IFRAME).setWidth(100).setHeight(100);
SpreadsheetApp.getUi().showModalDialog(html, 'Processing...');
SpreadsheetApp.flush();
setPermission(0);
}
function setPermission(flag)
{
var me = Session.getActiveUser();
var ss = SpreadsheetApp.getActive();
var protections = ss.getProtections(SpreadsheetApp.ProtectionType.RANGE);
var protection = protections[0];
if (flag == 1)
{
protection.addEditor(me);
} else {
protection.removeEditor(me);
}
}
Он начинает работать, так как функция процесса() не изменить некоторые ячейки в защищенном диапазоне, но то же ошибка говоря пользователь не может редактировать защищенный диапазон. Я считаю, что это потому, что showModalDialog не приостанавливает сценарий, поэтому до того, как процесс() может закончить разрешение пользователя на редактирование защищенного диапазона, отбирается.
Я пытался действовать, используя ваши предложения, и я, кажется, застрял и нуждаюсь в некоторой помощи. Я создал отдельный файл сценария, который содержит функцию process() и вызывает его из функции doGet(). Я опубликовал этот сценарий как веб-приложение, которое я установил для запуска как я, и когда я получаю доступ к URL-адресу из моего веб-браузера, реализуются результаты функции process(). Затем я перехожу к своему оригинальному скрипту и имею функцию, которая вызывает UrlFetchApp.fetch (<мой URL-адрес веб-приложения>), и я не вижу ожидаемых результатов. –
Убедитесь, что второй скрипт опубликован как анонимный доступ. –
Я работаю в домене, поэтому мои варианты - это я или кто-либо в домене. Я выбрал кого-нибудь в домене. –