Создание интерактивной Google Таблицы с возможностью:

  • добавления данных через кнопку FILL_TEST_DATA_10;
  • проверки данных на корректность с помощью кнопки VALIDATE_DATA;
  • удаления всех данных и комментариев с помощью clearFormData.

📄 Структура таблицы

ABCDEF
1#ИмяEmailНомер телефонаСуммаIsikukood
Данные начинаются со строки 2. Каждая строка — это одна запись.

🧩 Реализованные функции

🔘 1. FILL_TEST_DATA_10 — автоматическое добавление данных

Добавляет 10 строк с тестовыми данными в диапазон A2:F11.

Пример кода

function FILL_TEST_DATA_10() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var data = [
    [1, "Иван Иванов", "ivan.ivanov@@gmail.com", "7952965864", 150.5, "39003010251"],
    [2, "Кирилл Мельников", "dezxplay@gmail.com", "12345", -50, "39003010250"],
    [3, "123456 654321", "petr.petrov@example.com", "+372 5555 1234", 200, "isikukoodid"],
    [4, "Ольга Орлова", "olga.orlova@mail.ru", "89101234567", 300, "49309150011"],
    [5, "Алексей Сидоров", "alex.sidorov@@gmail.com", "+7 (921) 123-4567", 0, "390031025X"],
    [6, "Екатерина Лебедева", "katya.lebedeva@@mail.ru", "+372 5678 9123", 500.75, "601010200234"],
    [7, "Дмитрий Кузнецов", "dkuz@example.com", "81234567890", 120, "60101011001"],
    [8, "Анна Павлова", "anna.pavlova@", "notaphone", 90, "abcd1234567"],
    [9, "#@! {$!@€@€}", "sergey.m@gmail.com", "79001234567", 250, "3920313001432"],
    [10, "Наталья Воронова", "n.voronova@@example.com", "+372 4321 8765", 110, "39506030215"]
  ];
  sheet.getRange(2, 1, data.length, data[0].length).setValues(data);
}

🛡️ 2. VALIDATE_DATA — проверка данных

Проверяет каждую ячейку и:

  • добавляет комментарии с ошибками,
  • окрашивает ячейки в розовый, если найдена ошибка.

Пример кода

function VALIDATE_DATA() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var dataRange = sheet.getDataRange();
  var data = dataRange.getValues();

  // Сброс комментариев и фона
  var numRows = data.length;
  var numCols = 6; // A-F
  for (var i = 2; i <= numRows; i++) {
    for (var j = 2; j <= numCols; j++) {
      sheet.getRange(i, j).setBackground(null);
      sheet.getRange(i, j).setComment("");
    }
  }

  for (var i = 1; i < data.length; i++) {
    var row = i + 1;

    var name = data[i][1] ? data[i][1].toString().trim() : "";
    var email = data[i][2] ? data[i][2].toString().trim() : "";
    var phone = data[i][3] ? data[i][3].toString().trim() : "";
    var amount = parseFloat(data[i][4]);
    var isikukood = data[i][5] ? data[i][5].toString().trim() : "";

    // Имя
    if (!/^[a-zA-Zа-яА-ЯёЁ\s\-]+$/.test(name) || name.length < 2) {
      sheet.getRange(row, 2).setBackground("#ffcdd2");
      sheet.getRange(row, 2).setComment("Ошибка: имя должно содержать только буквы");
    }

    // Email
    if (email && !/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email)) {
      sheet.getRange(row, 3).setBackground("#ffcdd2");
      sheet.getRange(row, 3).setComment("Ошибка: некорректный email");
    }

    // Телефон
    if (phone && !/^\+?[\d\s\-()]{10,}$/.test(phone)) {
      sheet.getRange(row, 4).setBackground("#ffcdd2");
      sheet.getRange(row, 4).setComment("Ошибка: некорректный телефон");
    }

    // Сумма
    if (isNaN(amount) || amount <= 0) {
      sheet.getRange(row, 5).setBackground("#ffcdd2");
      sheet.getRange(row, 5).setComment("Ошибка: сумма должна быть больше 0");
    }

    // Isikukood
    var ikError = validateIsikukoodVerbose(isikukood);
    if (ikError) {
      sheet.getRange(row, 6).setBackground("#ffcdd2");
      sheet.getRange(row, 6).setComment("Ошибка: " + ikError);
    }
  }

  SpreadsheetApp.getUi().alert("Проверка завершена. Ошибки отображаются комментариями в ячейках.");
}

function validateIsikukoodVerbose(code) {
  if (!code) return "пустой код";
  if (!/^\d+$/.test(code)) return "должны быть только цифры";
  if (code.length < 11) return "меньше 11 цифр";
  if (code.length > 11) return "больше 11 цифр";

  var weights1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 1];
  var weights2 = [3, 4, 5, 6, 7, 8, 9, 1, 2, 3];

  var sum = 0;
  for (var i = 0; i < 10; i++) {
    sum += parseInt(code[i], 10) * weights1[i];
  }

  var check = sum % 11;

  if (check === 10) {
    sum = 0;
    for (var i = 0; i < 10; i++) {
      sum += parseInt(code[i], 10) * weights2[i];
    }
    check = sum % 11;
    if (check === 10) check = 0;
  }

  if (check !== parseInt(code[10], 10)) return "неверная контрольная цифра";

  return null;
}

🗑️ 3. clearFormData — очистка таблицы

Удаляет все значения, форматирование, валидации, примечания и комментарии в диапазоне A2:F11.

Код очистки

function clearFormData() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var range = sheet.getRange("A2:F11");
  
  // Очищаем всё: значения, форматы, примечания, комментарии
  range.clearContent();         // удаляет значения
  range.clearFormat();          // удаляет форматирование
  range.clearNote();            // удаляет примечания
  range.clearDataValidations();// удаляет проверки данных

  // Удаление комментариев (по отдельности)
  var comments = range.getComments();
  for (var i = 0; i < comments.length; i++) {
    for (var j = 0; j < comments[i].length; j++) {
      if (comments[i][j]) {
        range.getCell(i + 1, j + 1).setComment(""); // очищаем комментарий
      }
    }
  }
}

🖱 Кнопки

В таблице размещены кнопки (рисунки), назначенные на функции:

  • Add DataFILL_TEST_DATA_10
  • Validate DataVALIDATE_DATA
  • Delete DataclearFormData

Чтобы назначить:

  • Правый клик по кнопке → Назначить сценарий → вписать точное имя функции (без ())

🔄 Полный процесс

  1. Нажать Add Data → таблица заполняется.
  2. Нажать Validate Data → ячейки подсвечиваются и показывают ошибки.
  3. Нажать Delete Data → всё очищается, включая формат и комментарии.