Эта функция не будет работать, если она выполняется с помощью триггера, управляемого временем, но работает нормально, если вызывается вручную

#javascript #google-apps-script #google-sheets

Вопрос:

Итак, я получил этот код для группировки строк. Когда я вызываю функцию вручную, она работает нормально. Но когда я использую управляемый временем триггер для выполнения, он не будет работать. console.log() Сообщения, которые я использую для отладки, отображаются в журналах. Триггеры, управляемые временем, не отображают никаких ошибок, и я не получаю никаких сообщений электронной почты от Google, предупреждающих меня о каких-либо ошибках. Он просто не будет группировать строки. На самом деле после того, как функция вызывается через триггер привода времени, отображается как completed .

Есть ли какая-то строка кода, которая портит вызовы триггеров, управляемых временем?

Вот код:

 const logSheetName = "LOG";

// Functions to group by day, month and year. Within each the variables are redefined, except logSheetName

// Grouping by Day
function groupDays() {
    var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(logSheetName);
    // Variables needed to get row number of the first row of row block for last day, for rowStart variable
    var dateDay = sheet.getRange(sheet.getLastRow() - 1, 1).getValue();
    var dayPlusMonth = Utilities.formatDate(dateDay, Session.getScriptTimeZone(), "dd/MM/YYYY");
    var cells = sheet.getRange("A5:A").createTextFinder(dayPlusMonth).findAll().map(x => x.getRowIndex());
    var firstRowOfDay = cells[0];
    // Variables needed for Grouping Function
    rowStart = firstRowOfDay;
    rows = sheet.getLastRow() - rowStart   1;
    dates = sheet.getRange(rowStart, 1, rows, 1).getValues().flat();
    // Group by day execution
    groupDates(dates, 'date');
    console.log("groupDays() executed");
    console.log("first row from Days position is "   rowStart);
}

var rowStart;
var rows;
var dates;
var prevDate;
var rangeStart;
var rangeEnd;
var groupingPeriod;

function groupDates(dates, period) {
    groupingPeriod = period;
    dates.forEach((date, idx) => {
        if (idx === 0) {
            processInitialDate(date);
        } else {
            processDate(date, idx);
        }
    });
}

function processInitialDate(date) {
    prevDate = date;
    rangeStart = 0;
    rangeEnd = rangeStart;
}

function processDate(date, idx) {
    if (periodHasChanged(date, prevDate, groupingPeriod)) {
        createGroup();
        rangeStart = rangeEnd   1;
        rangeEnd = rangeStart;
    } else {
        rangeEnd  ;
        if (idx === dates.length - 1) {
            createGroup();
        }
    }
    prevDate = date;
}

function periodHasChanged(currDate, prevDate, period) {
    switch (period) {
        case 'year':
            var currPeriod = currDate.getYear();
            var prevPeriod = prevDate.getYear();
            break;
        case 'month':
            var currPeriod = currDate.getMonth();
            var prevPeriod = prevDate.getMonth();
            break;
        case 'date':
            var currPeriod = currDate.getDate();
            var prevPeriod = prevDate.getDate();
            break;
    }
    return currPeriod !== prevPeriod;
}

function createGroup() {
    const sheet = SpreadsheetApp.getActiveSheet();
    var rangeGroup = dates.slice(rangeStart, rangeEnd   1);
    if (rangeGroup.length > 1) {
        var range = `${rowStart   rangeStart   1}:${rowStart   rangeEnd}`;
        sheet.getRange(range).shiftRowGroupDepth(1);
    }
}
 

Вот фиктивный файл:
https://docs.google.com/spreadsheets/d/1ExXtmQ8nyuV1o_UtabVJ-TifIbORItFMWjtN6ZlruWc/edit?usp=sharing

Ответ №1:

Поэтому я просто понял, что триггеры, управляемые временем getActiveSheet() , не будут работать. Листовые листы, которые следует называть по имени: SpreadsheetApp.getActiveSpreadsheet().getSheetByName("LOG");

Внизу я перешел на:

 function createGroup() {
    const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(logSheetName);
    var rangeGroup = dates.slice(rangeStart, rangeEnd   1);
    if (rangeGroup.length > 1) {
        var range = `${rowStart   rangeStart   1}:${rowStart   rangeEnd}`;
        sheet.getRange(range).shiftRowGroupDepth(1);
    }
}