App-Scripts Как удалить и сохранить некоторые строки в зависимости от условий - PullRequest
0 голосов
/ 25 февраля 2019

Я собираюсь использовать листы Google вместо Excel.Поэтому я столкнулся с проблемой кодирования.Эту проблему я раньше задавал.

Допустим, у меня есть данные за два дня подряд (ранний день, потом) с 25 столбцами и более 50 000 строк. Я хочу сохранить некоторые данные, которые соответствуют критериям, и удалить другие, которые мне не нужны.

пример.Я хочу удалить «AAA», «BBB», «DDD», «FFF» с раннего дня и оставить другие «CCC», «EEE», «GGG».и на более поздний день я хочу сохранить «AAA», «BBB», «DDD», «FFF» и удалить другие

введите описание изображения здесь

Ирезультат будет таким: введите описание изображения здесь

вот код, который я пробовал, но он не запустился, чтобы получить результат.

//text data in D, dates to evaluate earlyDay/lateDay in C

var Offset = 1;

function deleteRows() {
 var app = SpreadsheetApp.getActiveSpreadsheet();
 var targetSheet = app.getSheetByName('Sheet1');
 var r = targetSheet.getRange('C:C');
 var v = r.getValues();
 var r1 = targetSheet.getRange('D:D');
 var f = r1.getValues(); 
 var lateDay = new Date(getLateDay()).getTime();
 var earlyDay = new Date(getEarlyDay()).getTime();
  
 for(var i = f.length-1; i>=Offset; i--){
  var tmp = new Date(v[0,i]).getTime();
   if(tmp==earlyDay && (f[0,i]=="AAA" || f[0, i]=="BBB")){
    targetSheet.deleteRow(i+1);
   }
 }
  for(var i = f.length-1; i>=Offset; i--){
  var tmp = new Date(v[0,i]).getTime();
   if(tmp==lateDay && (f[0,i]!="AAA" && f[0, i]!="BBB")){
    targetSheet.deleteRow(i+1);
   }
 }
}

function getLateDay() {
 var app = SpreadsheetApp.getActiveSpreadsheet();
 var targetSheet = app.getSheetByName('Sheet1');
 var r = targetSheet.getRange('C:C');
 var v = r.getValues();
  for(var i = v.length-1; i>=Offset; i--){
  var tmp = new Date(v[0,i]).getTime();
  var tmp1 = new Date(v[0,i-1]).getTime();
   if(tmp>tmp1){
    return tmp;
   }
  }
  return null;
}

function getEarlyDay() {
 var app = SpreadsheetApp.getActiveSpreadsheet();
 var targetSheet = app.getSheetByName('Sheet1');
 var r = targetSheet.getRange('C:C');
 var v = r.getValues();
  for(var i = v.length-1; i>=Offset; i--){
  var tmp = new Date(v[0,i]).getTime();
  var tmp1 = new Date(v[0,i-1]).getTime();
   if(tmp<tmp1){
    return tmp;
   }
  }
  return null;
}

1 Ответ

0 голосов
/ 19 марта 2019

У кода OP есть некоторые фундаментальные синтаксические и логические недостатки.Устранение неполадок с помощью команды Logger могло бы помочь оператору OP определить проблемы.

1) Неправильный синтаксис используется для доступа к значению массива.Например, getLateDay использует v[0,i];Здесь есть две проблемы.

  • оба элемента массива должны быть заключены в квадратные скобки ([0][i]),
  • запрашивает не тот элемент.Вместо [0] [i] должно быть [i] [0].

2) getLateDay и getEarlyDay запрашивают значения в столбце C. Скорее, они должны запрашиватьстолбец D (столбец дат).

3) И getLateDay, и getEarlyDay должны оценить if(tmp>tmp1).Однако getLateDay должен возвращать "tmp", а getEarlyDay должен возвращать "tmp1".

4) getLateDay и getEarlyDay повторяют большую часть основного кода и в значительной степени идентичны.В интересах производительности их можно легко включить в основной код.

5) Для оценки раннего дня / позднего дня по сравнению с «tmp» требуется только один цикл, хотя, конечно, условия альфа-кода применяются кEarlyDay и LateDay должны оцениваться отдельно.Я также обнаружил, что значения, которые должны были быть сохранены для LateDay, лучше всего оценивались в последовательности операторов IF.Весь второй цикл может быть удален.

6) Это могло бы быть менее запутанным и сэкономить несколько минут времени обработки, если вместо того, чтобы работать с отдельными диапазонами для столбца C и столбца D, один диапазон изначения были объявлены для объединенных столбцов.Это будет гораздо важнее, поскольку задача ОП растет, и они работают с 25 столбцами.

