Google Sheets View Only Защита для пользователя, запускающего сценарий приложения - PullRequest
0 голосов
/ 29 января 2019

Я делюсь набором документов Google Sheet с другими пользователями.Я являюсь владельцем всех таблиц, и они размещены на моем Google Диске.Каждый пользователь имеет свой собственный выделенный лист.Пользователи должны иметь возможность запускать на своем листе сценарии, которые собирают и обрабатывают данные с листа, а это значит, что лист должен быть незащищенным во время выполнения сценариев.Однако в конце сценария я хочу снова защитить лист, чтобы пользователь, выполняющий сценарий, не мог редактировать защищенные ячейки после завершения выполнения сценария.

Я могу легко удалитьзащиты с листа в начале скрипта, но я не могу снова защитить лист с помощью скрипта без того, чтобы пользователь, выполняющий скрипт, был указан в качестве редактора.Я попытался использовать функцию «removeEditors» безрезультатно (базовый пример для одного из защищенных диапазонов см. Ниже).

var userEmail = Session.getActiveUser().getEmail();

var protection = newPickSheet.getRange('A1:M3').protect();
protection.removeEditor(userEmail);

Для справки, вот код, который я использую в началесценария для удаления всех защит:

var protections = newPickSheet.getProtections(SpreadsheetApp.ProtectionType.RANGE);

for(var i = 0; i < protections.length; i++){
  protections[i].remove();
}

Подводя итог, мне нужен мой сценарий для:

  1. Снятие всех защит
  2. Выполнение основной частиscript
  3. Повторно добавьте все средства защиты, чтобы только я, владелец листа, но НЕ пользователь, выполняющий сценарий, имел возможность редактирования.

Мне удалось очень легко добиться этого с помощью VBA при развертывании макросов Excel, но, похоже, с помощью скриптов приложений это не так просто.

Если кто-нибудь может помочь мне найти решение, оно будет очень признательно.

1 Ответ

0 голосов
/ 31 января 2019
  • Вы хотите запустить в основном 3 функции в одной функции.
    1. Снять защищенный диапазон newPickSheet.getRange('A1:M3').
    2. Запустить скрипт для редактирования ячейки в диапазоне.
    3. Защита диапазона.
  • Вы хотите запустить скрипт, нажав кнопку запуска, которая помещается в электронную таблицу.Вы не хотите использовать триггер события.

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

Точки модификации:

  • В вашей ситуации, чтобы защитить диапазон от пользователей, необходимо запустить функцию длязащищая ассортимент как владельца.Поскольку защищенный диапазон создается владельцем, при удалении защищенного диапазона необходимо также запустить функцию как владелец.
    • Здесь, в этом обходном пути, предполагается, что сценарий Execute the main part of the script включает методы, зависящие от пользователя.
  • Когда сценарий запускается нажатиемкнопка запуска для каждого пользователя, сценарий запускается для каждого пользователя. Это важный момент в данной ситуации.Чтобы запустить часть скрипта от имени владельца, я использовал здесь веб-приложения.С помощью веб-приложений можно запустить сценарий удаления и добавления защищенного диапазона от имени владельца.

В соответствии с вышеприведенными указаниями этот способ обхода выглядит следующим образом.1. Удалите защищенный диапазон владельцем с помощью веб-приложений.2. Запустите скрипт Execute the main part of the script для каждого пользователя.3. Защитите диапазон владельцем с помощью веб-приложений.

Подготовка к использованию измененного сценария:

Прежде чем использовать измененный сценарий, выполните следующую последовательность действий.

  1. Скопируйте и вставьте измененный скрипт в редактор скриптов.
    • Этот сценарий предполагает, что вы используете связанный с контейнером сценарий электронной таблицы.
    • В этом измененном сценарии я использовал main() для основной функции.Если вы используете другое имя, пожалуйста, измените его.
    • Пожалуйста, установите ##### из var newPickSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("#####");.
  2. Поставьте скрипт «Выполните основную частьскрипт ".
  3. Развертывание веб-приложений.
    1. В редакторе сценариев откройте «Опубликовать» -> «Развернуть как веб-приложения».
    2. Установите «Версия проекта» как новую.Пожалуйста, введите свободно «Опишите, что изменилось».
    3. Установите «Выполнить приложение как:» на «Я».
    4. Установите «У кого есть доступ к приложению:» на «Любой»,Таким образом, каждый пользователь может получить доступ к веб-приложениям с помощью собственного токена доступа.
    5. Нажмите кнопку «Развернуть» или «Обновить».Таким образом, веб-приложения развернуты.
      • При изменении сценария после развертывания веб-приложений, пожалуйста, повторно разверните его как новую версию.Таким образом, последний скрипт отражается на веб-приложениях.Это важный момент для использования веб-приложений.

Модифицированный скрипт:

В этом модифицированном скрипте я использовалmain() для основной функции.Если вы используете другое имя, измените его.

// This is the main function. Please set this function to the run button on Spreadsheet.
function main() {
  // DriveApp.getFiles(); // This is a dummy method for detecting a scope by the script editor.

  var url = ScriptApp.getService().getUrl() + "?access_token=" + ScriptApp.getOAuthToken();
  UrlFetchApp.fetch(url + "&key=removeprotect"); // Remove protected range


  // do Something: Please put the script of "Execute the main part of the script" here.


  SpreadsheetApp.flush(); // This is required to be here.
  UrlFetchApp.fetch(url + "&key=addprotect"); // Add protected range
}

function doGet(e) {
  var newPickSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("#####"); // Please set here.
  if (e.parameter.key == "removeprotect") {
    // Remove protected range.
    var protections = newPickSheet.getProtections(SpreadsheetApp.ProtectionType.RANGE);
    for (var i = 0; i < protections.length; i++) {
      protections[i].remove();
    }
  } else {
    // Add protected range.
    var ownersEmail = Session.getActiveUser().getEmail();
    var protection = newPickSheet.getRange('A1:M3').protect();
    var editors = protection.getEditors();
    for (var i = 0; i < editors.length; i++) {
      var email = editors[i].getEmail();
      if (email != ownersEmail) protection.removeEditor(email);
    }
  }
  return ContentService.createTextOutput("ok");
}

Примечание:

  • В этом измененном сценарии диапазон «A1: M3» на листе newPickSheet.newPickSheet объявляется как var newPickSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("#####").Если вы хотите изменить это, пожалуйста, измените вашу ситуацию.
  • В моей среде, когда пользователь нажимает кнопку запуска вскоре после того, как пользователь открывает общую электронную таблицу, иногда случалось, что функция кнопки не можетбыть найденным.В этом случае, пожалуйста, дождитесь полной загрузки электронной таблицы.
  • Это простой пример сценария.Поэтому, пожалуйста, измените это в своей ситуации.

Ссылки:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...