@MRO_G

Как отдельно вывести последние изменения в таблице Google Sheets?

Всем добрый вечер!

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

В доке существует 2 листа:
1 лист - большая база с инфой, куда вносится информация;
2 лист - условно недельный отчет, куда вносится все изменения, которые произошли за неделю в 1-м листе.

Можно ли как-то автоматизировать этот процесс? Чтобы изменения, вписанные в 1-й лист - отображались во 2-м автоматически. С учетом условий:
1) во 2-м листе нужно отображать только новодобавленную информацию и она должна быть структурирована по времени (изменение 1 в листе 1, изменение 2 в листе 1 .... изменение 8 в листе 1 и т.д.);
2) во 2-м листе отображается невся информация, а только некоторые столбцы из 1-го листа (+эти столбцы расположены не в таком же порядке, что и на 1-м листе).

Добавил ссылку, которая служит лишь как визиуальный пример задачи.
https://docs.google.com/spreadsheets/d/1P_wVMW7SA6...
  • Вопрос задан
  • 126 просмотров
Пригласить эксперта
Ответы на вопрос 1
function onEdit(e) {
  var sheet = e.source.getSheetByName('Основной лист'); // Имя первого листа
  var editedRange = e.range;
  var editedRow = editedRange.getRow();
  var targetSheet = e.source.getSheetByName('Доп лист'); // Имя второго листа
  var targetDataColumns = ["Ссылка", "Данные №2", "Данные №3"]; // Список столбцов для копирования

  if (sheet.getName() == 'Основной лист' && editedRow > 1) {
    var editedData = sheet.getRange(editedRow, 1, 1, sheet.getLastColumn()).getValues()[0];
    var targetRow = findRowByTitle(targetSheet, editedData[editedData.length - 1]);

    if (targetRow === -1) {
      targetRow = targetSheet.getLastRow() + 1;
    }

    var targetData = [];
    for (var i = 0; i < targetDataColumns.length; i++) {
      var columnIndex = getColumnIndex(sheet, targetDataColumns[i]);
      targetData.push(editedData[columnIndex]);
    }

    targetSheet.getRange(targetRow, 1, 1, targetData.length).setValues([targetData]);
  }
}

function findRowByTitle(sheet, title) {
  var columnValues = sheet.getRange(2, sheet.getLastColumn(), sheet.getLastRow() - 1, 1).getValues();
  for (var i = 0; i < columnValues.length; i++) {
    if (columnValues[i][0] == title) {
      return i + 2; // Смещение на 2 из-за индексации массивов и заголовка
    }
  }
  return -1; // Если не найдено
}

function getColumnIndex(sheet, columnName) {
  var headers = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues()[0];
  for (var i = 0; i < headers.length; i++) {
    if (headers[i] == columnName) {
      return i + 1; // Смещение на 1 из-за индексации массивов
    }
  }
  return -1; // Если не найдено
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы