Скрыть / показать определенные вкладки листов для определенных пользователей в общем файле - PullRequest
0 голосов
/ 12 июня 2019

Мой документ Google должен отображать окно входа в систему при открытии файла Google Sheets и, в зависимости от пароля, должно отображать конкретную вкладку. Например. для «пароля1» он должен позволять пользователю видеть только вкладку «Лист1», а остальные листы должны быть скрыты. Аналогично, для «password2» он должен позволять пользователю видеть и работать только на вкладке «Sheet2».

Я попытался запустить следующий код, однако он показывает некоторые ошибки.

function showLoginDialog() {
    var sheet3 = SpreadsheetApp.getActiveSheet('Sheet3');
    sheet3.hideSheet();
    var sheet2 = SpreadsheetApp.getActiveSheet('Sheet2');
    sheet2.hideSheet();
    var sh = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet('Sheet1');      
    var ui = SpreadsheetApp.getUi();      
    var prompt = ui.prompt('Password','Enter Password',ui.ButtonSet.OK_CANCEL);      
    var response = prompt.getResponseText();      
    var button = prompt.getSelectedButton();  

    if(button==ui.Button.OK) {       
    if(response=='pwd3') {
            sheet3.activate();
        }//end of inner if
        if(response=='pwd2'){
            sheet2.activate();
        }
    }//end of main if
}//end of function

Файл Google Sheets должен запрашивать пароль при его открытии и отображать соответствующий лист на основе пароля.

Ответы [ 2 ]

3 голосов
/ 12 июня 2019

Я не думаю, что это безопасно по следующим причинам:

  • Скрытое / видимое свойство листов является глобальным и не ограничено одним пользователем. Если user1 и user2 входят один за другим почти в одно и то же время, лист user1 виден после входа user1; Как только пользователь user2 войдет в систему, лист user1 будет скрыт как для пользователей, так и лист user2 будет виден как для user1, так и для user2

  • Легко разложить листы. Пользователь user1 может отобразить лист user2 в любое время по своему усмотрению, если у него есть доступ для редактирования к электронной таблице (что необходимо, если вы хотите отобразить диалоговое окно входа в систему).

3 голосов
/ 12 июня 2019
  • Вы хотите открыть только один из всех листов в электронной таблице по введенному значению из диалогового окна.
  • Например, когда введено значение pwd2, вы хотите открыть только«Лист2».
  • Вы хотите открыть диалоговое окно при открытии электронной таблицы.

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

Последовательность действий модифицированного сценария выглядит следующим образом.

  1. При открытии электронной таблицы по умолчанию открывается только «Лист1»..
  2. Открытие диалогового окна.
  3. Когда вводится pwd2, открывается только «Лист2».
  4. Когда вводится pwd3, открывается только «Лист3».

Если вы хотите открыть диалоговое окно при открытии электронной таблицы, установите триггер события OnOpen на RunOnOpen().

Как установить триггер OnOpen:

  • Откройте редактор скриптов.
    • Правка -> Триггеры текущего проекта.
    • Нажмите «Добавить триггер».
    • Установите RunOnOpen для «Выберите, какую функцию запускать».
    • Установите «Из электронной таблицы» для «Выбор источника события».
    • Установите «При открытии» для «Выбор типа события».

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

function RunOnOpen() {
  // Updated
  var openSheet = function(ss, sheets, sheet) {
    var s = ss.getSheetByName(sheet);
    s.showSheet();
    ss.setActiveSheet(s);
    for (var i = 0; i < sheets.length; i++) {
      if (sheets[i].getSheetName() != sheet) {
        sheets[i].hideSheet();
      }
    }
  };

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheets = ss.getSheets();
  openSheet(ss, sheets, "Sheet1"); // Open only "Sheet1" when this function is run.
  var ui = SpreadsheetApp.getUi();
  var prompt = ui.prompt('Password','Enter Password',ui.ButtonSet.OK_CANCEL);
  var response = prompt.getResponseText();
  var button = prompt.getSelectedButton();

  if (button == ui.Button.OK) {
    var sheet = "";
    if(response == 'pwd3') {
      openSheet(ss, sheets, "Sheet3");
    } else if(response == 'pwd2') {
      openSheet(ss, sheets, "Sheet2");
    }
  }
}