Я изменил код ОП для учета этих комментариев.Я оставил несколько операторов Logger в коде, чтобы OP мог оценивать переменные в различных состояниях кода.

//text data in D, dates to evaluate earlyDay/lateDay in C
var Offset = 1;

function deleteRows() {

  // set up the spreadsheet
  var app = SpreadsheetApp.getActiveSpreadsheet();
  var targetSheet = app.getSheetByName('Sheet1');

  // define the data ranges and get values
  var r = targetSheet.getRange('C:C');
  var v = r.getValues();
  var r1 = targetSheet.getRange('D:D');
  var f = r1.getValues();
  //Logger.log("DEBUG: code: "+v[0][0]+", date: "+f[0][0].getTime());//DEBUG
  //Logger.log("DEBUG: length of f: "+f.length);//DEBUG

  // get the respective values for lateDay and earlyDay
  var lateDay = new Date(getLateDay()).getTime();
  var earlyDay = new Date(getEarlyDay()).getTime();
  //Logger.log("DEBUG: LateDay: "+lateDay+", EarlyDay: "+earlyDay); //DEBUG

  // Loop through the data, starting at te bottom.
  for (var i = f.length - 1; i > -1; i--) {

    // get the date for this row
    var tmp = new Date(f[i][0]).getTime();

    // evaluate if this row is early and the values of possible codes
    if (tmp == earlyDay && (v[i][0] == "AAA" || v[i][0] == "BBB" || v[i][0] == "DDD" || v[i][0] == "FFF")) {
      Logger.log("DEBUG: Option#1 i: " + i + ", row: " + (i + 1) + "- delete row , earlyDay: " + earlyDay + ", tmp: " + tmp + ", code: " + v[i][0]); //DEBUG

      // Note the row deleted is "i+1" because the deleteRow command matchs the actual row number, whereas the loop works on a zero-basis.
      targetSheet.deleteRow(i + 1);
    } else {
      //Logger.log("DEBUG: Option#1 - do nothing");//DEBUG
    }

    // evaluate if this row is late and the values of possible codes
    // Note this is an either or; a day cannot be both early and late
    if (tmp == lateDay) {
      Logger.log("today is Late Day");
      if (v[i][0] != "FFF") {
        if (v[i][0] != "DDD") {
          if (v[i][0] != "BBB") {
            if (v[i][0] != "AAA") {
              Logger.log("DEBUG: code <> AAA or BBB or DDD or FFF"); //DEBUG
              Logger.log("DEBUG: Option#2 i: " + i + ", row: " + (i + 1) + "- delete row , lateDay: " + lateDay + ", tmp: " + tmp + ", code: " + v[i][0]); //DEBUG
              targetSheet.deleteRow(i + 1);
            } else {
              //Logger.log("DEBUG: Option#2 - do nothing");//DEBUG
            }
          }
        }
      }
    }
  }
}

function getLateDay() {

  var app = SpreadsheetApp.getActiveSpreadsheet();
  var targetSheet = app.getSheetByName('Sheet1');
  var r1 = targetSheet.getRange('D:D');
  var f = r1.getValues();
  for (var i = f.length - 1; i > -1; i--) {
    var tmp = new Date(f[i][0]).getTime();
    var tmp1 = new Date(f[i - 1][0]).getTime();
    //Logger.log("DEBUG: LateDay: i: "+i+", this day: "+tmp+", yesterday: "+tmp1);//DEBUG
    if (tmp > tmp1) {
      //Logger.log("DEBUG: return this day: "+tmp);//DEBUG
      return tmp;
    }
  }
  //Logger.log("DEBUG: return null");
  return null;
}

function getEarlyDay() {

  var app = SpreadsheetApp.getActiveSpreadsheet();
  var targetSheet = app.getSheetByName('Sheet1');
  var r1 = targetSheet.getRange('D:D');
  var f = r1.getValues();
  for (var i = f.length - 1; i > -1; i--) {
    var tmp = new Date(f[i][0]).getTime();
    var tmp1 = new Date(f[i - 1][0]).getTime();
    //Logger.log("DEBUG: EarlyDay: i: "+i+", tmp: "+tmp+", tmp1: "+tmp1);//DEBUG
    if (tmp > tmp1) {
      //Logger.log("DEBUG: return this day: "+tmp1);//DEBUG
      return tmp1;
    }
  }
  //Logger.log("DEBUG: return null");//DEBUG
  return null;
}

ДО и ПОСЛЕ снимков экрана

Before After

...