/*jslint browser:true, long:true, white:true*/
/*global
CodeMoveCounts, FIRST_STAFF_ROW, SpreadsheetApp, YearlyStats
*/
/**
* @file Defines the <code><b>MonthlyRun</b></code> module. This module has
* functions for setting up spreadsheets used for tallying and viewing group
* stats.
* Set up a monthly [Trigger]{@linkcode https://developers.google.com/apps-script/guides/triggers/installable}
* for MonthlyRun.main() to automatically build stats spreadsheets.
*/
/******************************************************************************/
/**
* @namespace MonthlyRun
*/
// eslint-disable-next-line no-unused-vars
const MonthlyRun = (function (SpreadsheetApp) {
"use strict";
/**
* Returns a the file ID for the monthly data file object, for the current
* month. If the file does not already exist, a new one will be created.
* @function getCodeMoveFile
* @memberof MonthlyRun
* @private
* @param {Object} yearFolder - the data folder
* @param {string} yearMonthStr - used for naming the spreadsheet and sheets
* @param {Object} dateObj - JavaScript date object for current month
* @returns {File} - monthly data spreadsheet file object
*/
function getCodeMoveFile(yearFolder, yearMonthStr, dateObj) {
// get or create YYYY-MM spreadsheet
const [codeMoveFile, newCodeMoveFile] = CodeMoveCounts.getDataFile(
yearFolder, yearMonthStr, dateObj);
let spreadsheet = {};
// edit new month spreadsheets
if (newCodeMoveFile === true) {
spreadsheet = SpreadsheetApp.openById(codeMoveFile.getId());
spreadsheet.getSheetByName("Totals").getRange("A1:A3").setValue(dateObj);
// for each staff member update link from Totals sheet
spreadsheet
.getSheetByName("Totals")
.getRange("A4:A23")
.getValues()
.map((nameArr) => nameArr[0])
.filter((name) => name)
.forEach(function (name, index) {
// eslint-disable-next-line no-undef
const row = FIRST_STAFF_ROW + index; /* jshint ignore:line */
const sheet = spreadsheet.getSheetByName(name);
const email = sheet.getRange("B1").getValue();
spreadsheet
.getSheetByName("Totals")
.getRange("A" + row)
.setValue(
"=HYPERLINK(\""
+ "https://docs.google.com/spreadsheets/d/"
+ spreadsheet.getId()
+ "/edit#gid="
+ spreadsheet.getSheetByName(name).getSheetId()
+ "\", \""
+ name
+ "\")"
);
// set protections
try {
sheet.protect().setDomainEdit(false).addEditor(email);
sheet
.getRange("A1:Z2")
.protect()
.setDomainEdit(false)
.removeEditor(email);
} catch (e) {
console.log(e);
}
return undefined;
});
} // end if statement
return codeMoveFile;
}
/**
* Gets the current year's data folder. If the folder does not exist then it
* will be created and populated with a yearly stats spreadsheet. A monthly
* totals data entry spreadsheet will be created for the current month and
* linked to the yearly stats spreadsheet.
* @function main
* @memberof MonthlyRun
* @public
* @param {number} [testYear=undefined] - YYYY format
* @param {number} [testMonth=undefined] - 0...11
* @returns {undefined}
*/
// eslint-disable-next-line no-unused-vars
function main(testYear = undefined, testMonth = undefined) {
let yearFolder = {};
let codeMoveFile = {};
let yearlyStatsFile = {};
let yearlySupTechFile = {};
const dateObj = testYear !== undefined && testMonth !== undefined
? new Date(testYear, testMonth)
: new Date();
const yearStr = dateObj.getFullYear().toString();
const month = dateObj.getMonth();
const monthStr = String(month + 1)
.toString()
.padStart(2, "0");
const yearMonthStr = "Weekend Code Move Count" + " "
+ yearStr + "-" + monthStr;
/* jshint ignore:start */
// See: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment#Array_destructuring
/* jshint ignore:end */
[
yearFolder,
yearlyStatsFile,
yearlySupTechFile,
] = YearlyStats.getFolderAndFiles(yearStr);
codeMoveFile = getCodeMoveFile(yearFolder, yearMonthStr, dateObj);
YearlyStats.monthlyUpdate(
yearlyStatsFile,
yearlySupTechFile,
codeMoveFile,
month,
yearMonthStr,
yearStr
);
return undefined;
}
return Object.freeze({
main
});
})(SpreadsheetApp);
/******************************************************************************/