繁体   English   中英

如何允许用户通过脚本编辑受保护范围?

[英]How to allow users to edit protected range through script?

我有一个带有受保护范围的工作表,其权限设置为仅允许我对其进行编辑。 我在工作表的脚本中有一个功能,可以编辑受保护范围内的单元格。 我装配了该功能以在编辑时触发,这允许除我自己以外的其他用户成功运行该功能,因为该功能使用我的权限运行。

因此,这种情况很好,但我想通过在函数运行时显示加载消息来使事情复杂化。 为此,我创建了以下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>

当on edit事件触发以下功能时,将显示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()可以完成用户对受保护范围进行编辑的权限之前,就将其删除。

有两种方法可以做到这一点。
1)如果您知道如何手动执行oauth调用(有一个oauth2应用程序脚本库可以提供帮助),则可以保存您的帐户刷新令牌,并使用该令牌以您的名字(通过urlFetch)进行工作表api调用。
2)发布另一个以您的名字运行且匿名的脚本,该脚本通过接收url参数进行更改。 使用urlFetch从原始脚本中调用该脚本。 这更容易编写(1),但可能会使我变慢。
如果您对urlFetch或其他api有权限问题,则可能还需要使用在onEditTrigger上安装的自定义项。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM