Удалить ячейки на основе даты - PullRequest
0 голосов
/ 03 октября 2018

Мне нужна помощь со скриптом удаления ячеек.В общем, я хочу запустить скрипт сброса, который очищает все данные до того дня, когда я его запускаю.Поскольку я статически вводю значения в те ячейки, которые совпадают с информацией из фильтра, я считаю, что мне нужно удалить эти ячейки, чтобы правильно выровнять свои входные данные с тем, где будет находиться информация фильтра после удаления строк с истекшим сроком со страницы экспорта..

Вот что я хочу сделать в своем сценарии: если значение столбца F <сегодняшняя дата, то удалите ячейки в I, J и K и сдвиньте ячейки под ними вверх.Я думаю, что нашел код для этого, но запуск программы занимает так много времени, что время ожидания программы превышает несколько строк.Я буду использовать цикл for, чтобы запустить его на 73 страницах, поэтому, если он отстает на одной ... да, мне нужна помощь! </p>

function deleteEntries() { 
  var ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();

  var datarange = ss.getDataRange();
  var lastrow = datarange.getLastRow();
  var values = datarange.getValues();

  var currentDate = new Date();

  for (i = lastrow; i >= 5; i--) {
    var tempdate = values[i-1][5];

    if (tempdate < currentDate)  
    {
      ss.getRange(i-1, 8).deleteCells(SpreadsheetApp.Dimension.ROWS);
      ss.getRange(i-1, 9).deleteCells(SpreadsheetApp.Dimension.ROWS);
      ss.getRange(i-1, 10).deleteCells(SpreadsheetApp.Dimension.ROWS);
}}}

1 Ответ

0 голосов
/ 03 октября 2018

В соответствии с приложением Script «Лучшие практики» вы можете ограничить использование службы электронных таблиц для сокращения времени выполнения.Существует две «немедленные» оптимизации, которые можно рассмотреть:

  1. Удалять более 1 ячейки за раз подряд. Для этого просто выберите диапазон из 1 строки по 3 столбца: ss.getRange(i-1, 8, 1, 3) вместо выбора (i-1, 8), (i-1, 9), (i-1, 10) и вызова deleteCells для каждого из трех Ranges.
  2. Сортируйте свой лист перед удалением, так что необходим только 1 вызов удаления (например, C ++ stdlib идиома "erase-remove" ).Если ваши данные отсортированы по столбцу F, так что все данные, которые должны быть удалены, находятся в конце, то вам просто нужно выполнить итерацию в массиве в памяти ( очень быстрый процесс), чтобы найти первыйдата, которая должна быть удалена, а затем удалите все данные ниже и включая их.

Реализация варианта 2 будет выглядеть следующим образом ( Я предполагаю, что вы используете замороженные заголовки, так как они непереместить, когда лист или диапазон отсортированы ).

function sortDescAndGetValuesBack_(s, col) {
  return s.getDataRange().sort({column: col, ascending: false}).getValues();
}
function deleteAllOldData() {
  const sheets = SpreadsheetApp.getActive().getSheets()
      .filter(function (sheet) { /** some logic to remove sheets that this shouldn't happen on */});
  const now = new Date();
  const dim = SpreadsheetApp.Dimension.ROWS;

  sheets.forEach(function (sheet) {
    var values = sortDescAndGetValuesBack_(sheet, 6); // Col 6 = Column F
    for (var i = sheet.getFrozenRows(), len = values.length; i < len; ++i) {
      var fVal = values[i][5]; // Array index 5 = Column 6
      if (fVal && fVal < now) { // if equality checked, .getTime() is needed
        console.log({message: "Found first Col F value less than current time",
                     index: i, num2del: len - i, firstDelRow: values[i],
                     currentTime: now, sheet: sheet.getName()});
        var delRange = sheet.getRange(1 + i, 8, sheet.getLastRow() - i, 3);
        console.log({message: "Deleting range '" + sheet.getName() + "!" + delRange.getA1Notation() + "'"});
        delRange.deleteCells(dim);
        break; // nothing left to do on this sheet.
      }
    }
    console.log("Processed sheet '" + sheet.getName() + "'");
  });
}

Ссылки:

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