Примечание:

  • В этом измененном сценарии, когда RunOnOpen() запускается вручную в редакторе сценариев, сценарий работает.Для этого я не использовал объект события триггера OnOpen.

Ссылки:

Если я неправильно понял ваш вопрос и это не тот результат, который вам нужен,Я приношу свои извинения.

Обновлено:

Когда я несколько раз тестировал этот скрипт, бывает, что лист «Лист1» и другой лист открываются.Чтобы избежать этой ситуации, я обновил скрипт.Не могли бы вы подтвердить приведенный выше сценарий еще раз?

Редактировать:

  • Вы хотите, чтобы пользователи использовали конкретный лист электронной таблицы, вводя каждый пароль.
  • Вы не делаетеЯ не хочу публиковать сценарий для пользователей.
  • Вы хотите, чтобы несколько пользователей одновременно использовали электронную таблицу.

Если мое понимание вашей цели правильное, как насчет этого обходного пути?

  • Создайте каждую электронную таблицу для каждого пользователя.
    • Таким образом можно обеспечить одновременный доступ к электронной таблице.
  • Используйте веб-приложения для открытия каждой электронной таблицы путем ввода пароля.

Последовательность действий этого обходного пути следующая.

  1. Пользователь, вошедший в Google, открывает веб-приложения.
  2. Пользователь вводит пароль и нажимает кнопку «ОК»..
  3. Проверка пароля на стороне сервера и возврат URL-адреса электронной таблицы, соответствующей паролю.
  4. Открытие электронной таблицы из URL-адреса.

В этом потокеЯ думаю, что три верхние цели могут быть достигнуты.

Пример сценария:

  1. Прежде чем использовать этот сценарий, разделите электронную таблицу по каждому листу и извлеките каждый URL-адрес электронной таблицы.
  2. При использовании этого приложения разверните веб-приложения со следующим условием.Если вы хотите узнать, как развертывать веб-приложения, отметьте this .
    • Запустите приложение как: Я .
    • У кого есть доступ к приложению: Кто угодно
    • По этому условию пользователинеобходимо войти в Google для доступа к веб-приложениям.

Пользователи получают доступ к URL-адресу веб-приложений.

Сценарий Google Apps:Code.gs
function doGet() {
  return HtmlService.createHtmlOutputFromFile("index");
}

function selectSpreadsheet(value) {
  var url = "";
  if (value == "pwd2") {
    url = "### URL of Spreadsheet for password of pwd2 ###";
  } else if (value == "pwd3") {
    url = "### URL of Spreadsheet for password of pwd3 ###";
  }
  return url;
}
HTML & Javascript: index.html
<input type="text" id="value" >
<input type="button" value="ok" onclick="openSpreadsheet()">

<script>
function openSpreadsheet() {
  var value = document.getElementById("value").value;
  google.script.run.withSuccessHandler((url) => {
    if (url) window.open(url,'_top');
  }).selectSpreadsheet(value);
}
</script>

Примечание:

  • При изменении сценария разверните проект как новую версию.Таким образом, последний сценарий отражается в Web Apps.Пожалуйста, будьте осторожны с этим.
  • Я думаю, что когда каждая электронная таблица является общей только для каждого пользователя, безопасность будет высокой.
  • Максимальное количество одновременного доступа для веб-приложений - 30. Ссылка
  • Это простой пример сценария.Поэтому, если вы используете это, пожалуйста, измените его для вашей ситуации.
  • С Соммент TheMaster , Although it's highly unlikely that users are able to retrieve the passwords from source code, I recommend using private functions and/or properties service for storing of passwords for a extra layer of security.

    • Как образецВы можете использовать, как показано ниже, сохраняя пароли и URL-адреса в PropertiesService.

      function selectSpreadsheet(value) {
        return PropertiesService.getUserProperties().getProperty(value);
      }
      

Ссылки:

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