Эффективно скопируйте и вставьте строку в другой лист, если значение ячейки = x - PullRequest
0 голосов
/ 06 февраля 2020

Я на этапе планирования для кода, который я реализую. Я хотел знать, какой самый эффективный способ скопировать и вставить строку значений в другую вкладку, если значение в столбце «x» равно определенному значению.

Вот методы, о которых я думаю. Я просто хочу знать, какая из них наиболее эффективна с точки зрения скорости выполнения и количества строк кода.

  • Фильтровать лист и копировать результаты в новую вкладку.
  • L oop через каждую строку и скопируйте их в новую вкладку, если значение в ячейке равно тому, что мы ищем.
  • L oop через каждую строку и pu sh в массив, если значение в ячейке равно нашему находясь в поиске. Затем вставьте значения массива в новую вкладку.

Любые другие методы, которые я пропустил?

Пример:

enter image description here

В приведенном выше примере я хотел бы скопировать строки со значениями "xyz" в столбце D на новую вкладку.

Редактировать: я просматриваю как минимум 8K строк в электронной таблице, поэтому скорость исполнения является ключевым.

1 Ответ

0 голосов
/ 06 февраля 2020

Скопируйте из Листа 3 и Вставьте в Лист2 все строки, исключая те строки, где HDR10 является Четным, а HDR1 нечетным, а HDR6 находится между 50 и 80

function runOne() {
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getSheetByName('Sheet3');
  var dsh=ss.getSheetByName('Sheet2');
  if(dsh.getLastRow()>1) {
    dsh.getRange(2,1,dsh.getLastRow()-1,dsh.getLastColumn()).clearContent();
  }
  var rg=sh.getRange(2,1,sh.getLastRow()-1,sh.getLastColumn());
  rg.setBackground('#ffffff');//sheet3 background white
  var vA=rg.getValues();
  var hA=sh.getRange(1,1,1,sh.getLastColumn()).getValues()[0];//get sheet3 headers labels
  var idx={};
  hA.forEach(function(h,i){idx[h]=i;});//relates header name to array index
  var d=0;
  for(var i=0;i-d<vA.length;i++) {
    //delete row if HDR10 is even and HDR1 is odd and HDR6 is between 50 and 80 non inclusive
    Logger.log('i:%s , d: %s, HDR10: %s, HDR1: %s, HDR6: %s',i,d,vA[i-d][idx['HDR10']],vA[i-d][idx['HDR1']],vA[i-d][idx['HDR6']]);
    if(Number(vA[i-d][idx['HDR10']])%2==0 && Number(vA[i-d][idx['HDR1']])%2==1 && Number(vA[i-d][idx['HDR6']])>50 && Number(vA[i-d][idx['HDR6']])<80) {
      vA.splice(i-d++,1);//filter out the ones we do not want
      sh.getRange(i+2,1,1,sh.getLastColumn()).setBackground('#ffff00');//highlight the copied rows
    }
  } 
  dsh.getRange(dsh.getLastRow()+1,1,vA.length,vA[0].length).setValues(vA);
}

Лист3

enter image description here

Лист2

enter image description here

Хотя копирование и вставка выполняются быстро, иногда работа Извлечение только тех строк, которые вы хотите, может значительно замедлить процесс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...