mirror of
https://github.com/collinbarrett/FilterLists.git
synced 2026-03-11 09:04:27 +00:00
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:
parent
e8b97a5cab
commit
71b6f3accc
27 changed files with 466 additions and 958 deletions
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
|
||||
gs/Private.gs
|
||||
85
gs/data.gs
Normal file
85
gs/data.gs
Normal 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
75
gs/filscore.gs
Normal 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
134
gs/html-links.gs
Normal 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
77
gs/http-response.gs
Normal 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);
|
||||
}
|
||||
|
|
@ -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.
|
||||
*/
|
||||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
@ -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 "";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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 "";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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 "";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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 "";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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 "";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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 "";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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 "";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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 "";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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 "";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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 "";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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 "";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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 "";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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 "";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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 "";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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);
|
||||
}
|
||||
|
|
@ -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
16
gs/ui.gs
Normal 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
77
gs/utilities.gs
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Reference in a new issue