Google Apps Script: Как защитить диапазон?

Что такое защита диапазона и зачем она нужна?

Защита диапазона в Google Sheets позволяет контролировать, кто может редактировать определенные ячейки. Это важный инструмент для предотвращения случайных изменений, обеспечения целостности данных и контроля доступа к конфиденциальной информации. В отличие от защиты всего листа, защита диапазона позволяет выборочно ограничивать редактирование, сохраняя при этом возможность редактирования других частей таблицы.

Основные сценарии использования защиты диапазонов

Защита диапазонов полезна в различных сценариях, таких как:

  1. Защита ключевых показателей эффективности (KPIs): Обеспечение неизменности данных, используемых для отчетов.
  2. Предотвращение случайного изменения формул: Защита ячеек с критически важными формулами от случайного удаления или изменения.
  3. Ограничение доступа к конфиденциальным данным: Предоставление доступа к определенным данным только авторизованным пользователям.
  4. Совместная работа с контролем версий: Разрешение редактирования определенным пользователям, отслеживая изменения.

Необходимые условия для работы с защитой диапазонов в Apps Script

Для работы с защитой диапазонов через Google Apps Script необходимо:

  • Иметь доступ к Google Sheets API.
  • Понимать основы работы с Google Apps Script, включая получение доступа к таблицам, листам и диапазонам.
  • Иметь права владельца или редактора таблицы для создания и изменения защиты диапазонов.

Методы защиты диапазона с использованием Google Apps Script

Использование Protection объекта для управления защитой

Объект Protection представляет собой защиту диапазона или листа. Он предоставляет методы для управления разрешениями, добавления и удаления редакторов, а также получения информации о защите.

Создание новой защиты диапазона: range.protect()

Для создания новой защиты диапазона используется метод range.protect(). Этот метод возвращает объект Protection, который можно использовать для дальнейшей настройки.

/**
 * Защищает указанный диапазон в Google Sheets.
 *
 * @param {string} sheetName Имя листа.
 * @param {number} rowStart Начальная строка диапазона.
 * @param {number} rowEnd Конечная строка диапазона.
 * @param {number} columnStart Начальный столбец диапазона.
 * @param {number} columnEnd Конечный столбец диапазона.
 * @return {GoogleAppsScript.Spreadsheet.Protection} Объект защиты.
 */
function protectRange(sheetName: string, rowStart: number, rowEnd: number, columnStart: number, columnEnd: number): GoogleAppsScript.Spreadsheet.Protection {
  // Получаем доступ к активной таблице.
  const spreadsheet: GoogleAppsScript.Spreadsheet.Spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  // Получаем доступ к листу по имени.
  const sheet: GoogleAppsScript.Spreadsheet.Sheet = spreadsheet.getSheetByName(sheetName);

  // Проверяем, что лист существует
  if (!sheet) {
    throw new Error(`Sheet with name '${sheetName}' not found.`);
  }

  // Получаем диапазон для защиты.
  const range: GoogleAppsScript.Spreadsheet.Range = sheet.getRange(rowStart, columnStart, rowEnd - rowStart + 1, columnEnd - columnStart + 1);

  // Защищаем диапазон.
  const protection: GoogleAppsScript.Spreadsheet.Protection = range.protect();

  // Устанавливаем описание защиты (необязательно).
  protection.setDescription('Защита от случайного редактирования');

  return protection;
}

// Пример использования:
// const protection = protectRange("Sheet1", 1, 10, 1, 5);
// Logger.log(protection.getDescription());

Получение существующей защиты диапазона: range.getProtections()

Для получения массива существующих защит диапазона используется метод range.getProtections(type). Тип защиты (SpreadsheetApp.ProtectionType.RANGE или SpreadsheetApp.ProtectionType.SHEET) определяет, какие защиты будут возвращены.

Удаление защиты диапазона

Защиту диапазона можно удалить, получив объект Protection и вызвав метод remove().

Настройка разрешений для защищенного диапазона

Ограничение редактирования только определенным пользователям

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

Реклама

