const REQUESTS_SHEET = 'Requests'; const STATUS_COLUMN = 3; /** * Returns the bound spreadsheet's Requests sheet or stops with a clear error. * * @returns {SpreadsheetApp.Sheet} */ function getRequestsSheet_() { const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(REQUESTS_SHEET); if (sheet === null) { throw new Error('Add a sheet tab named ' + REQUESTS_SHEET + ' before running this function.'); } return sheet; } /** * Reads the request rows below the header. Returns an empty array when the * sheet has only a header row. * * @param {SpreadsheetApp.Sheet} sheet * @returns {unknown[][]} */ function readRequestRows_(sheet) { const lastRow = sheet.getLastRow(); if (lastRow < 2) { return []; } return sheet.getRange(2, 1, lastRow - 1, STATUS_COLUMN).getValues(); } /** * Logs the title of every request row. * * @returns {void} */ function logRequestTitles() { const rows = readRequestRows_(getRequestsSheet_()); rows.forEach(function (row) { Logger.log(row[1]); }); } /** * Logs how many requests are not Done. * * This function contains three mistakes. Open it in the Apps Script editor * with myFunction installed, then fix each one by reading the Problems panel. * * @returns {void} */ function countOpenRequests() { const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(REQUESTS_SHEET); const lastRow = sheet.getLastRow(); const rows = sheet.getRange(2, 1, lastRow - 1, '3').getValues(); const open = rows.filter(function (row) { return row[STATUS_COLUMN - 1] !== 'Done'; }); Logger.log('Open requests: ' + open.lenght); }