/* ===================================================================================================================== */ /* User-specific information */ var WRITING_DATA = "[YOUR FILE ID]"; // ID to your writing stats spreadsheet var TEST_MODE = loadConfigData("Test Mode"); var EMAIL_ADDRESS = loadConfigData("Email Address"); var TIME_ZONE = Session.getTimeZone(); var WRITING_SHEET = loadConfigData("Writing Sheet"); var DATA_SHEET = loadConfigData("Data Sheet"); var RECORD_SHEET = loadConfigData("Record Sheet"); var GOAL_SHEET = loadConfigData("Goal Sheet"); var BLOGGING_SHEET = loadConfigData("Blogging Sheet"); /* Spreadsheet constants */ var RECORD_WRITING_STREAK = loadConfigData("Writing Streak"); var RECORD_BLOGGING_STREAK = loadConfigData("Blogging Streak"); var RECORD_WRITING_WORDS = loadConfigData("Words Record"); var RECORD_BLOGGING_WORDS = loadConfigData("Blogging Record"); var RECORD_WRITING_DATE = loadConfigData("Writing Record Date"); var RECORD_BLOGGING_DATE = loadConfigData("Blogging Record Date"); var RECORD_WRITING_GOAL_STREAK = loadConfigData("Writing Goal Streak"); var RECORD_BLOGGING_GOAL_STREAK = loadConfigData("Blogging Goal Streak"); var COL_WRITING_TOTAL = loadConfigData("Writing Total"); var COL_BLOGGING_TOTAL = loadConfigData("Blogging Total"); var COL_FICTION = loadConfigData("Writing Fiction"); var COL_NONFICTION = loadConfigData("Writing Nonfiction"); /* Email customization */ var EMAIL_SUBJECT = loadConfigData("Almanac Subject"); /* Execution Parameters */ var MODE = loadConfigData("Word Count Mode"); var REPORT_BLOGGING = loadConfigData("Include Blogging"); var verifiedConfig = 0; var error_count = 0; var OFFSET_DAYS = loadConfigData("Offset Days"); var USE_TUMBLR = loadConfigData("Use Tumblr"); if (USE_TUMBLR == 1) var TUMBLR_EMAIL = loadConfigData("Tumblr Email"); if (TEST_MODE == 1) Logger.log("Detected time zone as: " + TIME_ZONE); /* ===================================================================================================================== */ function verifySetup() { /* Does a set of checks to make sure the scripts are setup correctly */ /* Has WRITING_DATA been set */ if (WRITING_DATA == "[YOUR FILE ID]") { throw new Error("CONFIGURATION: WRITING_DATA value has not been set. Please set this value to the key ID of your writing spreadsheet."); } /* Do the timezones for the script and spreadsheet match? */ Logger.log(TIME_ZONE); var ss_verify = SpreadsheetApp.openById(WRITING_DATA); SS_TZ = ss_verify.getSpreadsheetTimeZone(); Logger.log(SS_TZ); if (TIME_ZONE != SS_TZ) { throw new Error("CONFIGURATION: The timezone settings of the writing spreadsheet and scripts do not match.\nPlease ensure both are set to the same timezone. See README for details.\nScript TZ: " + TIME_ZONE + "\nSpreadsheet TZ: " + SS_TZ); } verifiedConfig = 1; } function loadConfigData(setting) { if (verifiedConfig == 0) { verifySetup(); } try { var ss = SpreadsheetApp.openById(WRITING_DATA); } catch (e) { throw new Error("CONFIGURATION: The writing spreadsheet with ID '" + WRITING_DATA + "' does not exist. Please point to a valid spreadsheet key."); } var config_sheet = ss.getSheetByName("Config"); var last_row = config_sheet.getLastRow(); var range = config_sheet.getRange("A2:B" + last_row); var row = find(setting, range); if (row == null) throw new Error ("ERROR: Could not find setting '" + setting + "' in the Config tab."); else { var row_result = row.getRow(); var result = config_sheet.getRange("B" + row_result).getValue(); if (config_sheet.getRange("C" + row_result).getValue() == "Required" && result == "") { error_count++; Logger.log("ERROR: Required setting '" + setting + "' is not set on the Config tab."); } return result; } } function find(value, range) { var data = range.getValues(); for (var i = 0; i < data.length; i++) { for (var j = 0; j < data[i].length; j++) { if (data[i][j] == value) { return range.getCell(i + 1, j + 2); } } } return null; } function getAlamancText() { if (error_count > 0) { throw new Error ("Not all required configuration settings have been set. See View->Logs for details."); } var d = new Date(); d.setDate(d.getDate()-OFFSET_DAYS); var almanac_day = Utilities.formatDate(d, TIME_ZONE, "MM/dd/yyyy"); var message; var tumblr_message; updateRanges(); /* Get writing goals */ var ficGoal = getWritingGoal(); /* Get word counts */ if (MODE == 1) { /* ASSERT: Split into fiction/nonficiton */ var ficWords = getWordsWritten(almanac_day, "Writing", "fiction"); var nfWords = getWordsWritten(almanac_day, "Writing", "nonfiction"); var totalFicNonFicWords = ficWords + nfWords; var fictionPercent = (ficWords/totalFicNonFicWords)*100; var nonFictionPercent = 100 - fictionPercent; } else { /* ASSERT: Don't split, just give the totals */ var ficWords = getWordsWritten(almanac_day, "Writing", "total"); var totalFicNonFicWords = ficWords; } /* Get writing record and date */ var ficBest = getMaxRecord("Writing"); var ficBestDate = getMaxRecordDate("Writing"); if (REPORT_BLOGGING == 1) { /* ASSERT: get blogging word count */ var blogWords = getWordsWritten(almanac_day, "Blogging", "Blogging"); /* Get blogging record and date */ var blogBest = getMaxRecord("Blogging"); var blogBestDate = getMaxRecordDate("Blogging"); } else { /* ASSERT: not counting blogging */ var blogWords = 0; } /* Get total writing days */ var totalWritingDays = getTotalWritingDays(); var writingDays = totalWritingDays - getMissedDays(); /* Total words written */ var totalWords = totalFicNonFicWords + blogWords; /* Get current writing streak */ if (TEST_MODE == 1) Logger.log("Calling getStreakDays(" + almanac_day + ", Writing, 0)"); var ficStreak = getStreakDays(almanac_day, "Writing", 0); /* Get current writing goal streak */ if (TEST_MODE == 1) Logger.log("Calling getStreakDays(" + almanac_day + ", Writing, " + ficGoal + ")"); var goalStreak = getStreakDays(almanac_day, "Writing", ficGoal); /* Get best writing streak */ var ficBestStreak = getMaxRecordStreak("Writing", 0); /* Get beste writing goal streak */ var goalBestStreak = getMaxRecordStreak("Writing", 1); if (REPORT_BLOGGING == 1) { /* ASSERT: Get blogging streak */ if (TEST_MODE == 1) Logger.log("Calling getStreakDays(" + almanac_day + ", Bloggingg, 0)"); var blogStreak = getStreakDays(almanac_day, "Blogging", 0); /* Get best blogging streak */ var blogBestStreak = getMaxRecordStreak("Blogging", 0); } message = "

Writing summary

"; message = message + "

You wrote a total of " + totalWords + " words. These breakdown as follows:

"; message = message + "

Fiction/Nonfiction

"; message = message + "