1 Вопрос: Удалить ячейки на основе даты, но оставить форматирование

вопрос создан в Thu, May 2, 2019 12:00 AM

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

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

Это код:

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
1 ответ                              1                         

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

Теперь, чтобы это работало так, как вы хотите, вам придется использовать 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
    
0
2019-05-05 23: 10: 19Z
источник размещен Вот