major refactor

still a work in progress, but moving towards using a single Google
Sheet and a single-page display of lists on the front end.
This commit is contained in:
Collin M. Barrett 2017-02-05 17:50:03 -06:00
parent e8b97a5cab
commit 71b6f3accc
27 changed files with 466 additions and 958 deletions

2
.gitignore vendored Normal file
View file

@ -0,0 +1,2 @@
gs/Private.gs

85
gs/data.gs Normal file
View file

@ -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\",\"\")),\",\",\"<br>\"))");
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\",\"\"))),,\"<blockquote cite=\"\"\")&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\",\"\"))&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\",\"\"))),,\"</blockquote>\"))");
} 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=\"\",\"\",\"<p>\"&Parsed!A2:A&Parsed!B2:B&Parsed!C2:C&Parsed!D2:D&Parsed!E2:E&Parsed!F2:F&Parsed!G2:G&\"</p>\"))");
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);
}
}

75
gs/filscore.gs Normal file
View file

@ -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);
}

134
gs/html-links.gs Normal file
View file

@ -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 "<a href=\"" + url + "\" title=\"Preview " + listName + " in your browser.\" class=\"button piwik_download\">View</a>";
} 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 "<a href=\"abp:subscribe?location=" + url + "&title=" + listName + "\" title=\"Subscribe to " + listName + " in your content blocker.\" class=\"button piwik_download\">Add</a>";
} 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 "<a href=\"" + url + "\" title=\"" + listName + " Home Page\" class=\"button\">Home</a>";
} 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 "<a href=\"" + url + "\" title=\"" + listName + " Forum\" class=\"button\">Forum</a>";
} 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 "<a href=\"" + url + "\" title=\"" + listName + " GitHub Issues\" class=\"button\">Issues</a>";
} 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 "<a href=\"mailto:" + url + "\" title=\"Contribute to " + listName + " via email.\" class=\"button\">Email</a>";
} 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 "<a href=\"" + url + "\" title=\"Donate to support the maintainers of " + listName + ".\" class=\"button\">Donate</a>";
} 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 "<a href=\"https://filterlists.com" + filterListsPageSlug + "#" + trimUrlSlugArray(forkComboListName) + "\"";
}
}
}
function createHtmlListNameArray(listName) {
if (listName instanceof Array) {
for (i in listName) {
listName[i] = createHtmlListNameArray(listName[i]);
}
return listName;
} else {
if (listName) {
return "<h3 id=\"" + trimUrlSlugArray(listName) + "\">" + listName + "</h3>";
} else {
return "";
}
}
}

77
gs/http-response.gs Normal file
View file

@ -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 + "<br>" + err.message);
}
}
}
}
}
}
function copyListNamesToStatuses(sheetData, sheetStatuses) {
var sourceRange = sheetData.getRange("A1:A");
var targetRange = sheetStatuses.getRange("A1:A");
targetRange.clearContent();
sourceRange.copyTo(targetRange);
}

View file

@ -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.
*/

View file

@ -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);
}
}

View file

@ -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 = "<a href=\"abp:subscribe?location=" + url + "&title=" + listName + "\" title=\"Subscribe to " + listName + " in your content blocker.\" class=\"button piwik_download\">Add</a>";
return html;
} else {
return "";
}
}
}

View file

@ -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 = "<a href=\"abp:subscribe?location=" + url + "&title=" + listName + "\" title=\"Subscribe to " + listName + " in your content blocker.\" class=\"button piwik_download\">Add</a>";
return html;
} else {
return "";
}
}
}

View file

@ -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 = "<a href=\"" + url + "\" title=\"" + listName + " Changelog\" class=\"button\">Log</a>";
return html;
} else {
return "";
}
}
}

View file

@ -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 = "<a href=\"" + url + "\" title=\"Donate to support the maintainers of " + listName + ".\" class=\"button\">Donate</a>";
return html;
} else {
return "";
}
}
}

View file

@ -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 = "<a href=\"mailto:" + url + "\" title=\"Contribute to " + listName + " via email.\" class=\"button\">Email</a>";
return html;
} else {
return "";
}
}
}

View file

@ -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 = "<a href=\"https://beta.filterlists.com" + filterListsPageSlug + "#" + TrimUrlSlug(forkComboListName) + "\"";
return html;
}
}
}

View file

@ -1,15 +0,0 @@
function GenerateHtmlForumLink(url, listName) {
if (url instanceof Array) {
for (i in url) {
url[i] = GenerateHtmlForumLink(url[i], listName[i]);
}
return url;
} else {
if (url && url != "#N/A") {
var html = "<a href=\"" + url + "\" title=\"" + listName + " Forum\" class=\"button\">Forum</a>";
return html;
} else {
return "";
}
}
}

View file

@ -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 = "<a href=\"" + url + "\" title=\"" + listName + " Guide\" class=\"button\">Guide</a>";
return html;
} else {
return "";
}
}
}

View file

@ -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 = "<a href=\"" + url + "\" title=\"" + listName + " Home Page\" class=\"button\">Home</a>";
return html;
} else {
return "";
}
}
}

View file

@ -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 = "<a href=\"" + url + "\" title=\"" + listName + " GitHub Issues\" class=\"button\">Issues</a>";
return html;
} else {
return "";
}
}
}

View file

@ -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 = "<h3 id=\"" + TrimUrlSlug(listName) + "\">" + listName + "</h3>";
return html;
} else {
return "";
}
}
}

View file

@ -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 = "<h3 id=\"" + TrimUrlSlug(listName) + "\">" + listName + "</h3><br>";
html += masterListNames;
return html;
} else if (masterLists) {
var html = "<h3 id=\"" + TrimUrlSlug(masterListNames) + "\">" + masterListNames + "</h3>";
return html;
} else {
return "";
}
}
}

View file

@ -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 = "<a href=\"" + url + "\" title=\"Preview " + listName + " in your browser.\" class=\"button piwik_download\">View</a>";
return html;
} else {
return "";
}
}
}

View file

@ -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 = "<a href=\"" + url + "\" title=\"Preview " + listName + " in your browser.\" class=\"button piwik_download\">View</a>";
return html;
} else {
return "";
}
}
}

View file

@ -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 "";
}
}
}

View file

@ -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);
}

View file

@ -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\",\"\")),\",\",\"<br>\"))");
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\",\"\")),\",\",\"<br>\"))");
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\",\"\"))),,\"<blockquote cite=\"\"\")&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\",\"\"))&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\",\"\"))),,\"</blockquote>\"))");
} 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=\"\",\"\",\"<p>\"&" + 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&\"</p>\"))");
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=\"\",\"\",\"<p>\"&" + typeSheetPrefix[ss.getName()] + "Parsed!A2:A&" + typeSheetPrefix[ss.getName()] + "Parsed!B2:B&\"</p>\"))");
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 + "<br>" + 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);
}

16
gs/ui.gs Normal file
View file

@ -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();
}

77
gs/utilities.gs Normal file
View file

@ -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;
}
}
}