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

Как можно автоматизировать процесс отображения новодобавленной информации из одного листа таблицы в другой лист того же документа с определенными условиями? Цель состоит в том, чтобы изменения, внесенные в первый лист, автоматически отображались во втором листе, при условии, что отображается только новая информация, структурированная по времени, и только определенные столбцы из первого листа переносятся во второй, но не в таком же порядке, как на первом листе. Вот пример задачи, где ссылка служит только визуальным примером: [ссылка].
  • 12 ноября 2023 г. 15:59
Ответы на вопрос 2
Для вывода только самых последних изменений в таблице Google Sheets можно использовать функцию QUERY. Вот пример формулы:

```
=QUERY(A1:C, "SELECT A, B, C ORDER BY A DESC LIMIT 5")
```

В данном примере функция QUERY будет выбирать столбцы A, B и C из диапазона A1:C, сортировать их по столбцу A в обратном порядке (самые новые изменения первыми) и ограничивать результат до 5 записей.

Чтобы автоматизировать процесс отображения новодобавленной информации из одного листа в другой с определенными условиями, можно использовать сценарии Google Apps Script. Вот пример кода:

```javascript
function myFunction() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet1 = ss.getSheetByName("Лист1"); // Замените "Лист1" на имя первого листа
  var sheet2 = ss.getSheetByName("Лист2"); // Замените "Лист2" на имя второго листа
  
  var data1 = sheet1.getDataRange().getValues();
  var data2 = sheet2.getDataRange().getValues();
  
  var newData = [];
  
  for (var i = data1.length - 1; i >= 0; i--) {
    var row1 = data1[i];
    var found = false;
    
    for (var j = 0; j < data2.length; j++) {
      var row2 = data2[j];
      
      // Здесь вы можете добавить свои условия для проверки, какие строки нужно отобразить во втором листе
      if (row1[0] === row2[0] && row1[1] === row2[1]) {
        found = true;
        break;
      }
    }
    
    if (!found) {
      newData.unshift(row1.slice(0, 3)); // Здесь вы можете указать столбцы, которые нужно отобразить во втором листе
    }
  }
  
  if (newData.length > 0) {
    sheet2.getRange(sheet2.getLastRow() + 1, 1, newData.length, newData[0].length).setValues(newData);
  }
}
```

В данном примере кода функция `myFunction` сравнивает данные первого листа с данными второго листа и добавляет новые строки второго листа, если они не существуют. Вы можете настроить условия для проверки внутри вложенного цикла `if`, чтобы определить, какие строки нужно отобразить во втором листе.
function onEdit(e) {
  // Проверяем, находится ли редактируемая ячейка на основном листе и выше первой строки
  if (e.source.getSheetName() === 'Основной лист' && e.range.getRow() > 1) {
    var editedData = e.range.getSheet().getRange(e.range.getRow(), 1, 1, e.range.getSheet().getLastColumn()).getValues()[0];
    var targetSheet = e.source.getSheetByName('Доп лист'); // Получаем второй лист
    var targetRow = findRowByTitle(targetSheet, editedData[editedData.length - 1]);

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

    var targetData = [];
    // Копируем данные из заданных столбцов
    for (var i = 0; i < editedData.length; i++) {
      if (targetDataColumns.includes(editedData[i])) {
        targetData.push(editedData[i]);
      }
    }

    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; // Если не найдено
}
Похожие вопросы