Загрузка данных


function syncAprilNotesByFormula() {
  var sourceId = "17mN1jx47wznx5s7COtEPZ4qCvShqLvTvRjO3iSTRILQ"; // Таблица 1
  var targetSS = SpreadsheetApp.getActiveSpreadsheet(); // Таблица 2

  var sourceSheets = SpreadsheetApp.openById(sourceId).getSheets();
  var notesMap = {};

  // --- 1. Сбор примечаний из Таблицы 1
  for (var s = 0; s < sourceSheets.length; s++) {
    var sourceSheet = sourceSheets[s];
    if (sourceSheet.isSheetHidden()) continue;

    var sourceData = sourceSheet.getDataRange().getValues();
    if (sourceSheet.getLastRow() < 2) continue;

    var formulas = sourceSheet
      .getRange(2, 2, sourceSheet.getLastRow() - 1, 1)
      .getFormulas(); // колонка B

    for (var r = 1; r < sourceData.length; r++) {
      var rawName = sourceData[r][0];
      if (!rawName) continue;

      var cleanName = String(rawName).replace(/\(.*?\)/g, "").trim();

      // Уже нашли для этого сотрудника
      if (notesMap[cleanName]) continue;

      var noteText = sourceData[r][2];
      var formula = formulas[r - 1][0];

      // Формула в этой строке
      if (formula && formula.includes("07.26")) {
        notesMap[cleanName] = noteText;
        continue;
      }

      // Ищем ниже среди строк без ФИО
      for (var k = r + 1; k < sourceData.length; k++) {
        if (sourceData[k][0]) break;

        var nextFormula = formulas[k - 1][0];
        if (nextFormula && nextFormula.includes("07.26")) {
          notesMap[cleanName] = sourceData[k][2];
          break;
        }
      }
    }
  }

  Logger.log("Собрано " + Object.keys(notesMap).length + " сотрудников.");

  // --- 2. Обновляем Таблицу 2
  targetSS.getSheets().forEach(function(sheet) {
    if (sheet.isSheetHidden()) return;

    var lastRow = sheet.getLastRow();
    var lastCol = sheet.getLastColumn();

    if (lastRow < 4) return;

    var data = sheet.getRange(1, 1, lastRow, lastCol).getValues();

    // Ищем столбцы ФИО
    var fioCols = [];
    var headerRow2 = data[1];

    for (var c = 0; c < headerRow2.length; c++) {
      if (String(headerRow2[c]).toLowerCase().includes("количество проверенных")) {
        fioCols.push(c);
      }
    }

    if (fioCols.length === 0) return;

    // Ищем только столбцы "07.26"
    var targetCols = [];
    var headerRow3 = data[2];

    for (var c = 0; c < headerRow3.length; c++) {
      var header = String(headerRow3[c]).trim().toLowerCase();

      if (header === "07.26") {
        targetCols.push(c);
      }
    }

    if (targetCols.length === 0) return;

    // Читаем все примечания
    var notesRange = sheet.getRange(4, 1, lastRow - 3, lastCol);
    var notesValues = notesRange.getNotes();

    // Очищаем только столбцы 07.26
    targetCols.forEach(function(col) {
      for (var r = 0; r < notesValues.length; r++) {
        notesValues[r][col] = "";
      }
    });

    // Заполняем примечания
    for (var r = 3; r < data.length; r++) {
      for (var f = 0; f < fioCols.length; f++) {

        var fioCol = fioCols[f];
        var rawName = data[r][fioCol];

        if (!rawName) continue;

        var cleanName = String(rawName).replace(/\(.*?\)/g, "").trim();

        if (!notesMap[cleanName]) continue;

        var noteText = notesMap[cleanName];

        // Ищем ближайший столбец "07.26" справа
        for (var i = 0; i < targetCols.length; i++) {
          if (targetCols[i] >= fioCol) {
            notesValues[r - 3][targetCols[i]] = noteText;
            break;
          }
        }
      }
    }

    // Записываем примечания
    notesRange.setNotes(notesValues);
  });

  Logger.log("Импорт примечаний для 07.26 завершён ✅");
}