diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..da9020af7 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ + +gs/Private.gs diff --git a/gs/data.gs b/gs/data.gs new file mode 100644 index 000000000..e2b6b79a5 --- /dev/null +++ b/gs/data.gs @@ -0,0 +1,85 @@ +function refreshData() { + var data = ImportJSON("https://raw.githubusercontent.com/collinbarrett/FilterLists/master/json-data/filterlists.json", "", "noTruncate,rawHeaders,noInherit"); + data = fill2dJsonArrayWithNulls(data); + sData.clearContents(); + sData.getRange(1, 1, data.length, data[0].length).setValues(data); + sData.getRange(2, 1, data.length, data[0].length).sort(1); + refreshParsed(); + refreshPublic(); +} + +function refreshParsed() { + var urlTypes = ["viewUrl", "addUrl", "homeUrl", "forumUrl", "issuesUrl", "email", "donateUrl", "related"]; + for (var i = 0, urlTypesLength = urlTypes.length; i < urlTypesLength; i++) { + var columnIndex = getColumnIndex(sParsed, urlTypes[i]); + var columnDataRange = sParsed.getRange(columnIndex + "2:" + columnIndex); + columnDataRange.clearContent(); + var columnDataTopCell = sParsed.getRange(columnIndex + "2"); + switch (urlTypes[i]) { + case "viewUrl": + columnDataTopCell.setValue("=createHtmlViewLinkArray(INDIRECT(\"Data!\"&SUBSTITUTE(ADDRESS(1,MATCH(" + columnIndex + "1,Data!A1:1,0),4),\"1\",\"2\")&\":\"&SUBSTITUTE(ADDRESS(1,MATCH(" + columnIndex + "1,Data!A1:1,0),4),\"1\",\"\")),Data!A2:A)"); + break; + case "addUrl": + var viewUrlColumnIndex = getColumnIndex(sData, "viewUrl"); + columnDataTopCell.setValue("=createHtmlAddLinkArray(INDIRECT(\"Data!\"&SUBSTITUTE(ADDRESS(1,MATCH(Data!" + viewUrlColumnIndex + "1,Data!A1:1,0),4),\"1\",\"2\")&\":\"&SUBSTITUTE(ADDRESS(1,MATCH(Data!" + viewUrlColumnIndex + "1,Data!A1:1,0),4),\"1\",\"\")),Data!A2:A)"); + break; + case "homeUrl": + columnDataTopCell.setValue("=createHtmlHomeLinkArray(INDIRECT(\"Data!\"&SUBSTITUTE(ADDRESS(1,MATCH(" + columnIndex + "1,Data!A1:1,0),4),\"1\",\"2\")&\":\"&SUBSTITUTE(ADDRESS(1,MATCH(" + columnIndex + "1,Data!A1:1,0),4),\"1\",\"\")),Data!A2:A)"); + break; + case "forumUrl": + columnDataTopCell.setValue("=createHtmlForumLinkArray(INDIRECT(\"Data!\"&SUBSTITUTE(ADDRESS(1,MATCH(" + columnIndex + "1,Data!A1:1,0),4),\"1\",\"2\")&\":\"&SUBSTITUTE(ADDRESS(1,MATCH(" + columnIndex + "1,Data!A1:1,0),4),\"1\",\"\")),Data!A2:A)"); + break; + case "issuesUrl": + columnDataTopCell.setValue("=createHtmlIssuesLinkArray(INDIRECT(\"Data!\"&SUBSTITUTE(ADDRESS(1,MATCH(" + columnIndex + "1,Data!A1:1,0),4),\"1\",\"2\")&\":\"&SUBSTITUTE(ADDRESS(1,MATCH(" + columnIndex + "1,Data!A1:1,0),4),\"1\",\"\")),Data!A2:A)"); + break; + case "email": + columnDataTopCell.setValue("=createHtmlEmailLinkArray(INDIRECT(\"Data!\"&SUBSTITUTE(ADDRESS(1,MATCH(" + columnIndex + "1,Data!A1:1,0),4),\"1\",\"2\")&\":\"&SUBSTITUTE(ADDRESS(1,MATCH(" + columnIndex + "1,Data!A1:1,0),4),\"1\",\"\")),Data!A2:A)"); + break; + case "donateUrl": + columnDataTopCell.setValue("=createHtmlDonateLinkArray(INDIRECT(\"Data!\"&SUBSTITUTE(ADDRESS(1,MATCH(" + columnIndex + "1,Data!A1:1,0),4),\"1\",\"2\")&\":\"&SUBSTITUTE(ADDRESS(1,MATCH(" + columnIndex + "1,Data!A1:1,0),4),\"1\",\"\")),Data!A2:A)"); + break; + case "related": + columnDataTopCell.setValue("=ARRAYFORMULA(SUBSTITUTE(INDIRECT(\"Data!\"&SUBSTITUTE(ADDRESS(1,MATCH(\"related\",Data!A1:1,0),4),\"1\",\"2\")&\":\"&SUBSTITUTE(ADDRESS(1,MATCH(\"related\",Data!A1:1,0),4),\"1\",\"\")),\",\",\"
\"))"); + break; + default: + } + var columnData = columnDataRange.getDisplayValues(); + columnDataRange.clearContent(); + columnDataRange.setValues(columnData); + } +} + +function refreshPublic() { + var publicFields = ["list", "tags", "description", "links", "related"]; + for (var i = 0, publicFieldsLength = publicFields.length; i < publicFieldsLength; i++) { + var columnIndex = getColumnIndex(sPublic, publicFields[i]); + var columnDataRange = sPublic.getRange(columnIndex + "2:" + columnIndex); + columnDataRange.clearContent(); + var columnDataTopCell = sPublic.getRange(columnIndex + "2"); + switch (publicFields[i]) { + case "list": + columnDataTopCell.setValue("=createHtmlListNameArray(INDIRECT(\"Data!\"&SUBSTITUTE(ADDRESS(1,MATCH(\"list\",Data!A1:1,0),4),\"1\",\"2\")&\":\"&SUBSTITUTE(ADDRESS(1,MATCH(\"list\",Data!A1:1,0),4),\"1\",\"\")))"); + break; + case "tags": + columnDataTopCell.setValue("=ARRAYFORMULA(INDIRECT(\"Data!\"&SUBSTITUTE(ADDRESS(1,MATCH(\"tagLang\",Data!A1:1,0),4),\"1\",\"2\")&\":\"&SUBSTITUTE(ADDRESS(1,MATCH(\"tagLang\",Data!A1:1,0),4),\"1\",\"\")))"); + break; + case "description": + if (getColumnIndex(sData, "descrSourceUrl")) { + columnDataTopCell.setValue("=ARRAYFORMULA(IF(ISBLANK(INDIRECT(\"Data!\"&SUBSTITUTE(ADDRESS(1,MATCH(\"descrSourceUrl\",Data!A1:1,0),4),\"1\",\"2\")&\":\"&SUBSTITUTE(ADDRESS(1,MATCH(\"descrSourceUrl\",Data!A1:1,0),4),\"1\",\"\"))),,\"
\")&INDIRECT(\"Data!\"&SUBSTITUTE(ADDRESS(1,MATCH(\"descr\",Data!A1:1,0),4),\"1\",\"2\")&\":\"&SUBSTITUTE(ADDRESS(1,MATCH(\"descr\",Data!A1:1,0),4),\"1\",\"\"))&IF(ISBLANK(INDIRECT(\"Data!\"&SUBSTITUTE(ADDRESS(1,MATCH(\"descrSourceUrl\",Data!A1:1,0),4),\"1\",\"2\")&\":\"&SUBSTITUTE(ADDRESS(1,MATCH(\"descrSourceUrl\",Data!A1:1,0),4),\"1\",\"\"))),,\"
\"))"); + } else { + columnDataTopCell.setValue("=ARRAYFORMULA(INDIRECT(\"Data!\"&SUBSTITUTE(ADDRESS(1,MATCH(\"descr\",Data!A1:1,0),4),\"1\",\"2\")&\":\"&SUBSTITUTE(ADDRESS(1,MATCH(\"descr\",Data!A1:1,0),4),\"1\",\"\")))"); + } + break; + case "links": + columnDataTopCell.setValue("=ARRAYFORMULA(IF(Parsed!A2:A=\"\",\"\",\"

\"&Parsed!A2:A&Parsed!B2:B&Parsed!C2:C&Parsed!D2:D&Parsed!E2:E&Parsed!F2:F&Parsed!G2:G&\"

\"))"); + break; + case "related": + columnDataTopCell.setValue("=ARRAYFORMULA(INDIRECT(\"Parsed!\"&SUBSTITUTE(ADDRESS(1,MATCH(\"related\",Parsed!A1:1,0),4),\"1\",\"2\")&\":\"&SUBSTITUTE(ADDRESS(1,MATCH(\"related\",Parsed!A1:1,0),4),\"1\",\"\")))"); + break; + default: + } + var columnData = columnDataRange.getDisplayValues(); + columnDataRange.clearContent(); + columnDataRange.setValues(columnData); + } +} \ No newline at end of file diff --git a/gs/filscore.gs b/gs/filscore.gs new file mode 100644 index 000000000..05bae2863 --- /dev/null +++ b/gs/filscore.gs @@ -0,0 +1,75 @@ +function refreshFilScores() { + var sheetNameData = typeSheetPrefix[ss.getName()] + "Data"; + var sheetData = ss.getSheetByName(sheetNameData); + var sheetNameScores = typeSheetPrefix[ss.getName()] + "Scores"; + var sheetScores = ss.getSheetByName(sheetNameScores); + var sheetNamePublic = typeSheetPrefix[ss.getName()] + "Public"; + var sheetPublic = ss.getSheetByName(sheetNamePublic); + copyListNamesAndViewUrlsToScore(sheetData, sheetScores); + var colHeader = findColumnHeader(sheetScores, "sumUniqueDailyVisitorsLast30"); + if (colHeader) { + var rangeFull = sheetScores.getRange(colHeader + "2:" + colHeader); + rangeFull.clearContent(); + var numLists = getNumLists(sheetScores); + for (i = 2; i <= numLists + 1; i++) { + var cellCur = sheetScores.getRange(colHeader + i); + cellCur.setValue("=ImportJson(CONCATENATE(\"" + piwikUrl + "?module=API&method=Actions.getDownload&downloadUrl=\",EncodeUrl(B" + i + "),\"&idSite=3&date=last30&period=range&format=json&token_auth=" + piwikApiToken + "\"), \"/sum_daily_nb_uniq_visitors\", \"noHeaders\")"); + } + var data = rangeFull.getDisplayValues(); + rangeFull.clearContent(); + rangeFull.setValues(data); + for (i = 2; i <= numLists + 1; i++) { + var sumUniqueDailyVisitorsLast30 = sheetScores.getRange(colHeader + i).getValue(); + if (sumUniqueDailyVisitorsLast30 == "#REF!") { + var cellCur = sheetScores.getRange(colHeader + i); + cellCur.setValue("=ImportJson(CONCATENATE(\"" + piwikUrl + "?module=API&method=Actions.getOutlink&outlinkUrl=\",EncodeUrl(B" + i + "),\"&idSite=3&date=last30&period=range&format=json&token_auth=" + piwikApiToken + "\"), \"/sum_daily_nb_uniq_visitors\", \"noHeaders\")"); + } + } + var data = rangeFull.getDisplayValues(); + rangeFull.clearContent(); + rangeFull.setValues(data); + for (i = 2; i <= numLists + 1; i++) { + var sumUniqueDailyVisitorsLast30 = sheetScores.getRange(colHeader + i).getValue(); + if (sumUniqueDailyVisitorsLast30 == "#REF!") { + var cellCur = sheetScores.getRange(colHeader + i); + cellCur.setValue(0); + } + } + } + var colHeader = findColumnHeader(sheetScores, "score"); + var colHeaderVisitors = findColumnHeader(sheetScores, "sumUniqueDailyVisitorsLast30"); + if (colHeader) { + var rangeFull = sheetScores.getRange(colHeader + "2:" + colHeader); + rangeFull.clearContent(); + var numLists = getNumLists(sheetScores); + for (i = 2; i <= numLists + 1; i++) { + var cellCur = sheetScores.getRange(colHeader + i); + cellCur.setValue("=ROUND((100-0)/(MAX($" + colHeaderVisitors + "$2:$" + colHeaderVisitors + ")-MIN($" + colHeaderVisitors + "$2:$" + colHeaderVisitors + "))*($" + colHeaderVisitors + i + "-MAX($" + colHeaderVisitors + "$2:$" + colHeaderVisitors + "))+100)"); + } + var data = rangeFull.getDisplayValues(); + rangeFull.clearContent(); + rangeFull.setValues(data); + } + copyScoresToPublic(sheetScores, sheetPublic); +} + +function copyListNamesAndViewUrlsToScore(sheetData, sheetScores) { + var sourceRangeListNames = sheetData.getRange("A1:A"); + var targetRangeListNames = sheetScores.getRange("A1:A"); + targetRangeListNames.clearContent(); + sourceRangeListNames.copyTo(targetRangeListNames); + var viewUrlColumn = findColumnHeader(sheetData, "viewUrl"); + var sourceRangeScores = sheetData.getRange(viewUrlColumn + "1:" + viewUrlColumn); + var targetRangeScores = sheetScores.getRange("B1:B"); + targetRangeScores.clearContent(); + sourceRangeScores.copyTo(targetRangeScores); +} + +function copyScoresToPublic(sheetScores, sheetPublic) { + var colHeaderSource = findColumnHeader(sheetScores, "score"); + var colHeaderTarget = findColumnHeader(sheetPublic, "FilScore"); + var sourceRangeListNames = sheetScores.getRange(colHeaderSource + "2:" + colHeaderSource); + var targetRangeListNames = sheetPublic.getRange(colHeaderTarget + "2:" + colHeaderTarget); + targetRangeListNames.clearContent(); + sourceRangeListNames.copyTo(targetRangeListNames); +} \ No newline at end of file diff --git a/gs/html-links.gs b/gs/html-links.gs new file mode 100644 index 000000000..4575ad04c --- /dev/null +++ b/gs/html-links.gs @@ -0,0 +1,134 @@ +function createHtmlViewLinkArray(url, listName) { + if (url instanceof Array) { + for (i in url) { + url[i] = createHtmlViewLinkArray(url[i], listName[i]); + } + return url; + } else { + if (url && url != "#N/A") { + return "View"; + } else { + return ""; + } + } +} + +function createHtmlAddLinkArray(url, listName) { + if (url instanceof Array) { + for (i in url) { + url[i] = createHtmlAddLinkArray(url[i], listName[i]); + } + return url; + } else { + if (url && url != "#N/A") { + return "Add"; + } else { + return ""; + } + } +} + +function createHtmlHomeLinkArray(url, listName) { + if (url instanceof Array) { + for (i in url) { + url[i] = createHtmlHomeLinkArray(url[i], listName[i]); + } + return url; + } else { + if (url && url != "#N/A") { + return "Home"; + } else { + return ""; + } + } +} + +function createHtmlForumLinkArray(url, listName) { + if (url instanceof Array) { + for (i in url) { + url[i] = createHtmlForumLinkArray(url[i], listName[i]); + } + return url; + } else { + if (url && url != "#N/A") { + return "Forum"; + } else { + return ""; + } + } +} + +function createHtmlIssuesLinkArray(url, listName) { + if (url instanceof Array) { + for (i in url) { + url[i] = createHtmlIssuesLinkArray(url[i], listName[i]); + } + return url; + } else { + if (url && url != "#N/A") { + return "Issues"; + } else { + return ""; + } + } +} + +function createHtmlEmailLinkArray(url, listName) { + if (url instanceof Array) { + for (i in url) { + url[i] = createHtmlEmailLinkArray(url[i], listName[i]); + } + return url; + } else { + if (url && url != "#N/A") { + return "Email"; + } else { + return ""; + } + } +} + +function createHtmlDonateLinkArray(url, listName) { + if (url instanceof Array) { + for (i in url) { + url[i] = createHtmlDonateLinkArray(url[i], listName[i]); + } + return url; + } else { + if (url && url != "#N/A") { + return "Donate"; + } else { + return ""; + } + } +} + +function createHtmlRelatedLinkArray(forkComboListName, filterListsPageSlug) { + if (forkComboListName instanceof Array) { + for (i in forkComboListName) { + forkComboListName[i] = createHtmlRelatedLinkArray(forkComboListName[i], filterListsPageSlug[i]); + } + return forkComboListName; + } else { + if (forkComboListName == null) { + return null; + } else { + return "" + listName + ""; + } else { + return ""; + } + } +} \ No newline at end of file diff --git a/gs/http-response.gs b/gs/http-response.gs new file mode 100644 index 000000000..61b6c5d13 --- /dev/null +++ b/gs/http-response.gs @@ -0,0 +1,77 @@ +// refresh each type of url with a separate trigger due to Apps Script execution time limitations +function triggerRefreshHttpResponses1() { + refreshHttpResponses(1); +} + +function triggerRefreshHttpResponses2() { + refreshHttpResponses(2); +} + +function triggerRefreshHttpResponses3() { + refreshHttpResponses(3); +} + +function triggerRefreshHttpResponses4() { + refreshHttpResponses(4); +} + +function triggerRefreshHttpResponses5() { + refreshHttpResponses(5); +} + +function triggerRefreshHttpResponses6() { + refreshHttpResponses(6); +} + +function triggerRefreshHttpResponses7() { + refreshHttpResponses(7); +} + +function triggerRefreshHttpResponses8() { + refreshHttpResponses(8); +} + +function refreshHttpResponses(triggerNum) { + var sheetNameData = typeSheetPrefix[ss.getName()] + "Data"; + var sheetData = ss.getSheetByName(sheetNameData); + var sheetNameStatuses = typeSheetPrefix[ss.getName()] + "UrlStatuses"; + var sheetStatuses = ss.getSheetByName(sheetNameStatuses); + copyListNamesToStatuses(sheetData, sheetStatuses); + var listDataMax = getNumLists(sheetData) + var urlHeaders = findUrlColumnHeaders(sheetData); + if (urlHeaders.length >= triggerNum) { + var currentUrlType = urlHeaders[triggerNum - 1]; + var colHeaderData = findColumnHeader(sheetData, currentUrlType); + var colHeaderStatuses = findColumnHeader(sheetStatuses, currentUrlType); + var rangeData = sheetData.getRange(colHeaderData + "2:" + colHeaderData + (1 + listDataMax)); + var rangeStatuses = sheetStatuses.getRange(colHeaderStatuses + "2:" + colHeaderStatuses); + rangeStatuses.clearContent(); + for (i = 2; i <= rangeData.getNumRows() + 1; i++) { + var rangeStatus = sheetStatuses.getRange(colHeaderStatuses + i); + var url = rangeData.getCell(i - 1, 1).getValue(); + if (url) { + try { + var urlStatus = UrlFetchApp.fetch(url).getResponseCode(); + rangeStatus.setValue(urlStatus); + if (urlStatus != 200) { + if (!(urlResponseWhitelist.indexOf(url) > -1)) { + MailApp.sendEmail(noticeEmailAddress, urlStatus + ": " + url, urlStatus + ": " + url); + } + } + } catch (err) { + rangeStatus.setValue(err.message); + if (!(urlResponseWhitelist.indexOf(url) > -1)) { + MailApp.sendEmail(noticeEmailAddress, "Error: " + url, "Error: " + url + "
" + err.message); + } + } + } + } + } +} + +function copyListNamesToStatuses(sheetData, sheetStatuses) { + var sourceRange = sheetData.getRange("A1:A"); + var targetRange = sheetStatuses.getRange("A1:A"); + targetRange.clearContent(); + sourceRange.copyTo(targetRange); +} \ No newline at end of file diff --git a/gs/lib/ImportJson.gs b/gs/import-json.gs similarity index 99% rename from gs/lib/ImportJson.gs rename to gs/import-json.gs index 9329e6dbd..d69d13fe3 100644 --- a/gs/lib/ImportJson.gs +++ b/gs/import-json.gs @@ -63,7 +63,6 @@ function ImportJSON(url, query, parseOptions) { return ImportJSONAdvanced(url, null, query, parseOptions, includeXPath_, defaultTransform_); } - /** * Imports a JSON feed via a POST request and returns the results to be inserted into a Google Spreadsheet. The JSON feed is * flattened to create a two-dimensional array. The first row contains the headers, with each column header indicating the path to @@ -105,27 +104,21 @@ function ImportJSON(url, query, parseOptions) { **/ function ImportJSONViaPost(url, payload, fetchOptions, query, parseOptions) { var postOptions = parseToObject_(fetchOptions); - if (postOptions["method"] == null) { postOptions["method"] = "POST"; } - if (postOptions["payload"] == null) { postOptions["payload"] = payload; } - if (postOptions["contentType"] == null) { postOptions["contentType"] = "application/x-www-form-urlencoded"; } - convertToBool_(postOptions, "validateHttpsCertificates"); convertToBool_(postOptions, "useIntranet"); convertToBool_(postOptions, "followRedirects"); convertToBool_(postOptions, "muteHttpExceptions"); - return ImportJSONAdvanced(url, postOptions, query, parseOptions, includeXPath_, defaultTransform_); } - /** * An advanced version of ImportJSON designed to be easily extended by a script. This version cannot be called from within a * spreadsheet. @@ -168,10 +161,8 @@ function ImportJSONViaPost(url, payload, fetchOptions, query, parseOptions) { function ImportJSONAdvanced(url, fetchOptions, query, parseOptions, includeFunc, transformFunc) { var jsondata = UrlFetchApp.fetch(url, fetchOptions); var object = JSON.parse(jsondata.getContentText()); - return parseJSONObject_(object, query, parseOptions, includeFunc, transformFunc); } - /** * Encodes the given value to use within a URL. * @@ -182,7 +173,6 @@ function ImportJSONAdvanced(url, fetchOptions, query, parseOptions, includeFunc, function URLEncode(value) { return encodeURIComponent(value.toString()); } - /** * Adds an oAuth service using the given name and the list of properties. * @@ -207,60 +197,47 @@ function URLEncode(value) { */ function AddOAuthService__(name, accessTokenUrl, requestTokenUrl, authorizationUrl, consumerKey, consumerSecret, method, paramLocation) { var oAuthConfig = UrlFetchApp.addOAuthService(name); - if (accessTokenUrl != null && accessTokenUrl.length > 0) { oAuthConfig.setAccessTokenUrl(accessTokenUrl); } - if (requestTokenUrl != null && requestTokenUrl.length > 0) { oAuthConfig.setRequestTokenUrl(requestTokenUrl); } - if (authorizationUrl != null && authorizationUrl.length > 0) { oAuthConfig.setAuthorizationUrl(authorizationUrl); } - if (consumerKey != null && consumerKey.length > 0) { oAuthConfig.setConsumerKey(consumerKey); } - if (consumerSecret != null && consumerSecret.length > 0) { oAuthConfig.setConsumerSecret(consumerSecret); } - if (method != null && method.length > 0) { oAuthConfig.setMethod(method); } - if (paramLocation != null && paramLocation.length > 0) { oAuthConfig.setParamLocation(paramLocation); } } - /** * Parses a JSON object and returns a two-dimensional array containing the data of that object. */ function parseJSONObject_(object, query, options, includeFunc, transformFunc) { var headers = new Array(); var data = new Array(); - if (query && !Array.isArray(query) && query.toString().indexOf(",") != -1) { query = query.toString().split(","); } - if (options) { options = options.toString().split(","); } - parseData_(headers, data, "", { rowIndex: 1 }, object, query, options, includeFunc); parseHeaders_(headers, data); transformData_(data, options, transformFunc); - return hasOption_(options, "noHeaders") ? (data.length > 1 ? data.slice(1) : new Array()) : data; } - /** * Parses the data contained within the given value and inserts it into the data two-dimensional array starting at the rowIndex. * If the data is to be inserted into a new column, a new header is added to the headers array. The value can be an object, @@ -280,12 +257,10 @@ function parseJSONObject_(object, query, options, includeFunc, transformFunc) { */ function parseData_(headers, data, path, state, value, query, options, includeFunc) { var dataInserted = false; - if (Array.isArray(value) && isObjectArray_(value)) { for (var i = 0; i < value.length; i++) { if (parseData_(headers, data, path, state, value[i], query, options, includeFunc)) { dataInserted = true; - if (data[state.rowIndex]) { state.rowIndex++; } @@ -302,36 +277,29 @@ function parseData_(headers, data, path, state, value, query, options, includeFu if (Array.isArray(value)) { value = value.join(); } - // Insert new row if one doesn't already exist if (!data[state.rowIndex]) { data[state.rowIndex] = new Array(); } - // Add a new header if one doesn't exist if (!headers[path] && headers[path] != 0) { headers[path] = Object.keys(headers).length; } - // Insert the data data[state.rowIndex][headers[path]] = value; dataInserted = true; } - return dataInserted; } - /** * Parses the headers array and inserts it into the first row of the data array. */ function parseHeaders_(headers, data) { data[0] = new Array(); - for (key in headers) { data[0][headers[key]] = key; } } - /** * Applies the transform function for each element in the data array, going through each column of each row. */ @@ -342,14 +310,12 @@ function transformData_(data, options, transformFunc) { } } } - /** * Returns true if the given test value is an object; false otherwise. */ function isObject_(test) { return Object.prototype.toString.call(test) === '[object Object]'; } - /** * Returns true if the given test value is an array containing at least one object; false otherwise. */ @@ -359,10 +325,8 @@ function isObjectArray_(test) { return true; } } - return false; } - /** * Returns true if the given query applies to the given path. */ @@ -378,17 +342,14 @@ function includeXPath_(query, path, options) { } else { return applyXPathRule_(query, path, options); } - return false; }; - /** * Returns true if the rule applies to the given path. */ function applyXPathRule_(rule, path, options) { return path.indexOf(rule) == 0; } - /** * By default, this function transforms the value at the given row & column so it looks more like a normal data import. Specifically: * @@ -413,45 +374,36 @@ function defaultTransform_(data, row, column, options) { data[row][column] = data[row - 1][column]; } } - if (!hasOption_(options, "rawHeaders") && row == 0) { if (column == 0 && data[row].length > 1) { removeCommonPrefixes_(data, row); } - data[row][column] = toTitleCase_(data[row][column].toString().replace(/[\/\_]/g, "")); } else if (hasOption_(options, "rawHeaders") && row == 0) { data[row][column] = data[row][column].toString().replace(/[\/\_]/g, ""); } - if (!hasOption_(options, "noTruncate") && data[row][column]) { data[row][column] = data[row][column].toString().substr(0, 256); } - if (hasOption_(options, "debugLocation")) { data[row][column] = "[" + row + "," + column + "]" + data[row][column]; } } - /** * If all the values in the given row share the same prefix, remove that prefix. */ function removeCommonPrefixes_(data, row) { var matchIndex = data[row][0].length; - for (var i = 1; i < data[row].length; i++) { matchIndex = findEqualityEndpoint_(data[row][i - 1], data[row][i], matchIndex); - if (matchIndex == 0) { return; } } - for (var i = 0; i < data[row].length; i++) { data[row][i] = data[row][i].substring(matchIndex, data[row][i].length); } } - /** * Locates the index where the two strings values stop being equal, stopping automatically at the stopAt index. */ @@ -459,19 +411,14 @@ function findEqualityEndpoint_(string1, string2, stopAt) { if (!string1 || !string2) { return -1; } - var maxEndpoint = Math.min(stopAt, string1.length, string2.length); - for (var i = 0; i < maxEndpoint; i++) { if (string1.charAt(i) != string2.charAt(i)) { return i; } } - return maxEndpoint; } - - /** * Converts the text to title case. */ @@ -479,33 +426,27 @@ function toTitleCase_(text) { if (text == null) { return null; } - return text.replace(/\w\S*/g, function(word) { return word.charAt(0).toUpperCase() + word.substr(1).toLowerCase(); }); } - /** * Returns true if the given set of options contains the given option. */ function hasOption_(options, option) { return options && options.indexOf(option) >= 0; } - /** * Parses the given string into an object, trimming any leading or trailing spaces from the keys. */ function parseToObject_(text) { var map = new Object(); var entries = (text != null && text.trim().length > 0) ? text.toString().split(",") : new Array(); - for (var i = 0; i < entries.length; i++) { addToMap_(map, entries[i]); } - return map; } - /** * Parses the given entry and adds it to the given map, trimming any leading or trailing spaces from the key. */ @@ -513,17 +454,14 @@ function addToMap_(map, entry) { var equalsIndex = entry.indexOf("="); var key = (equalsIndex != -1) ? entry.substring(0, equalsIndex) : entry; var value = (key.length + 1 < entry.length) ? entry.substring(key.length + 1) : ""; - map[key.trim()] = value; } - /** * Returns the given value as a boolean. */ function toBool_(value) { return value == null ? false : (value.toString().toLowerCase() == "true" ? true : false); } - /** * Converts the value for the given key in the given map to a bool. */ diff --git a/gs/lib/GetLastUpdated.gs b/gs/last-updated.gs similarity index 100% rename from gs/lib/GetLastUpdated.gs rename to gs/last-updated.gs diff --git a/gs/lib/EncodeUrl.gs b/gs/lib/EncodeUrl.gs deleted file mode 100644 index 039cb94f6..000000000 --- a/gs/lib/EncodeUrl.gs +++ /dev/null @@ -1,10 +0,0 @@ -function EncodeUrl(url) { - if (url instanceof Array) { - for (i in url) { - url[i] = EncodeUrl(url[i]); - } - return url; - } else { - return encodeURIComponent(url); - } -} \ No newline at end of file diff --git a/gs/lib/GenerateHtmlAddLink.gs b/gs/lib/GenerateHtmlAddLink.gs deleted file mode 100644 index 17bf04a87..000000000 --- a/gs/lib/GenerateHtmlAddLink.gs +++ /dev/null @@ -1,15 +0,0 @@ -function GenerateHtmlAddLink(url, listName) { - if (url instanceof Array) { - for (i in url) { - url[i] = GenerateHtmlAddLink(url[i], listName[i]); - } - return url; - } else { - if (url && url != "#N/A") { - var html = "
Add"; - return html; - } else { - return ""; - } - } -} \ No newline at end of file diff --git a/gs/lib/GenerateHtmlAddLinkCombo.gs b/gs/lib/GenerateHtmlAddLinkCombo.gs deleted file mode 100644 index 590874537..000000000 --- a/gs/lib/GenerateHtmlAddLinkCombo.gs +++ /dev/null @@ -1,21 +0,0 @@ -function GenerateHtmlAddLinkCombo(url, listName, masterLists) { - if (url instanceof Array) { - for (i in url) { - url[i] = GenerateHtmlAddLinkCombo(url[i], listName[i], masterLists[i]); - } - return url; - } else { - if (!listName) { - masterLists.split(/\s*,\s*/).forEach(function(masterListsSplit) { - listName += masterListsSplit + " + "; - }); - listName = listName.slice(0, -3) - } - if (url && url != "#N/A") { - var html = "Add"; - return html; - } else { - return ""; - } - } -} \ No newline at end of file diff --git a/gs/lib/GenerateHtmlChangelogLink.gs b/gs/lib/GenerateHtmlChangelogLink.gs deleted file mode 100644 index dbc2a617f..000000000 --- a/gs/lib/GenerateHtmlChangelogLink.gs +++ /dev/null @@ -1,15 +0,0 @@ -function GenerateHtmlChangelogLink(url, listName) { - if (url instanceof Array) { - for (i in url) { - url[i] = GenerateHtmlChangelogLink(url[i], listName[i]); - } - return url; - } else { - if (url && url != "#N/A") { - var html = "Log"; - return html; - } else { - return ""; - } - } -} \ No newline at end of file diff --git a/gs/lib/GenerateHtmlDonateLink.gs b/gs/lib/GenerateHtmlDonateLink.gs deleted file mode 100644 index 2e45a8377..000000000 --- a/gs/lib/GenerateHtmlDonateLink.gs +++ /dev/null @@ -1,15 +0,0 @@ -function GenerateHtmlDonateLink(url, listName) { - if (url instanceof Array) { - for (i in url) { - url[i] = GenerateHtmlDonateLink(url[i], listName[i]); - } - return url; - } else { - if (url && url != "#N/A") { - var html = "Donate"; - return html; - } else { - return ""; - } - } -} \ No newline at end of file diff --git a/gs/lib/GenerateHtmlEmailLink.gs b/gs/lib/GenerateHtmlEmailLink.gs deleted file mode 100644 index 054ae746f..000000000 --- a/gs/lib/GenerateHtmlEmailLink.gs +++ /dev/null @@ -1,15 +0,0 @@ -function GenerateHtmlEmailLink(url, listName) { - if (url instanceof Array) { - for (i in url) { - url[i] = GenerateHtmlEmailLink(url[i], listName[i]); - } - return url; - } else { - if (url && url != "#N/A") { - var html = "Email"; - return html; - } else { - return ""; - } - } -} \ No newline at end of file diff --git a/gs/lib/GenerateHtmlForksCombosLink.gs b/gs/lib/GenerateHtmlForksCombosLink.gs deleted file mode 100644 index 392c98d85..000000000 --- a/gs/lib/GenerateHtmlForksCombosLink.gs +++ /dev/null @@ -1,17 +0,0 @@ -function GenerateHtmlForksCombosLink(forkComboListName, filterListsPageSlug) { - if (forkComboListName instanceof Array) { - for (i in forkComboListName) { - forkComboListName[i] = GenerateHtmlForksCombosLink(forkComboListName[i], filterListsPageSlug[i]); - } - return forkComboListName; - } else { - // return null if no List Name provided - if (forkComboListName == null) { - return null; - // concatenate HTML link tag - } else { - var html = "Forum"; - return html; - } else { - return ""; - } - } -} \ No newline at end of file diff --git a/gs/lib/GenerateHtmlGuideLink.gs b/gs/lib/GenerateHtmlGuideLink.gs deleted file mode 100644 index 1d411b8c9..000000000 --- a/gs/lib/GenerateHtmlGuideLink.gs +++ /dev/null @@ -1,15 +0,0 @@ -function GenerateHtmlGuideLink(url, listName) { - if (url instanceof Array) { - for (i in url) { - url[i] = GenerateHtmlGuideLink(url[i], listName[i]); - } - return url; - } else { - if (url && url != "#N/A") { - var html = "Guide"; - return html; - } else { - return ""; - } - } -} \ No newline at end of file diff --git a/gs/lib/GenerateHtmlHomeLink.gs b/gs/lib/GenerateHtmlHomeLink.gs deleted file mode 100644 index bd9026827..000000000 --- a/gs/lib/GenerateHtmlHomeLink.gs +++ /dev/null @@ -1,15 +0,0 @@ -function GenerateHtmlHomeLink(url, listName) { - if (url instanceof Array) { - for (i in url) { - url[i] = GenerateHtmlHomeLink(url[i], listName[i]); - } - return url; - } else { - if (url && url != "#N/A") { - var html = "Home"; - return html; - } else { - return ""; - } - } -} \ No newline at end of file diff --git a/gs/lib/GenerateHtmlIssuesLink.gs b/gs/lib/GenerateHtmlIssuesLink.gs deleted file mode 100644 index 5ff420b67..000000000 --- a/gs/lib/GenerateHtmlIssuesLink.gs +++ /dev/null @@ -1,15 +0,0 @@ -function GenerateHtmlIssuesLink(url, listName) { - if (url instanceof Array) { - for (i in url) { - url[i] = GenerateHtmlIssuesLink(url[i], listName[i]); - } - return url; - } else { - if (url && url != "#N/A") { - var html = "Issues"; - return html; - } else { - return ""; - } - } -} \ No newline at end of file diff --git a/gs/lib/GenerateHtmlListName.gs b/gs/lib/GenerateHtmlListName.gs deleted file mode 100644 index 3bacc6733..000000000 --- a/gs/lib/GenerateHtmlListName.gs +++ /dev/null @@ -1,15 +0,0 @@ -function GenerateHtmlListName(listName) { - if (listName instanceof Array) { - for (i in listName) { - listName[i] = GenerateHtmlListName(listName[i]); - } - return listName; - } else { - if (listName) { - var html = "

