我有一张带有受保护范围的工作表,其权限设置为仅允许我编辑它。我在工作表的脚本中有一个函数,它编辑受保护范围内的单元格。我把这个函数搞砸了编辑,它允许我以外的用户成功运行该函数,因为它使用我的权限运行。
所以这个场景一切都很好,但是我想通过在函数运行时显示加载消息来使事情变得复杂。为此,我在下面创建了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()函数以他/她的权限运行。关于如何让这项工作适合我的任何想法?
编辑 - 我尝试使用以下代码来解决我的问题:
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);
}
}
它开始工作,因为process()函数确实更改了受保护范围内的某些单元格,但是出现了相同的错误,表示用户无法编辑受保护的范围。我相信这是因为showModalDialog没有暂停脚本所以在process()完成之前,用户的编辑受保护范围的权限被取消了。
答案 0 :(得分:1)
有几种方法可以做到这一点
1)如果您知道如何手动执行oauth调用(oauth2应用程序脚本库可以提供帮助),您可以保存您的帐户刷新令牌并使用它来以您的名义进行工作表api调用(通过urlFetch)。
2)以匿名方式发布以您的名义运行的另一个脚本,该脚本通过接收url参数来执行更改。使用urlFetch从原始脚本调用该脚本。这更容易编码(1)但可能会慢一些
如果您对urlFetch或其他api存在权限问题,则可能还需要使用自定义安装的onEditTrigger。