Удалить ячейки на основе даты, но оставить форматирование - PullRequest
1 голос
/ 02 мая 2019

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

Удалить ячейки на основе даты

Это код:

function myFunction() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("Field1");
var datarange = sheet.getDataRange();
var lastrow = datarange.getLastRow();
var values = datarange.getValues();// get all data in a 2D array

var currentDate = new Date();
var oneweekago = new Date();
oneweekago.setDate(currentDate.getDate() - 1);

for (i=lastrow;i>=2;i--) {
var tempdate = values[i-1][0];// arrays are 0 indexed so row1 = values[0] 
and col3 = [2]

 if(tempdate < oneweekago)  
{
  sheet.deleteRow(i);
}
}
}

1 Ответ

0 голосов
/ 02 мая 2019

То, что вы ищете, это .clearContent (), а не deleteRow.Это только очистит содержимое ячейки, но оставит все форматирование в такте.Вот документация Class Range , она действительно полезна, когда вы смотрите на то, что вы можете сделать с определенным диапазоном на листе.

Теперь, чтобы заставить это работать так, как вы хотите, вы будетенеобходимо использовать 2 для операторов, один для получения номера строки (i), а другой для получения номера столбца (j), который затем можно использовать в .getRange для запуска .clearContent () в.

function clearOldRecords() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName("Field1");
  var dataRange = sheet.getDataRange();
  var lastRow = dataRange.getLastRow();
  var data = dataRange.getValues();

  var currentDate = new Date();
  var oneWeekAgo = new Date();
  oneWeekAgo.setDate(currentDate.getDate() - 7);

  for (var i = 0; i < data.length; i++) {
    for (var j = 0; j < data[i].length; j++) {
    var tempDate= data[i][0]; //column number is indexed from 0, change accordingly to your data

      //if start date column is older than 7 days, clear the content of the row
      if (tempDate!= "" && tempDate < oneWeekAgo) {
        sheet.getRange(i+1,j+1).clearContent();
      }
    }
  }
}

Итак, для более подробного объяснения, это заметные изменения, которые я внес в ваш скрипт.

Вычитание даты отрабатывается в днях, поэтому выполнение -1 займет всего 1 деньвне даты.Вам нужна неделя, поэтому я изменил это значение на -7:

oneWeekAgo.setDate(currentDate.getDate() - 7);

Скрипт также больше не сканирует последнюю строку листа, это может повлиять на производительность, если лист огромный, но в обычный день.Для сегодняшнего дня это не должно быть проблемой.

Как вы можете видеть ниже, цикл for для i получает все номера строк, а цикл j может использоваться для номеров столбцов, так как выПри попытке очистить содержимое можно увидеть в getRange ():

sheet.getRange(i+1,j+1).clearContent();

Примечание: это может оставить довольно большие пробелы в ваших данных, если они не отсортированы по дате, вы можете добавитьчто-то вроде этого для последующей сортировки (поместите это вне циклов FOR):

sheet.getRange('A1:Z').sort({column: 2, ascending: false}) //change column number accordingly, this is NOT indexed from 0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...