Предотвратить некоторые действия пользователей с листами - PullRequest
1 голос
/ 09 апреля 2020

Я дал права «Редактировать» некоторым пользователям. Я владелец.

Я запрещаю добавлять, удалять, скрывать или изменять размер столбца (по пользователю), защищая Row1 (редактируется только владельцем).

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

Если пользователь (редактор) удаляет лист, система рухнет. Как предотвратить редактора от удаления листа? Это очень важно для меня.

Некоторые пользователи нажимают кнопку «Добавить 1000 строк» ​​внизу и добавляют ненужные строки. Есть ли способ предотвратить это? Теперь я сделал опцию в меню, которая удаляет пустые строки.

Ответы [ 2 ]

4 голосов
/ 09 апреля 2020

Ответ:

Вы не можете запретить пользователю с правами редактирования создавать новые листы или строки, но вы можете запустить триггер onChange(), который удалит их, как только они будут созданы. .

Дополнительная информация:

Триггер onChange() Google Sheets - это устанавливаемый триггер, который запускается при внесении изменений в структуру листа. ,

Объект события для события chenged содержит информацию о типе изменения - в частности, INSERT_GRID и INSERT_ROW - они относятся к изменению структуры листа нового добавленного листа и вставлена ​​новая строка или диапазон строк.

Отсюда вы можете обрабатывать их немедленное удаление.

Код:

function onChange(e) {

  if (e.changeType == "INSERT_GRID") {
    // list your sheet names in here:
    var sheetNames = ["Sheet1", "Sheet2", "Sheet3"];
    var sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets();

    if (sheets.length != sheetNames.length) {
      for (var i = 0; i < sheets.length; i++) {
        if (sheetNames.includes(sheets[i].getName())) {
          continue;
        }
        else {
          SpreadsheetApp.getActiveSpreadsheet().deleteSheet(sheets[i])
        }
      }          
    }
  } 

  else if (e.changeType == "INSERT_ROW") {
    // define how many rows your sheet has here:
    var noOfRows = 200;    
    var sheet = SpreadsheetApp.getActive();    

    sheet.getRange((noOfRows + 1) + ':' + (noOfRows + 1)).activate();

    var currentCell = sheet.getCurrentCell();

    sheet.getSelection().getNextDataRange(SpreadsheetApp.Direction.DOWN).activate();

    currentCell.activateAsCurrentCell();
    sheet.getActiveSheet().deleteRows(sheet.getActiveRange().getRow(), sheet.getActiveRange().getNumRows());
  }
}

Настройка триггера:

Сохранить сценарий с помощью значок сохранения, нажмите кнопку запуска (►) и подтвердите аутентификацию запуска скрипта.

Отсюда, после пункта меню «Правка»> «Триггеры текущего проекта», вы откроете новую страницу в G Suite Developer Hub. Нажмите кнопку + Добавить триггер в правом нижнем углу и настройте параметры триггера следующим образом:

  • Выберите, какую функцию запустить: onChange
  • Выберите, какое развертывание должно запускаться: Head
  • Выберите источник события: From spreadsheet
  • Выберите тип события: On change

и нажмите Сохранить.

Удаленные листы:

Это сложная часть; к сожалению, нет способа восстановить удаленные листы, перехватив их с onChange().

Однако, если это очень важно, лучше всего порекомендовать взглянуть на версии файлов Drive Drive и файл Drive API revisions: list* 1057. * и revisions: get, и сделайте некоторую интеграцию этого на e.changeType == REMOVE_GRID, но на самом деле вы должны просто пытаться делать резервные копии как можно чаще, чтобы в случае потери важной структуры она могла быть легко восстановленным.

Я надеюсь, что это полезно для вас!

Ссылки:

2 голосов
/ 09 апреля 2020

Я не думаю, что есть способ легко "защитить" вашу таблицу таким образом. Однако вы можете добавить триггер onChange в свою электронную таблицу (подробнее здесь ), который будет запускать функцию всякий раз, когда кто-либо изменяет формат или структуру вашей электронной таблицы. В редакторе сценариев нажмите edit> current project's triggers, чтобы открыть новое окно. Там вы можете добавить новый триггер (выберите функцию для выполнения и событие электронной таблицы onChange). Вот функция, которую вы могли бы связать с триггером:

function onChange(e) {
  /* e is the event object, see documentation */
  if (e.changeType == "INSERT_ROW") {
    /* delete unneeded empty rows at the end */
    removeEmptyRows();
  } else if (e.changeType == "INSERT_GRID") {
    /* delete unwanted sheets */
    removeExtraSheets();
  }
}

Что касается предотвращения удаления листа пользователями, кажется, что нет никакой возможности сделать это. Вы можете отследить удаление листа в функции onChange, changeType будет "REMOVE_GRID", но объект события не позволит вам получить доступ к удаленным данным.

Итак, если у вас есть важные данные на листах (и вы не доверяете редакторам , а не удалите листы), вам, вероятно, следует регулярно делать резервные копии данных (используя основанные на времени триггер и вторая резервная таблица, доступ к которой есть только у вас).

Приветствия!

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