" + listName + "

"; - return html; - } else { - return ""; - } - } -} \ No newline at end of file diff --git a/gs/lib/GenerateHtmlListNameCombo.gs b/gs/lib/GenerateHtmlListNameCombo.gs deleted file mode 100644 index e1a01f6fc..000000000 --- a/gs/lib/GenerateHtmlListNameCombo.gs +++ /dev/null @@ -1,24 +0,0 @@ -function GenerateHtmlListNameCombo(listName, masterLists) { - if (listName instanceof Array) { - for (i in listName) { - listName[i] = GenerateHtmlListNameCombo(listName[i], masterLists[i]); - } - return listName; - } else { - var masterListNames = ""; - masterLists.split(/\s*,\s*/).forEach(function(masterListsSplit) { - masterListNames += masterListsSplit + " + "; - }); - masterListNames = masterListNames.slice(0, -3) - if (listName) { - var html = "

" + listName + "


"; - html += masterListNames; - return html; - } else if (masterLists) { - var html = "

" + masterListNames + "

"; - return html; - } else { - return ""; - } - } -} \ No newline at end of file diff --git a/gs/lib/GenerateHtmlViewLink.gs b/gs/lib/GenerateHtmlViewLink.gs deleted file mode 100644 index cc6f59d39..000000000 --- a/gs/lib/GenerateHtmlViewLink.gs +++ /dev/null @@ -1,15 +0,0 @@ -function GenerateHtmlViewLink(url, listName) { - if (url instanceof Array) { - for (i in url) { - url[i] = GenerateHtmlViewLink(url[i], listName[i]); - } - return url; - } else { - if (url && url != "#N/A") { - var html = "View"; - return html; - } else { - return ""; - } - } -} \ No newline at end of file diff --git a/gs/lib/GenerateHtmlViewLinkCombo.gs b/gs/lib/GenerateHtmlViewLinkCombo.gs deleted file mode 100644 index dd4e0d5cd..000000000 --- a/gs/lib/GenerateHtmlViewLinkCombo.gs +++ /dev/null @@ -1,21 +0,0 @@ -function GenerateHtmlViewLinkCombo(url, listName, masterLists) { - if (url instanceof Array) { - for (i in url) { - url[i] = GenerateHtmlViewLinkCombo(url[i], listName[i], masterLists[i]); - } - return url; - } else { - if (!listName) { - masterLists.split(/\s*,\s*/).forEach(function(masterListsSplit) { - listName += masterListsSplit + " + "; - }); - listName = listName.slice(0, -3) - } - if (url && url != "#N/A") { - var html = "View"; - return html; - } else { - return ""; - } - } -} \ No newline at end of file diff --git a/gs/lib/TrimUrlSlug.gs b/gs/lib/TrimUrlSlug.gs deleted file mode 100644 index 21ae32fee..000000000 --- a/gs/lib/TrimUrlSlug.gs +++ /dev/null @@ -1,27 +0,0 @@ -function TrimUrlSlug(slug) { - if (slug instanceof Array) { - for (i in slug) { - slug[i] = TrimUrlSlug(slug[i]); - } - return slug; - } else { - if (slug) { - var charDict = [ - [" ", ""], - ["\"", ""], - [":", ""], - ["'", ""], - ["+", ""], - ["(", ""], - [")", ""], - [".", ""] - ]; - for (i = 0; i < charDict.length; ++i) { - slug = slug.split(charDict[i][0]).join(charDict[i][1]); - } - return slug; - } else { - return ""; - } - } -} \ No newline at end of file diff --git a/gs/type/Interface.gs b/gs/type/Interface.gs deleted file mode 100644 index 0ae6356cb..000000000 --- a/gs/type/Interface.gs +++ /dev/null @@ -1,71 +0,0 @@ -function EncodeUrl(url) { - return FilterLists.EncodeUrl(url); -} - -function TrimUrlSlug(slug) { - return FilterLists.TrimUrlSlug(slug); -} - -function GenerateHtmlViewLink(url, listName) { - return FilterLists.GenerateHtmlViewLink(url, listName); -} - -function GenerateHtmlViewLinkCombo(url, listName, masterLists) { - return FilterLists.GenerateHtmlViewLinkCombo(url, listName, masterLists); -} - -function GenerateHtmlAddLink(url, listName) { - return FilterLists.GenerateHtmlAddLink(url, listName); -} - -function GenerateHtmlAddLinkCombo(url, listName, masterLists) { - return FilterLists.GenerateHtmlAddLinkCombo(url, listName, masterLists); -} - -function GenerateHtmlHomeLink(url, listName) { - return FilterLists.GenerateHtmlHomeLink(url, listName); -} - -function GenerateHtmlGuideLink(url, listName) { - return FilterLists.GenerateHtmlGuideLink(url, listName); -} - -function GenerateHtmlForumLink(url, listName) { - return FilterLists.GenerateHtmlForumLink(url, listName); -} - -function GenerateHtmlIssuesLink(url, listName) { - return FilterLists.GenerateHtmlIssuesLink(url, listName); -} - -function GenerateHtmlEmailLink(url, listName) { - return FilterLists.GenerateHtmlEmailLink(url, listName); -} - -function GenerateHtmlForksCombosLink(forkComboListName) { - return FilterLists.GenerateHtmlForksCombosLink(forkComboListName); -} - -function GenerateHtmlChangelogLink(url, listName) { - return FilterLists.GenerateHtmlChangelogLink(url, listName); -} - -function GenerateHtmlDonateLink(url, listName) { - return FilterLists.GenerateHtmlDonateLink(url, listName); -} - -function GetLastUpdated(urlToCheck) { - return FilterLists.GetLastUpdated(urlToCheck); -} - -function GenerateHtmlListName(listName) { - return FilterLists.GenerateHtmlListName(listName); -} - -function GenerateHtmlListNameCombo(listName, masterLists) { - return FilterLists.GenerateHtmlListNameCombo(listName, masterLists); -} - -function ImportJson(url, query, parseOptions) { - return FilterLists.ImportJSON(url, query, parseOptions); -} \ No newline at end of file diff --git a/gs/type/RefreshData.gs b/gs/type/RefreshData.gs deleted file mode 100644 index b4a68f0e3..000000000 --- a/gs/type/RefreshData.gs +++ /dev/null @@ -1,555 +0,0 @@ -var typeSheetPrefix = { - "FilterLists Global": "Global", - "FilterLists Regional": "Regional", - "FilterLists Forked": "Forked", - "FilterLists Combo": "Combo", - "FilterLists Stale": "Stale" -}; - -var typeGitHubUrl = { - "FilterLists Global": "https://raw.githubusercontent.com/collinbarrett/FilterLists/master/json-data/global.json", - "FilterLists Regional": "https://raw.githubusercontent.com/collinbarrett/FilterLists/master/json-data/regional.json", - "FilterLists Forked": "https://raw.githubusercontent.com/collinbarrett/FilterLists/master/json-data/forked.json", - "FilterLists Combo": "https://raw.githubusercontent.com/collinbarrett/FilterLists/master/json-data/combo.json", - "FilterLists Stale": "https://raw.githubusercontent.com/collinbarrett/FilterLists/master/json-data/stale.json" -}; - -var urlResponseWhitelist = ["https://www.jabcreations.com/web/adblock-subscription"] - -var ss = SpreadsheetApp.getActiveSpreadsheet(), - options = [{ - name: "Refresh Data", - functionName: "refreshJson" - }, { - name: "Refresh Scores", - functionName: "refreshScores" - }]; - -function onOpen() { - ss.addMenu("Refresh Data", options); - ss.addMenu("Refresh Scores", options); -} - -function refreshJson() { - var sheet = ss.getSheetByName(typeSheetPrefix[ss.getName()] + "Data"); - var data = ImportJson(typeGitHubUrl[ss.getName()], "", "noTruncate,rawHeaders,noInherit"); - for (i = 0; i < data.length; i++) { - for (j = 0; j < data[0].length; j++) { - if (data[i][j] == null) { - data[i][j] = ""; - } - } - } - sheet.clearContents(); - var range = sheet.getRange(1, 1, data.length, data[0].length); - range.setValues(data); - refreshParsed(); - refreshPublic(); -} - -function refreshParsed() { - var sheetName = typeSheetPrefix[ss.getName()] + "Parsed"; - var sheet = ss.getSheetByName(sheetName); - var viewColHeader = refreshViewUrl(sheet); - if (typeSheetPrefix[ss.getName()] != "Combo") { - refreshAddUrl(sheet, viewColHeader); - } else { - viewColHeader = refreshViewUrlCombo(sheet); - refreshAddUrlCombo(sheet, viewColHeader); - } - refreshHomeUrl(sheet, viewColHeader); - refreshGuideUrl(sheet, viewColHeader); - refreshForumUrl(sheet, viewColHeader); - refreshIssuesUrl(sheet, viewColHeader); - refreshEmailUrl(sheet, viewColHeader); - refreshChangelogUrl(sheet, viewColHeader); - refreshDonateUrl(sheet, viewColHeader); - refreshForksCombos(sheet); - refreshMaster(sheet); -} - -function refreshPublic() { - var sheetName = typeSheetPrefix[ss.getName()] + "Public"; - var sheet = ss.getSheetByName(sheetName); - if (typeSheetPrefix[ss.getName()] != "Combo") { - refreshRegionPublic(sheet); - refreshListPublic(sheet); - refreshDescriptionPublic(sheet); - refreshLinksPublic(sheet); - refreshForksCombosPublic(sheet); - refreshMasterPublic(sheet); - } else { - refreshListPublicCombo(sheet); - refreshLinksPublicCombo(sheet); - } -} - -function findColumnHeader(sheet, header) { - var headerRange = sheet.getRange("A1:1"); - var headerData = headerRange.getValues(); - for (i = 0; i < headerData[0].length; i++) { - if (headerData[0][i] == header) { - return String.fromCharCode(65 + i); - } - } - return null; -} - -function findUrlColumnHeaders(sheet) { - var headerRange = sheet.getRange("A1:1"); - var headerData = headerRange.getValues(); - var urlHeaders = new Array(); - for (i = 0; i < headerData[0].length; i++) { - if (headerData[0][i].indexOf("Url") != -1) { - urlHeaders.push(headerData[0][i]); - } - } - return urlHeaders; -} - -function refreshViewUrl(sheet) { - var colHeader = findColumnHeader(sheet, "viewUrl"); - if (colHeader) { - var rangeFull = sheet.getRange(colHeader + "2:" + colHeader); - rangeFull.clearContent(); - var rangeTop = sheet.getRange(colHeader + "2"); - rangeTop.setValue("=GenerateHtmlViewLink(INDIRECT(\"" + typeSheetPrefix[ss.getName()] + "Data!\"&SUBSTITUTE(ADDRESS(1,MATCH(" + colHeader + "1," + typeSheetPrefix[ss.getName()] + "Data!A1:1,0),4),\"1\",\"2\")&\":\"&SUBSTITUTE(ADDRESS(1,MATCH(" + colHeader + "1," + typeSheetPrefix[ss.getName()] + "Data!A1:1,0),4),\"1\",\"\"))," + typeSheetPrefix[ss.getName()] + "Data!" + colHeader + "2:" + colHeader + ")"); - var data = rangeFull.getDisplayValues(); - rangeFull.clearContent(); - rangeFull.setValues(data); - } - return colHeader; -} - -function refreshViewUrlCombo(sheet) { - var colHeader = findColumnHeader(sheet, "viewUrl"); - if (colHeader) { - var rangeFull = sheet.getRange(colHeader + "2:" + colHeader); - rangeFull.clearContent(); - var rangeTop = sheet.getRange(colHeader + "2"); - rangeTop.setValue("=GenerateHtmlViewLinkCombo(INDIRECT(\"" + typeSheetPrefix[ss.getName()] + "Data!\"&SUBSTITUTE(ADDRESS(1,MATCH(" + colHeader + "1," + typeSheetPrefix[ss.getName()] + "Data!A1:1,0),4),\"1\",\"2\")&\":\"&SUBSTITUTE(ADDRESS(1,MATCH(" + colHeader + "1," + typeSheetPrefix[ss.getName()] + "Data!A1:1,0),4),\"1\",\"\"))," + typeSheetPrefix[ss.getName()] + "Data!" + colHeader + "2:" + colHeader + ",INDIRECT(\"" + typeSheetPrefix[ss.getName()] + "Data!\"&SUBSTITUTE(ADDRESS(1,MATCH(\"master\"," + typeSheetPrefix[ss.getName()] + "Data!A1:1,0),4),\"1\",\"2\")&\":\"&SUBSTITUTE(ADDRESS(1,MATCH(\"master\"," + typeSheetPrefix[ss.getName()] + "Data!A1:1,0),4),\"1\",\"\")))"); - var data = rangeFull.getDisplayValues(); - rangeFull.clearContent(); - rangeFull.setValues(data); - } - return colHeader; -} - -function refreshAddUrl(sheet, viewColHeader) { - var colHeader = findColumnHeader(sheet, "addUrl"); - if (colHeader) { - var rangeFull = sheet.getRange(colHeader + "2:" + colHeader); - rangeFull.clearContent(); - var rangeTop = sheet.getRange(colHeader + "2"); - rangeTop.setValue("=GenerateHtmlAddLink(INDIRECT(\"" + typeSheetPrefix[ss.getName()] + "Data!\"&SUBSTITUTE(ADDRESS(1,MATCH(" + viewColHeader + "1," + typeSheetPrefix[ss.getName()] + "Data!A1:1,0),4),\"1\",\"2\")&\":\"&SUBSTITUTE(ADDRESS(1,MATCH(" + viewColHeader + "1," + typeSheetPrefix[ss.getName()] + "Data!A1:1,0),4),\"1\",\"\"))," + typeSheetPrefix[ss.getName()] + "Data!" + viewColHeader + "2:" + viewColHeader + ")"); - var data = rangeFull.getDisplayValues(); - rangeFull.clearContent(); - rangeFull.setValues(data); - } -} - -function refreshAddUrlCombo(sheet, viewColHeader) { - var colHeader = findColumnHeader(sheet, "addUrl"); - if (colHeader) { - var rangeFull = sheet.getRange(colHeader + "2:" + colHeader); - rangeFull.clearContent(); - var rangeTop = sheet.getRange(colHeader + "2"); - rangeTop.setValue("=GenerateHtmlAddLinkCombo(INDIRECT(\"" + typeSheetPrefix[ss.getName()] + "Data!\"&SUBSTITUTE(ADDRESS(1,MATCH(" + viewColHeader + "1," + typeSheetPrefix[ss.getName()] + "Data!A1:1,0),4),\"1\",\"2\")&\":\"&SUBSTITUTE(ADDRESS(1,MATCH(" + viewColHeader + "1," + typeSheetPrefix[ss.getName()] + "Data!A1:1,0),4),\"1\",\"\"))," + typeSheetPrefix[ss.getName()] + "Data!" + viewColHeader + "2:" + viewColHeader + ",INDIRECT(\"" + typeSheetPrefix[ss.getName()] + "Data!\"&SUBSTITUTE(ADDRESS(1,MATCH(\"master\"," + typeSheetPrefix[ss.getName()] + "Data!A1:1,0),4),\"1\",\"2\")&\":\"&SUBSTITUTE(ADDRESS(1,MATCH(\"master\"," + typeSheetPrefix[ss.getName()] + "Data!A1:1,0),4),\"1\",\"\")))"); - var data = rangeFull.getDisplayValues(); - rangeFull.clearContent(); - rangeFull.setValues(data); - } -} - -function refreshHomeUrl(sheet, viewColHeader) { - var colHeader = findColumnHeader(sheet, "homeUrl"); - if (colHeader) { - var rangeFull = sheet.getRange(colHeader + "2:" + colHeader); - rangeFull.clearContent(); - var rangeTop = sheet.getRange(colHeader + "2"); - rangeTop.setValue("=GenerateHtmlHomeLink(INDIRECT(\"" + typeSheetPrefix[ss.getName()] + "Data!\"&SUBSTITUTE(ADDRESS(1,MATCH(" + colHeader + "1," + typeSheetPrefix[ss.getName()] + "Data!A1:1,0),4),\"1\",\"2\")&\":\"&SUBSTITUTE(ADDRESS(1,MATCH(" + colHeader + "1," + typeSheetPrefix[ss.getName()] + "Data!A1:1,0),4),\"1\",\"\"))," + typeSheetPrefix[ss.getName()] + "Data!" + viewColHeader + "2:" + viewColHeader + ")"); - var data = rangeFull.getDisplayValues(); - rangeFull.clearContent(); - rangeFull.setValues(data); - } -} - -function refreshGuideUrl(sheet, viewColHeader) { - var colHeader = findColumnHeader(sheet, "guideUrl"); - if (colHeader) { - var rangeFull = sheet.getRange(colHeader + "2:" + colHeader); - rangeFull.clearContent(); - var rangeTop = sheet.getRange(colHeader + "2"); - rangeTop.setValue("=GenerateHtmlGuideLink(INDIRECT(\"" + typeSheetPrefix[ss.getName()] + "Data!\"&SUBSTITUTE(ADDRESS(1,MATCH(" + colHeader + "1," + typeSheetPrefix[ss.getName()] + "Data!A1:1,0),4),\"1\",\"2\")&\":\"&SUBSTITUTE(ADDRESS(1,MATCH(" + colHeader + "1," + typeSheetPrefix[ss.getName()] + "Data!A1:1,0),4),\"1\",\"\"))," + typeSheetPrefix[ss.getName()] + "Data!" + viewColHeader + "2:" + viewColHeader + ")"); - var data = rangeFull.getDisplayValues(); - rangeFull.clearContent(); - rangeFull.setValues(data); - } -} - -function refreshForumUrl(sheet, viewColHeader) { - var colHeader = findColumnHeader(sheet, "forumUrl"); - if (colHeader) { - var rangeFull = sheet.getRange(colHeader + "2:" + colHeader); - rangeFull.clearContent(); - var rangeTop = sheet.getRange(colHeader + "2"); - rangeTop.setValue("=GenerateHtmlForumLink(INDIRECT(\"" + typeSheetPrefix[ss.getName()] + "Data!\"&SUBSTITUTE(ADDRESS(1,MATCH(" + colHeader + "1," + typeSheetPrefix[ss.getName()] + "Data!A1:1,0),4),\"1\",\"2\")&\":\"&SUBSTITUTE(ADDRESS(1,MATCH(" + colHeader + "1," + typeSheetPrefix[ss.getName()] + "Data!A1:1,0),4),\"1\",\"\"))," + typeSheetPrefix[ss.getName()] + "Data!" + viewColHeader + "2:" + viewColHeader + ")"); - var data = rangeFull.getDisplayValues(); - rangeFull.clearContent(); - rangeFull.setValues(data); - } -} - -function refreshIssuesUrl(sheet, viewColHeader) { - var colHeader = findColumnHeader(sheet, "issuesUrl"); - if (colHeader) { - var rangeFull = sheet.getRange(colHeader + "2:" + colHeader); - rangeFull.clearContent(); - var rangeTop = sheet.getRange(colHeader + "2"); - rangeTop.setValue("=GenerateHtmlIssuesLink(INDIRECT(\"" + typeSheetPrefix[ss.getName()] + "Data!\"&SUBSTITUTE(ADDRESS(1,MATCH(" + colHeader + "1," + typeSheetPrefix[ss.getName()] + "Data!A1:1,0),4),\"1\",\"2\")&\":\"&SUBSTITUTE(ADDRESS(1,MATCH(" + colHeader + "1," + typeSheetPrefix[ss.getName()] + "Data!A1:1,0),4),\"1\",\"\"))," + typeSheetPrefix[ss.getName()] + "Data!" + viewColHeader + "2:" + viewColHeader + ")"); - var data = rangeFull.getDisplayValues(); - rangeFull.clearContent(); - rangeFull.setValues(data); - } -} - -function refreshEmailUrl(sheet, viewColHeader) { - var colHeader = findColumnHeader(sheet, "email"); - if (colHeader) { - var rangeFull = sheet.getRange(colHeader + "2:" + colHeader); - rangeFull.clearContent(); - var rangeTop = sheet.getRange(colHeader + "2"); - rangeTop.setValue("=GenerateHtmlEmailLink(INDIRECT(\"" + typeSheetPrefix[ss.getName()] + "Data!\"&SUBSTITUTE(ADDRESS(1,MATCH(" + colHeader + "1," + typeSheetPrefix[ss.getName()] + "Data!A1:1,0),4),\"1\",\"2\")&\":\"&SUBSTITUTE(ADDRESS(1,MATCH(" + colHeader + "1," + typeSheetPrefix[ss.getName()] + "Data!A1:1,0),4),\"1\",\"\"))," + typeSheetPrefix[ss.getName()] + "Data!" + viewColHeader + "2:" + viewColHeader + ")"); - var data = rangeFull.getDisplayValues(); - rangeFull.clearContent(); - rangeFull.setValues(data); - } -} - -function refreshChangelogUrl(sheet, viewColHeader) { - var colHeader = findColumnHeader(sheet, "changelogUrl"); - if (colHeader) { - var rangeFull = sheet.getRange(colHeader + "2:" + colHeader); - rangeFull.clearContent(); - var rangeTop = sheet.getRange(colHeader + "2"); - rangeTop.setValue("=GenerateHtmlChangelogLink(INDIRECT(\"" + typeSheetPrefix[ss.getName()] + "Data!\"&SUBSTITUTE(ADDRESS(1,MATCH(" + colHeader + "1," + typeSheetPrefix[ss.getName()] + "Data!A1:1,0),4),\"1\",\"2\")&\":\"&SUBSTITUTE(ADDRESS(1,MATCH(" + colHeader + "1," + typeSheetPrefix[ss.getName()] + "Data!A1:1,0),4),\"1\",\"\"))," + typeSheetPrefix[ss.getName()] + "Data!" + viewColHeader + "2:" + viewColHeader + ")"); - var data = rangeFull.getDisplayValues(); - rangeFull.clearContent(); - rangeFull.setValues(data); - } -} - -function refreshDonateUrl(sheet, viewColHeader) { - var colHeader = findColumnHeader(sheet, "donateUrl"); - if (colHeader) { - var rangeFull = sheet.getRange(colHeader + "2:" + colHeader); - rangeFull.clearContent(); - var rangeTop = sheet.getRange(colHeader + "2"); - rangeTop.setValue("=GenerateHtmlDonateLink(INDIRECT(\"" + typeSheetPrefix[ss.getName()] + "Data!\"&SUBSTITUTE(ADDRESS(1,MATCH(" + colHeader + "1," + typeSheetPrefix[ss.getName()] + "Data!A1:1,0),4),\"1\",\"2\")&\":\"&SUBSTITUTE(ADDRESS(1,MATCH(" + colHeader + "1," + typeSheetPrefix[ss.getName()] + "Data!A1:1,0),4),\"1\",\"\"))," + typeSheetPrefix[ss.getName()] + "Data!" + viewColHeader + "2:" + viewColHeader + ")"); - var data = rangeFull.getDisplayValues(); - rangeFull.clearContent(); - rangeFull.setValues(data); - } -} - -function refreshForksCombos(sheet) { - var colHeader = findColumnHeader(sheet, "forksCombos"); - if (colHeader) { - var rangeFull = sheet.getRange(colHeader + "2:" + colHeader); - rangeFull.clearContent(); - var rangeTop = sheet.getRange(colHeader + "2"); - rangeTop.setValue("=ARRAYFORMULA(SUBSTITUTE(INDIRECT(\"" + typeSheetPrefix[ss.getName()] + "Data!\"&SUBSTITUTE(ADDRESS(1,MATCH(\"forksCombos\"," + typeSheetPrefix[ss.getName()] + "Data!A1:1,0),4),\"1\",\"2\")&\":\"&SUBSTITUTE(ADDRESS(1,MATCH(\"forksCombos\"," + typeSheetPrefix[ss.getName()] + "Data!A1:1,0),4),\"1\",\"\")),\",\",\"
\"))"); - var data = rangeFull.getDisplayValues(); - rangeFull.clearContent(); - rangeFull.setValues(data); - } -} - -function refreshMaster(sheet) { - var colHeader = findColumnHeader(sheet, "master"); - if (colHeader) { - var rangeFull = sheet.getRange(colHeader + "2:" + colHeader); - rangeFull.clearContent(); - var rangeTop = sheet.getRange(colHeader + "2"); - rangeTop.setValue("=ARRAYFORMULA(SUBSTITUTE(INDIRECT(\"" + typeSheetPrefix[ss.getName()] + "Data!\"&SUBSTITUTE(ADDRESS(1,MATCH(\"master\"," + typeSheetPrefix[ss.getName()] + "Data!A1:1,0),4),\"1\",\"2\")&\":\"&SUBSTITUTE(ADDRESS(1,MATCH(\"master\"," + typeSheetPrefix[ss.getName()] + "Data!A1:1,0),4),\"1\",\"\")),\",\",\"
\"))"); - var data = rangeFull.getDisplayValues(); - rangeFull.clearContent(); - rangeFull.setValues(data); - } -} - -function refreshRegionPublic(sheet) { - var colHeader = findColumnHeader(sheet, "Region"); - if (colHeader) { - var rangeFull = sheet.getRange(colHeader + "2:" + colHeader); - rangeFull.clearContent(); - var rangeTop = sheet.getRange(colHeader + "2"); - rangeTop.setValue("=ARRAYFORMULA(INDIRECT(\"" + typeSheetPrefix[ss.getName()] + "Data!\"&SUBSTITUTE(ADDRESS(1,MATCH(\"lang\"," + typeSheetPrefix[ss.getName()] + "Data!A1:1,0),4),\"1\",\"2\")&\":\"&SUBSTITUTE(ADDRESS(1,MATCH(\"lang\"," + typeSheetPrefix[ss.getName()] + "Data!A1:1,0),4),\"1\",\"\")))"); - var data = rangeFull.getDisplayValues(); - rangeFull.clearContent(); - rangeFull.setValues(data); - } -} - -function refreshListPublic(sheet) { - var colHeader = findColumnHeader(sheet, "List"); - if (colHeader) { - var rangeFull = sheet.getRange(colHeader + "2:" + colHeader); - rangeFull.clearContent(); - var rangeTop = sheet.getRange(colHeader + "2"); - rangeTop.setValue("=GenerateHtmlListName(INDIRECT(\"" + typeSheetPrefix[ss.getName()] + "Data!\"&SUBSTITUTE(ADDRESS(1,MATCH(\"list\"," + typeSheetPrefix[ss.getName()] + "Data!A1:1,0),4),\"1\",\"2\")&\":\"&SUBSTITUTE(ADDRESS(1,MATCH(\"list\"," + typeSheetPrefix[ss.getName()] + "Data!A1:1,0),4),\"1\",\"\")))"); - var data = rangeFull.getDisplayValues(); - rangeFull.clearContent(); - rangeFull.setValues(data); - } -} - -function refreshListPublicCombo(sheet) { - var colHeader = findColumnHeader(sheet, "List"); - if (colHeader) { - var rangeFull = sheet.getRange(colHeader + "2:" + colHeader); - rangeFull.clearContent(); - var rangeTop = sheet.getRange(colHeader + "2"); - rangeTop.setValue("=GenerateHtmlListNameCombo(INDIRECT(\"" + typeSheetPrefix[ss.getName()] + "Data!\"&SUBSTITUTE(ADDRESS(1,MATCH(\"list\"," + typeSheetPrefix[ss.getName()] + "Data!A1:1,0),4),\"1\",\"2\")&\":\"&SUBSTITUTE(ADDRESS(1,MATCH(\"list\"," + typeSheetPrefix[ss.getName()] + "Data!A1:1,0),4),\"1\",\"\")),INDIRECT(\"" + typeSheetPrefix[ss.getName()] + "Data!\"&SUBSTITUTE(ADDRESS(1,MATCH(\"master\"," + typeSheetPrefix[ss.getName()] + "Data!A1:1,0),4),\"1\",\"2\")&\":\"&SUBSTITUTE(ADDRESS(1,MATCH(\"master\"," + typeSheetPrefix[ss.getName()] + "Data!A1:1,0),4),\"1\",\"\")))"); - var data = rangeFull.getDisplayValues(); - rangeFull.clearContent(); - rangeFull.setValues(data); - } -} - -function refreshDescriptionPublic(sheet) { - var dataSheetName = typeSheetPrefix[ss.getName()] + "Data"; - var dataSheet = ss.getSheetByName(dataSheetName); - var sourceUrlColHeader = findColumnHeader(dataSheet, "descrSourceUrl"); - var colHeader = findColumnHeader(sheet, "Description"); - if (colHeader) { - var rangeFull = sheet.getRange(colHeader + "2:" + colHeader); - rangeFull.clearContent(); - var rangeTop = sheet.getRange(colHeader + "2"); - if (sourceUrlColHeader) { - rangeTop.setValue("=ARRAYFORMULA(IF(ISBLANK(INDIRECT(\"" + typeSheetPrefix[ss.getName()] + "Data!\"&SUBSTITUTE(ADDRESS(1,MATCH(\"descrSourceUrl\"," + typeSheetPrefix[ss.getName()] + "Data!A1:1,0),4),\"1\",\"2\")&\":\"&SUBSTITUTE(ADDRESS(1,MATCH(\"descrSourceUrl\"," + typeSheetPrefix[ss.getName()] + "Data!A1:1,0),4),\"1\",\"\"))),,\"
\")&INDIRECT(\"" + typeSheetPrefix[ss.getName()] + "Data!\"&SUBSTITUTE(ADDRESS(1,MATCH(\"descr\"," + typeSheetPrefix[ss.getName()] + "Data!A1:1,0),4),\"1\",\"2\")&\":\"&SUBSTITUTE(ADDRESS(1,MATCH(\"descr\"," + typeSheetPrefix[ss.getName()] + "Data!A1:1,0),4),\"1\",\"\"))&IF(ISBLANK(INDIRECT(\"" + typeSheetPrefix[ss.getName()] + "Data!\"&SUBSTITUTE(ADDRESS(1,MATCH(\"descrSourceUrl\"," + typeSheetPrefix[ss.getName()] + "Data!A1:1,0),4),\"1\",\"2\")&\":\"&SUBSTITUTE(ADDRESS(1,MATCH(\"descrSourceUrl\"," + typeSheetPrefix[ss.getName()] + "Data!A1:1,0),4),\"1\",\"\"))),,\"
\"))"); - } else { - rangeTop.setValue("=ARRAYFORMULA(INDIRECT(\"" + typeSheetPrefix[ss.getName()] + "Data!\"&SUBSTITUTE(ADDRESS(1,MATCH(\"descr\"," + typeSheetPrefix[ss.getName()] + "Data!A1:1,0),4),\"1\",\"2\")&\":\"&SUBSTITUTE(ADDRESS(1,MATCH(\"descr\"," + typeSheetPrefix[ss.getName()] + "Data!A1:1,0),4),\"1\",\"\")))"); - } - var data = rangeFull.getDisplayValues(); - rangeFull.clearContent(); - rangeFull.setValues(data); - } -} - -function refreshLinksPublic(sheet) { - var colHeader = findColumnHeader(sheet, "Links"); - if (colHeader) { - var rangeFull = sheet.getRange(colHeader + "2:" + colHeader); - rangeFull.clearContent(); - var rangeTop = sheet.getRange(colHeader + "2"); - rangeTop.setValue("=ARRAYFORMULA(IF(" + typeSheetPrefix[ss.getName()] + "Parsed!A2:A=\"\",\"\",\"

\"&" + typeSheetPrefix[ss.getName()] + "Parsed!A2:A&" + typeSheetPrefix[ss.getName()] + "Parsed!B2:B&" + typeSheetPrefix[ss.getName()] + "Parsed!C2:C&" + typeSheetPrefix[ss.getName()] + "Parsed!D2:D&" + typeSheetPrefix[ss.getName()] + "Parsed!E2:E&" + typeSheetPrefix[ss.getName()] + "Parsed!F2:F&" + typeSheetPrefix[ss.getName()] + "Parsed!G2:G&" + typeSheetPrefix[ss.getName()] + "Parsed!H2:H&" + typeSheetPrefix[ss.getName()] + "Parsed!I2:I&\"

\"))"); - var data = rangeFull.getDisplayValues(); - rangeFull.clearContent(); - rangeFull.setValues(data); - } -} - -function refreshLinksPublicCombo(sheet) { - var colHeader = findColumnHeader(sheet, "Links"); - if (colHeader) { - var rangeFull = sheet.getRange(colHeader + "2:" + colHeader); - rangeFull.clearContent(); - var rangeTop = sheet.getRange(colHeader + "2"); - rangeTop.setValue("=ARRAYFORMULA(IF(" + typeSheetPrefix[ss.getName()] + "Parsed!A2:A=\"\",\"\",\"

\"&" + typeSheetPrefix[ss.getName()] + "Parsed!A2:A&" + typeSheetPrefix[ss.getName()] + "Parsed!B2:B&\"

\"))"); - var data = rangeFull.getDisplayValues(); - rangeFull.clearContent(); - rangeFull.setValues(data); - } -} - -function refreshForksCombosPublic(sheet) { - var colHeader = findColumnHeader(sheet, "Forks & Combos"); - if (colHeader) { - var rangeFull = sheet.getRange(colHeader + "2:" + colHeader); - rangeFull.clearContent(); - var rangeTop = sheet.getRange(colHeader + "2"); - rangeTop.setValue("=ARRAYFORMULA(INDIRECT(\"" + typeSheetPrefix[ss.getName()] + "Parsed!\"&SUBSTITUTE(ADDRESS(1,MATCH(\"forksCombos\"," + typeSheetPrefix[ss.getName()] + "Parsed!A1:1,0),4),\"1\",\"2\")&\":\"&SUBSTITUTE(ADDRESS(1,MATCH(\"forksCombos\"," + typeSheetPrefix[ss.getName()] + "Parsed!A1:1,0),4),\"1\",\"\")))"); - var data = rangeFull.getDisplayValues(); - rangeFull.clearContent(); - rangeFull.setValues(data); - } -} - -function refreshMasterPublic(sheet) { - var colHeader = findColumnHeader(sheet, "Master"); - if (colHeader) { - var rangeFull = sheet.getRange(colHeader + "2:" + colHeader); - rangeFull.clearContent(); - var rangeTop = sheet.getRange(colHeader + "2"); - rangeTop.setValue("=ARRAYFORMULA(INDIRECT(\"" + typeSheetPrefix[ss.getName()] + "Parsed!\"&SUBSTITUTE(ADDRESS(1,MATCH(\"master\"," + typeSheetPrefix[ss.getName()] + "Parsed!A1:1,0),4),\"1\",\"2\")&\":\"&SUBSTITUTE(ADDRESS(1,MATCH(\"master\"," + typeSheetPrefix[ss.getName()] + "Parsed!A1:1,0),4),\"1\",\"\")))"); - var data = rangeFull.getDisplayValues(); - rangeFull.clearContent(); - rangeFull.setValues(data); - } -} - -// refresh each type of url with a separate trigger due to Apps Script execution time limitations -function triggerRefreshHttpResponses1() { - refreshHttpResponses(1); -} - -function triggerRefreshHttpResponses2() { - refreshHttpResponses(2); -} - -function triggerRefreshHttpResponses3() { - refreshHttpResponses(3); -} - -function triggerRefreshHttpResponses4() { - refreshHttpResponses(4); -} - -function triggerRefreshHttpResponses5() { - refreshHttpResponses(5); -} - -function triggerRefreshHttpResponses6() { - refreshHttpResponses(6); -} - -function triggerRefreshHttpResponses7() { - refreshHttpResponses(7); -} - -function triggerRefreshHttpResponses8() { - refreshHttpResponses(8); -} - -function refreshHttpResponses(triggerNum) { - var sheetNameData = typeSheetPrefix[ss.getName()] + "Data"; - var sheetData = ss.getSheetByName(sheetNameData); - var sheetNameStatuses = typeSheetPrefix[ss.getName()] + "UrlStatuses"; - var sheetStatuses = ss.getSheetByName(sheetNameStatuses); - copyListNamesToStatuses(sheetData, sheetStatuses); - var listDataMax = getNumLists(sheetData) - var urlHeaders = findUrlColumnHeaders(sheetData); - if (urlHeaders.length >= triggerNum) { - var currentUrlType = urlHeaders[triggerNum - 1]; - var colHeaderData = findColumnHeader(sheetData, currentUrlType); - var colHeaderStatuses = findColumnHeader(sheetStatuses, currentUrlType); - var rangeData = sheetData.getRange(colHeaderData + "2:" + colHeaderData + (1 + listDataMax)); - var rangeStatuses = sheetStatuses.getRange(colHeaderStatuses + "2:" + colHeaderStatuses); - rangeStatuses.clearContent(); - for (i = 2; i <= rangeData.getNumRows() + 1; i++) { - var rangeStatus = sheetStatuses.getRange(colHeaderStatuses + i); - var url = rangeData.getCell(i - 1, 1).getValue(); - if (url) { - try { - var urlStatus = UrlFetchApp.fetch(url).getResponseCode(); - rangeStatus.setValue(urlStatus); - if (urlStatus != 200) { - if (!(urlResponseWhitelist.indexOf(url) > -1)) { - MailApp.sendEmail(noticeEmailAddress, urlStatus + ": " + url, urlStatus + ": " + url); - } - } - } catch (err) { - rangeStatus.setValue(err.message); - if (!(urlResponseWhitelist.indexOf(url) > -1)) { - MailApp.sendEmail(noticeEmailAddress, "Error: " + url, "Error: " + url + "
" + err.message); - } - } - } - } - } -} - -function copyListNamesToStatuses(sheetData, sheetStatuses) { - var sourceRange = sheetData.getRange("A1:A"); - var targetRange = sheetStatuses.getRange("A1:A"); - targetRange.clearContent(); - sourceRange.copyTo(targetRange); -} - -function getNumLists(sheetData) { - var listHeaderData = findColumnHeader(sheetData, "viewUrl"); - var listData = sheetData.getRange(listHeaderData + "2:" + listHeaderData); - for (i = 1; i <= listData.getNumRows(); i++) { - if (!(listData.getCell(i, 1).getValue())) { - return i - 1; - } - } -} - -function refreshScores() { - var sheetNameData = typeSheetPrefix[ss.getName()] + "Data"; - var sheetData = ss.getSheetByName(sheetNameData); - var sheetNameScores = typeSheetPrefix[ss.getName()] + "Scores"; - var sheetScores = ss.getSheetByName(sheetNameScores); - var sheetNamePublic = typeSheetPrefix[ss.getName()] + "Public"; - var sheetPublic = ss.getSheetByName(sheetNamePublic); - copyListNamesAndViewUrlsToScore(sheetData, sheetScores); - var colHeader = findColumnHeader(sheetScores, "sumUniqueDailyVisitorsLast30"); - if (colHeader) { - var rangeFull = sheetScores.getRange(colHeader + "2:" + colHeader); - rangeFull.clearContent(); - var numLists = getNumLists(sheetScores); - for (i = 2; i <= numLists + 1; i++) { - var cellCur = sheetScores.getRange(colHeader + i); - cellCur.setValue("=ImportJson(CONCATENATE(\"" + piwikUrl + "?module=API&method=Actions.getDownload&downloadUrl=\",EncodeUrl(B" + i + "),\"&idSite=3&date=last30&period=range&format=json&token_auth=" + piwikApiToken + "\"), \"/sum_daily_nb_uniq_visitors\", \"noHeaders\")"); - } - var data = rangeFull.getDisplayValues(); - rangeFull.clearContent(); - rangeFull.setValues(data); - for (i = 2; i <= numLists + 1; i++) { - var sumUniqueDailyVisitorsLast30 = sheetScores.getRange(colHeader + i).getValue(); - if (sumUniqueDailyVisitorsLast30 == "#REF!") { - var cellCur = sheetScores.getRange(colHeader + i); - cellCur.setValue("=ImportJson(CONCATENATE(\"" + piwikUrl + "?module=API&method=Actions.getOutlink&outlinkUrl=\",EncodeUrl(B" + i + "),\"&idSite=3&date=last30&period=range&format=json&token_auth=" + piwikApiToken + "\"), \"/sum_daily_nb_uniq_visitors\", \"noHeaders\")"); - } - } - var data = rangeFull.getDisplayValues(); - rangeFull.clearContent(); - rangeFull.setValues(data); - for (i = 2; i <= numLists + 1; i++) { - var sumUniqueDailyVisitorsLast30 = sheetScores.getRange(colHeader + i).getValue(); - if (sumUniqueDailyVisitorsLast30 == "#REF!") { - var cellCur = sheetScores.getRange(colHeader + i); - cellCur.setValue(0); - } - } - } - var colHeader = findColumnHeader(sheetScores, "score"); - var colHeaderVisitors = findColumnHeader(sheetScores, "sumUniqueDailyVisitorsLast30"); - if (colHeader) { - var rangeFull = sheetScores.getRange(colHeader + "2:" + colHeader); - rangeFull.clearContent(); - var numLists = getNumLists(sheetScores); - for (i = 2; i <= numLists + 1; i++) { - var cellCur = sheetScores.getRange(colHeader + i); - cellCur.setValue("=ROUND((100-0)/(MAX($" + colHeaderVisitors + "$2:$" + colHeaderVisitors + ")-MIN($" + colHeaderVisitors + "$2:$" + colHeaderVisitors + "))*($" + colHeaderVisitors + i + "-MAX($" + colHeaderVisitors + "$2:$" + colHeaderVisitors + "))+100)"); - } - var data = rangeFull.getDisplayValues(); - rangeFull.clearContent(); - rangeFull.setValues(data); - } - copyScoresToPublic(sheetScores, sheetPublic); -} - -function copyListNamesAndViewUrlsToScore(sheetData, sheetScores) { - var sourceRangeListNames = sheetData.getRange("A1:A"); - var targetRangeListNames = sheetScores.getRange("A1:A"); - targetRangeListNames.clearContent(); - sourceRangeListNames.copyTo(targetRangeListNames); - - var viewUrlColumn = findColumnHeader(sheetData, "viewUrl"); - var sourceRangeScores = sheetData.getRange(viewUrlColumn + "1:" + viewUrlColumn); - var targetRangeScores = sheetScores.getRange("B1:B"); - targetRangeScores.clearContent(); - sourceRangeScores.copyTo(targetRangeScores); -} - -function copyScoresToPublic(sheetScores, sheetPublic) { - var colHeaderSource = findColumnHeader(sheetScores, "score"); - var colHeaderTarget = findColumnHeader(sheetPublic, "FilScore"); - var sourceRangeListNames = sheetScores.getRange(colHeaderSource + "2:" + colHeaderSource); - var targetRangeListNames = sheetPublic.getRange(colHeaderTarget + "2:" + colHeaderTarget); - targetRangeListNames.clearContent(); - sourceRangeListNames.copyTo(targetRangeListNames); -} \ No newline at end of file diff --git a/gs/ui.gs b/gs/ui.gs new file mode 100644 index 000000000..ae087e9a5 --- /dev/null +++ b/gs/ui.gs @@ -0,0 +1,16 @@ +var ss = SpreadsheetApp.getActiveSpreadsheet(); +var sData = ss.getSheetByName("Data"); +var sFilScore = ss.getSheetByName("FilScore"); +var sHttpResponse = ss.getSheetByName("HttpResponse"); +var sParsed = ss.getSheetByName("Parsed"); +var sPublic = ss.getSheetByName("Public"); + +function onOpen() { + var ui = SpreadsheetApp.getUi(); + ui.createMenu('Refresh').addItem('Refresh All', 'refreshAll').addSeparator().addItem('Refresh Data', 'refreshData').addItem('Refresh FilScores', 'refreshFilScores').addToUi(); +} + +function refreshAll() { + refreshData(); + refreshFilScores(); +} \ No newline at end of file diff --git a/gs/utilities.gs b/gs/utilities.gs new file mode 100644 index 000000000..8340293a0 --- /dev/null +++ b/gs/utilities.gs @@ -0,0 +1,77 @@ +function fill2dJsonArrayWithNulls(array2d) { + for (i = 0; i < array2d.length; i++) { + for (j = 0; j < array2d[0].length; j++) { + if (array2d[i][j] == null) { + array2d[i][j] = ""; + } + } + } + return array2d; +} + +function getColumnIndex(sheet, columnHeader) { + var headerRange = sheet.getRange("A1:1"); + var headerData = headerRange.getValues(); + for (i = 0; i < headerData[0].length; i++) { + if (headerData[0][i] == columnHeader) { + return String.fromCharCode(65 + i); + } + } + return null; +} + +function getColumnIndicesWithHeaderSubstring(sheet, columnHeaderSubstring) { + var headerRange = sheet.getRange("A1:1"); + var headerData = headerRange.getValues(); + var columnIndices = new Array(); + for (i = 0; i < headerData[0].length; i++) { + if (headerData[0][i].indexOf(columnHeaderSubstring) != -1) { + columnIndices.push(headerData[0][i]); + } + } + return columnIndices; +} + +function encodeUrlArray(urlArray) { + if (urlArray instanceof Array) { + for (i in urlArray) { + urlArray[i] = encodeUrlArray(urlArray[i]); + } + return urlArray; + } else { + if (urlArray) { + return encodeURIComponent(urlArray); + } else { + return ""; + } + } +} + +function trimUrlSlugArray(slugArray) { + if (slugArray instanceof Array) { + for (i in slugArray) { + slugArray[i] = trimUrlSlugArray(slugArray[i]); + } + return slugArray; + } else { + if (slugArray) { + var trimCharacters = [" ", "\"", ":", "'", "+", "(", ")", "."]; + for (i = 0; i < trimCharacters.length; i++) { + slugArray = slugArray.split(trimCharacters[i]).join(""); + } + return slugArray; + } else { + return ""; + } + } +} + +function getNumLists(sheetData) { + var listHeaderData = getColumnIndex(sData, "viewUrl"); + var listData = sheetData.getRange(listHeaderData + "2:" + listHeaderData); + for (i = 1; i <= listData.getNumRows(); i++) { + if (!(listData.getCell(i, 1).getValue())) { + return i - 1; + } + } +} \ No newline at end of file