#google-apps-script #google-sheets
Вопрос:
У меня есть лист Google, в котором есть записи, в одном из столбцов которых указана дата ввода. Я хочу, чтобы код проверял, не старше ли дата в столбце E 30 дней, и удалял строку.
Однако у меня есть столбец E, специально отформатированный в виде обычного текста под параметрами листа. Причина этого в том, что у меня есть другой сценарий, который извлекает данные из листов в формате JSON, и установка столбца в обычный текст делает его отображаемым в виде строки, как я хотел в своем JSON.
Мой код работает, если я отформатирую столбец «E» в формате даты.
В настоящее время данные добавляются как «11 мая 2021 года», в то время как ближайший формат даты на листах — «11 мая 2021 года» без «th» или «rd» после дат, но я хотел бы сохранить его таким, каким он есть, если это возможно.
Приведенный ниже код работает, если столбец E отформатирован в формате даты, но есть ли способ заставить его работать в формате обычного текста, для которого он в настоящее время установлен?
Сделал фиктивный лист Google для визуализации: https://docs.google.com/spreadsheets/d/1_156bLL03lFo9NdjE6KmrGiFJvYXkvReel_9znMwT4M/edit?usp=sharing
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("sheet1"); //assumes Sheet 1 is the name of the sheet
var datarange = sheet.getDataRange();
var lastrow = datarange.getLastRow();
var values = datarange.getValues();// get all data in a 2D array
var monthOld = new Date()
monthOld = new Date(monthOld.getTime()-30*3600000*24) //Set date 30 days in past from today
Logger.log(monthOld) // confirm I am getting date 30 days ago
for (i=lastrow;i>=2;i--) {
var tempDate = values[i-1][4];// arrays are 0 indexed so row2 = values[1] and colE = [4]
Logger.log(tempDate)
if (tempDate <= monthOld)
{
sheet.deleteRow(i);
Logger.log(`Row ${i} was deleted`);
} else {
Logger.log(`Nothing was deleted`);
}
}
}
Комментарии:
1. Пожалуйста, поделитесь копией своей электронной таблицы в качестве минимального воспроизводимого примера
2. Я добавил ссылку на исходную правку. Это выглядит примерно так docs.google.com/spreadsheets/d/…
3. Спасибо за это изменение
Ответ №1:
Попробуй
var tempDate = new Date(values[i-1][4].replace(/(th|rd|st|nd)/gm,""));
Ответ №2:
Используя функцию testbelow в качестве промежуточной функции, чтобы передать соответствующие аргументы isOlderThan(). Вы передаете данные в ds и количество дней в днях. isOlderThan возвращает значение true или false в зависимости от сегодняшней даты.
function testbelow() {
isOlderThan({ds:"Jul 30th, 2021",days:30})
}
function isOlderThan(obj) {
const dA = ["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug"]
const dt = new Date();
const dtv = new Date(dt.getFullYear(),dt.getMonth(),dt.getDate() - obj.days).valueOf();
let t = obj.ds.split(" ");
let idtv = new Date(t[2],dA.indexOf(t[0]),parseInt(t[1])).valueOf();
Logger.log(idtv < dtv);
return idtv < dtv
}
Ответ №3:
Майк Стилсон предоставил строку кода, необходимую мне для преобразования обычного текста, проанализировав значения, которые не применялись, и преобразовав их в дату.
var tempDate = new Date(values[i-1][4].replace(/(th|rd|st|nd)/gm,""));