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

时间:2015-03-23 18:37:58

标签: google-apps-script google-sheets

我有一张带有受保护范围的工作表,其权限设置为仅允许我编辑它。我在工作表的脚本中有一个函数,它编辑受保护范围内的单元格。我把这个函数搞砸了编辑,它允许我以外的用户成功运行该函数,因为它使用我的权限运行。

所以这个场景一切都很好,但是我想通过在函数运行时显示加载消息来使事情变得复杂。为此,我在下面创建了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()完成之前,用户的编辑受保护范围的权限被取消了。

1 个答案:

答案 0 :(得分:1)

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