簡體   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