#google-apps-script #google-sheets
Вопрос:
У меня есть документ Google sheets, в котором скребок получает отзывы с карт Google, я хочу отсортировать их по дате, но единственная дата, которую содержат отзывы, — это читаемая человеком «XX дней/недель/месяцев/лет назад», поэтому просто сортировка этого столбца не работает.
фактические значения, которые я получаю:
- день назад
- 2 дня назад
- 3 дня назад
- 4 дня назад
- 5 дней назад
- 6 дней назад
- неделю назад
- 2 недели назад
- 3 недели назад
- месяц назад
- 2 месяца назад
- …
- 11 месяцев назад
- год назад
- 2 года назад
Очевидно, что я не смогу получить фактическую дату отзывов, сделанных более 1 недели назад, но оценка была бы достаточно хорошей.
Ответ №1:
Не уверен, что это то, чего ты хочешь:
=index(if(A1:A<>"",today()-(switch(iferror(regexextract(A1:A,"(day|week|month|year)"),),"day",1,"week",7,"month",365.25/12,"year",365.25,)*iferror(substitute(regexextract(A1:A,"([da] ) "),"a",1),)),))
today()
Замените соскобленной датой, которая в примере может быть datevalue("2021-10-06")
.
Ответ №2:
Вы также можете добиться этого с помощью скрипта приложений:
function myFunction() {
var obj = {
'a': 1,
'two': 2,
'three': 3,
'four': 4,
'five': 5,
'six': 6,
'seven': 7,
'eight': 8,
'nine': 9,
'ten': 10,
'eleven': 11,
'twelve': 12,
'thirteen': 13,
'fourteen': 14,
'fifteen': 15,
'sixteen': 16,
'seventeen': 17,
'eighteen': 18,
'nineteen': 19,
'twenty': 20
};
var time = {
'day': 24 * 60 * 60 * 1000,
'week': 7 * 24 * 60 * 60 * 1000,
'month': 2.628e 9,
'year': 3.154e 10
}
let sheet = SpreadsheetApp.getActiveSheet();
let col = sheet.getRange(1, 1, 7, 1).getValues();
let now = new Date();
for (let i = 0; i < col.length; i ) {
namedDate = col[i][0].toString().split(' ');
console.log(namedDate[0])
if (namedDate[2] == "ago") {
if (obj.hasOwnProperty(namedDate[0]) amp;amp; namedDate[1].toString().includes('day')) {
var newDate = new Date(now.getTime() - obj[namedDate[0]] * time['day'])
sheet.getRange(i 1, 2).setValue(newDate);
} else if ((obj.hasOwnProperty(namedDate[0]) amp;amp; namedDate[1].toString().includes('week'))) {
var newDate = new Date(now.getTime() - obj[namedDate[0]] * time['week'])
sheet.getRange(i 1, 2).setValue(newDate);
} else if (obj.hasOwnProperty(namedDate[0]) amp;amp; namedDate[1].toString().includes('month')) {
var newDate = new Date(now.getTime() - obj[namedDate[0]] * time['month'])
sheet.getRange(i 1, 2).setValue(newDate);
} else if (obj.hasOwnProperty(namedDate[0]) amp;amp; namedDate[1].toString().includes('year')) {
var newDate = new Date(now.getTime() - obj[namedDate[0]] * time['year'])
sheet.getRange(i 1, 2).setValue(newDate);
}
}
}
}
Объяснение
Вы можете видеть, что в приведенном выше сценарии есть два объекта, которые представляют слова и их соответствующее значение в цифрах. obj
Объект отвечает за преобразование числовых строк в числа, и time
объект используется для сопоставления количества миллисекунд, соответствующих каждому временному интервалу. После этого (при условии, что ваши читаемые даты указаны в A
столбце) значения извлекаются, и к каждому из них применяются следующие методы, чтобы получить нужную дату:
- каждая читаемая человеком дата разделена на три строки таким образом , что каждая строка представляет сумму (например
a
,one
и так далее), временные рамки (day
week
и так далее) и прошлое/будущее (ago
,upfront
); - новая дата строится на основе этих трех значений и путем нахождения соответствующих значений в объектах
obj
иtime
; - в колонку вставляется новая дата
B
.
После выполнения сценария вот как будет выглядеть лист в конечном итоге:
Примечание
Пожалуйста, имейте в виду, что в приведенном выше сценарии был обработан только тот случай, когда вам нужно найти прошлые даты. Если вы также хотите рассчитать даты фьючерсов, вам придется добавить еще одно условие и добавить значения вместо их вычитания.
Более того, в зависимости от максимума amount
, который вы хотите пройти, чтобы рассчитать новую дату, вам, возможно, придется изменить сценарий, так как в его текущем состоянии он работает только с amount
s до 20
.
Ссылка
- Получить значения();
- Заданное значение(значение);
- Объект.прототип.Свойство hasOwnProperty().