@accountnujen

Можно ли ускорить копирование данных из одних столбцов в другие в Google таблицах?

Мне нужно было получить значение последней строки столбцов K, M, N, O, V, где значение L = e и вставить в столбцы B:F после последних данных.
function copyValues(e) {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var lastRow = sheet.getLastRow();
  var values = [];

  for (var i = lastRow; i > 0; i--) {
    if (sheet.getRange("L" + i).getValue() == e) {
      var sourceRange = sheet.getRange("K" + i + ":V" + i);
      values = sourceRange.getValues()[0];
      break;
    }
  }

  // Вставить значения в ячейки
  var lastFill = getLastFill("B:B");
  yourFunction(lastFill);
  var targetRange = sheet.getRange("B" + (lastFill + 1) + ":F" + (lastFill + 1));

  targetRange.setValues([[values[0], values[2], values[3], values[4], values[11]]]);
}

function getLastFill(e) {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var column = sheet.getRange(e).getValues();
  
  for (var i = column.length - 1; i >= 0; i--) {
    if (column[i][0] !== "") {
      return i + 1; // Возвращаем номер строки (+1 для приведения к номерации Google Таблиц)
    }
  }
}

Данный код работает, но выполняет запрос в течении ~7 секунд. Можно ли как-нибудь увеличить скорость?
  • Вопрос задан
  • 138 просмотров
Решения вопроса 1
oshliaer
@oshliaer Куратор тега Google Apps Script
Google Products Expert
Не задавайте вопросы без примера!


Зачем вы делаете все те манипуляции - не понятно. Это последствия Excel?

Занимает доли секунды

/* exported userActionCopyValues */
function userActionCopyValues() {
  copyValues_('rg');
}

function copyValues_(e) {
  const sheet = SpreadsheetApp.getActive().getSheetByName('Ускорить работу скрипта');
  const dataRange = sheet.getDataRange();
  const values = dataRange.getValues();

  const lastValKMNOV = values.findLast((row) => row[11] === e);

  if (!lastValKMNOV) {
    console.warn(`lastValKMNOV ${lastValKMNOV}`);
    return;
  }

  const lastIndexBF = values.findLastIndex((row) => row.slice(1, 1 + 5).join(''));

  if (lastIndexBF === -1) {
    console.warn(`lastIndexBF ${lastIndexBF}`);
    return;
  }

  sheet
    .getRange(lastIndexBF + 2, 2, 1, 5)
    .setValues([[lastValKMNOV[10], lastValKMNOV[11], lastValKMNOV[12], lastValKMNOV[13], lastValKMNOV[21]]]);
}


65fbc8ba1bbea534262777.png

Пример в Таблице https://docs.google.com/spreadsheets/d/1KN2SuXbHN5...
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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