Предоставление разрешений на основе адресов электронной почты

Редакторам предоставляются права на основе их адресов электронной почты.

Настройка прав доступа для групп пользователей

В Google Workspace можно создавать группы пользователей и предоставлять права доступа целым группам.

Использование Editors и Viewers

Объект Protection позволяет управлять списками редакторов и зрителей. Редакторы могут изменять защищенный диапазон, а зрители — только просматривать его.

/**
 * Добавляет редактора к защищенному диапазону.
 *
 * @param {GoogleAppsScript.Spreadsheet.Protection} protection Объект защиты.
 * @param {string} email Адрес электронной почты редактора.
 */
function addEditorToProtection(protection: GoogleAppsScript.Spreadsheet.Protection, email: string): void {
  protection.addEditor(email);
}

/**
 * Удаляет редактора из защищенного диапазона.
 *
 * @param {GoogleAppsScript.Spreadsheet.Protection} protection Объект защиты.
 * @param {string} email Адрес электронной почты редактора.
 */
function removeEditorFromProtection(protection: GoogleAppsScript.Spreadsheet.Protection, email: string): void {
  protection.removeEditor(email);
}

// Пример использования:
// const protection = protectRange("Sheet1", 1, 10, 1, 5);
// addEditorToProtection(protection, "user@example.com");

Примеры кода для защиты диапазонов

Защита диапазона от случайного редактирования всеми пользователями

function protectRangeFromAllUsers(sheetName: string, rowStart: number, rowEnd: number, columnStart: number, columnEnd: number): void {
  const protection = protectRange(sheetName, rowStart, rowEnd, columnStart, columnEnd);
  protection.removeEditors(protection.getEditors()); // Удаляем всех редакторов, кроме владельца скрипта.
  protection.setWarningOnly(true); // Показывать предупреждение при попытке редактирования.
}

// Пример использования:
// protectRangeFromAllUsers("Sheet1", 1, 10, 1, 5);

Предоставление доступа на редактирование только владельцу скрипта

Владелец скрипта всегда имеет доступ к защищенным диапазонам. Для обеспечения доступа только владельцу необходимо удалить всех остальных редакторов.

Реализация защиты диапазона на основе условия (например, значения ячейки)

/**
 * Защищает диапазон, если значение в указанной ячейке соответствует заданному условию.
 *
 * @param {string} sheetName Имя листа.
 * @param {number} rowStart Начальная строка диапазона для защиты.
 * @param {number} rowEnd Конечная строка диапазона для защиты.
 * @param {number} columnStart Начальный столбец диапазона для защиты.
 * @param {number} columnEnd Конечный столбец диапазона для защиты.
 * @param {number} conditionRow Строка ячейки с условием.
 * @param {number} conditionColumn Столбец ячейки с условием.
 * @param {any} conditionValue Значение условия.
 */
function protectRangeOnCondition(sheetName: string, rowStart: number, rowEnd: number, columnStart: number, columnEnd: number, conditionRow: number, conditionColumn: number, conditionValue: any): void {
  const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = spreadsheet.getSheetByName(sheetName);

    // Проверяем, что лист существует
  if (!sheet) {
    throw new Error(`Sheet with name '${sheetName}' not found.`);
  }

  const conditionCell = sheet.getRange(conditionRow, conditionColumn);
  if (conditionCell.getValue() === conditionValue) {
    protectRange(sheetName, rowStart, rowEnd, columnStart, columnEnd);
  }
}

// Пример использования:
// protectRangeOnCondition("Sheet1", 2, 10, 1, 5, 1, 1, "PROTECT"); // Защищаем диапазон, если в ячейке A1 значение "PROTECT".

Продвинутые техники и устранение неполадок

Обход ограничений защиты (только для владельцев скрипта)

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

Обработка ошибок и исключений при работе с защитой диапазонов

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

Рекомендации по оптимизации кода для защиты больших диапазонов

Для защиты больших диапазонов рекомендуется использовать пакетные операции и избегать частого вызова API, чтобы повысить производительность скрипта.


Добавить комментарий