Source: MonthlyRun.js

/*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);

/******************************************************************************/