2015-03-23 3 views
0

У меня есть лист с защищенным диапазоном, разрешения которого установлены, чтобы разрешить мне его редактировать. У меня есть функция в скрипте листа, которая редактирует ячейки в защищенном диапазоне. Я включил функцию, чтобы активировать редактирование, которое позволяет другим пользователям, кроме меня, успешно запускать эту функцию, поскольку она выполняется с использованием моих разрешений.Как разрешить пользователям редактировать защищенный диапазон через скрипт?

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

ответ

0

Есть несколько способов сделать это.
1) если вы знаете, как выполнять вызовы oauth вручную (для этого требуется библиотека сценариев oauth2 apps), вы могли бы сохранить токен обновленной учетной записи и использовать ее для создания вызовов api для листа на свое имя (через urlFetch) ,
2) опубликуйте еще один скрипт, который запускается под вашим именем с анонимным, который выполняет изменения, получая параметры URL-адреса. Вызовите этот сценарий из исходного скрипта с помощью urlFetch. это легче кодировать, чем (1), но может меня замедлить.
вам также может потребоваться использовать пользовательскую установку onEditTrigger, если у вас есть проблемы с разрешением urlFetch или другой apis.

+0

Я пытался действовать, используя ваши предложения, и я, кажется, застрял и нуждаюсь в некоторой помощи. Я создал отдельный файл сценария, который содержит функцию process() и вызывает его из функции doGet(). Я опубликовал этот сценарий как веб-приложение, которое я установил для запуска как я, и когда я получаю доступ к URL-адресу из моего веб-браузера, реализуются результаты функции process(). Затем я перехожу к своему оригинальному скрипту и имею функцию, которая вызывает UrlFetchApp.fetch (<мой URL-адрес веб-приложения>), и я не вижу ожидаемых результатов. –

+0

Убедитесь, что второй скрипт опубликован как анонимный доступ. –

+0

Я работаю в домене, поэтому мои варианты - это я или кто-либо в домене. Я выбрал кого-нибудь в домене. –

Смежные вопросы