преобразуйте «неделю назад» в фактическую дату

#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 .

Ссылка