#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);
}
}