@Nik32

Скопировать данные из одного листа на другой последнюю не заполненную строку?

Помогите пожалуйста, я только начинаю изучать гугл таблицы. Нужно, чтобы скрипт работал так, скопировать первую строку "list1" и перенести на "list2" последнюю не заполненную строку. Скрипт, который я скопировал выглядит так:
function onOpen(e) {
  SpreadsheetApp.getUi()
      .createMenu('Работа с Журналом')
      .addItem('Копировать в журнал', 'myFunction')
      .addToUi();
}


function myFunction(){
  var list1 = SpreadsheetApp.getActiveSpreadsheet(); //лист откуда берем данные
  var activCell = list1.getActiveSheet().getActiveCell(); //определение активной ячейки  
  var activNum = activCell.getRow(); //номер активной ячейки
  
  var number = list1.getActiveSheet().getRange(activNum, 1).getValue(); // номер участка
  var name = list1.getActiveSheet().getRange(activNum, 2).getValue(); // имя человека
  var date1 = list1.getActiveSheet().getRange(activNum, 4).getValue(); // дата начала работ
  var date2 = list1.getActiveSheet().getRange(activNum, 6).getValue(); // дата завершения работ
  
  var list2 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Журнал вода данных"); //лист куда вставляем данные


//Вот как делается на примере номера участка
  var lastEmptyRow = list2.getLastRow() + 1;
  list2.getRange(lastEmptyRow, 1).value = number;
//Дальше по аналогии для оставшихся данных
  
}

Но, выдает ошибку "TypeError: Не удается вызвать метод "getLastRow" объекта null. (строка 23, файл Код)". Помогите.5e2c178c9d0fc358004237.jpeg
5e2c17980b1a2564103668.jpeg
5e2c17a083f5e225513137.png
  • Вопрос задан
  • 309 просмотров
Пригласить эксперта
Ответы на вопрос 1
oshliaer
@oshliaer Куратор тега Google Apps Script
Google Products Expert
Я бы сделал так

/**
 *
 */
function onOpen() {
  SpreadsheetApp.getUi()
    .createMenu('Custom menu')
    .addItem('Copy to logs', 'userActionsCopyToLogs')
    .addToUi();
}

/**
 *
 */
function userActionsCopyToLogs() {
  var headers = ['Name', 'Number'];

  var from = SpreadsheetApp.getActiveSheet();

  if (from.getName() !== 'Sheet1') {
    SpreadsheetApp.getActive().toast('Activate a range on "Sheet1"');
    return;
  }

  var fromValues = from.getDataRange().getValues();

  var fromHeaders = fromValues[0].map(function(h) {
    return headers.indexOf(h);
  });

  var activeRange = SpreadsheetApp.getActiveRange();
  var rowStart = activeRange.getRow();
  var rowEnd = activeRange.getLastRow();
  var fromData = fromValues
    .filter(function(row, i) {
      return i >= rowStart - 1 && i <= rowEnd - 1;
    })
    .map(function(row) {
      return row.filter(function(_, j) {
        return fromHeaders[j] > -1;
      });
    });

  var to =
    SpreadsheetApp.getActive().getSheetByName('Logs') ||
    SpreadsheetApp.getActive().insertSheet('Logs');

  to.getRange(to.getLastRow() + 1, 1, fromData.length, fromData[0].length)
    .setValues(fromData)
    .activate();
}


screenrecord.gif

Измените строку var headers = ['Name', 'Number']; так, чтобы копировались данные из нужных вам колонок.

Полный код
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы