Как в google Apps script получить несколько значений в формате .getTime из диапазона?

Рейтинг: 1Ответов: 1Опубликовано: 08.02.2023

Нужна помощь. Пытаюсь организовать поиск строк по значению диапазона с датами в таблице гугл. Но критерий поиска это разница между текущей датой и датой из диапазона в 14 и более дней.

Пытался сделать так:

const ss = SpreadsheetApp.openById('1hvjaPuyYPQ1rm5Ew3Ig_dH1aQTu8kzYKEkebzsi6gw4');
const sheet1 = ss.getSheetByName("Лист1");
const sheet2 = ss.getSheetByName("Лист2");
const sheet3 = ss.getSheetByName("Лист3");
const millInDay = 1000 * 60 * 60 *24;
let nowDate = new Date(sheet1.getRange(1,1).getValue()).getTime();

function findRow(){
 new Date(sheet3.getRange('B:B').getValues().getTime()
  .forEach(
    (row, i) => {
    if(((nowDate - row[0])/millInDay) >= 14 ) result(i+2);
 }));

}
function cresult(lastDate){
  console.log(lastDate);
}

Но валидатор пишет что функция .getTime не работает в таком формате. Пытался найти ответ на просторах сети, но не преуспел. Есть ли возможность реализовать такой поиск через .getTime или нужно копать в другую сторону. Заранее благодарен

Ответы

▲ 0Принят

В вашем варианте, скрипт должен выглядеть так:

// Допустим, что выборка вернула такой результат
// sheet1.getRange(1,1).getValue() = 08.02.2023
const dateStringNow = '08.02.2023';
let nowDate = stringToDate(dateStringNow);

function stringToDate(dateString) {
    const dateValues = dateString.split('.');
    return new Date(dateValues[2], dateValues[1] - 1, dateValues[0], 0,0,0,0,0).getTime();
}

// Допустим это то что выбралось из sheet3.getRange('B:B').getValues()
const datas = ['11.01.2023', '22.02.2018', '01.12.2021', '01.02.2023'];

function findRow() {
    datas.forEach((item, index) => {
        const colDate = stringToDate(item);
        if (nowDate - colDate > 86400000 * 14) {
            // Больше 14 дней
            console.log('Больше', item);
        } else {
            // Если меньше
            console.log('меньше', item)
        }
    })
}

findRow()

Код для google sheets(При условии что sheet3.getRange('B:B').getValues() возвращает массив элементов):

    let nowDate = stringToDate(sheet1.getRange(1,1).getValue());

    function stringToDate(dateString) {
        const dateValues = dateString.split('.');
        return new Date(dateValues[2], dateValues[1] - 1, dateValues[0], 0,0,0,0,0).getTime();
    }

    function findRow() {
        sheet3.getRange('B:B').getValues().forEach((item, index) => {
            const colDate = stringToDate(item);
            if (nowDate - colDate > 86400000 * 14) {
                // Больше 14 дней
                console.log('Больше', item);
            } else {
                // Если меньше
                console.log('меньше', item)
            }
        })
    }

    findRow()

P.S. Если вам надо взять дату "сегодня", то не обязательно выбирать дату из ячейки, можно сделать так new Date().getTime() и вернется текущее время

UPD: Т.к. возвращаемое значение и так имеет формат Date, можно отказаться от функции преобразования строки в дату:

let nowDate = sheet1.getRange(1,1).getValue().getTime();

function findRow() {
    sheet3.getRange('B:B').getValues().forEach((item, index) => {        
        if (nowDate - item[0].getTime() > 86400000 * 14) {
            // Больше 14 дней
            console.log('Больше', item);
        } else {
            // Если меньше
            console.log('меньше', item)
        }
    })
}

findRow()