Skip to content

Instantly share code, notes, and snippets.

@alexdesousa

alexdesousa/Code.gs

Last active Feb 21, 2020
Embed
What would you like to do?
Gathers stats from your DEV articles.
/**
* Gathers statistics from your dev.to articles.
*
* Needs the following colunms:
* - Day
* - Date
* - Time
* - Title
* - Views
* - Reactions
* - Comments
* - Organization (optional).
* - Repository (optional).
* - Stars (before) (optional): If there's a number won't be overwritten.
* - Stars (current) (optional).
*
* Just set the following variables:
*
* - API_KEY: Should be your DEV API key.
* - SHEET_NAME: Should be the name of your Google Sheet sheet.
* - AMOUNT: How many articles it should fetch.
*
* The function DEV_STATS() should be the one to be called.
*/
const API_KEY = "[API KEY]";
const SHEET_NAME = "[SHEET NAME]"
const AMOUNT = 500;
/**
* Formats datetime as day of the week.
* @params timestamp Datetime in ISO8601 format.
*
* @returns Day of the week.
*/
function formatDay(timestamp) {
return (new Date(timestamp).toLocaleString('en-us', { weekday: 'long' }));
}
/**
* Formats datetime as date.
* @params timestamp Datetime in ISO8601 format.
*
* @returns YYYY-MM-DD
*/
function formatDate(timestamp) {
return timestamp.substring(0, 10);
}
/**
* Formats datetime as time.
* @params timestamp Datetime in ISO8601 format.
*
* @returns HH:mm
*/
function formatTime(timestamp) {
return timestamp.substring(11, 16);
}
/**
* Requests stats.
*
* @returns JSON DEV stats.
*/
function getDevStats() {
const API_ENDPOINT = "https://dev.to/api/articles/me/published?per_page=" + AMOUNT;
const HEADERS = {
"headers": {
"access-control-allow-headers": "Content-Type",
"api-key": API_KEY
}
};
try {
const response = UrlFetchApp.fetch(API_ENDPOINT, HEADERS);
return JSON.parse(response.getContentText());
} catch (err) {
throw new Error(err);
}
}
/**
* Fills DEV data.
* @params sheet Sheet.
* @params row Row number.
* @params data JSON DEV data.
*/
function fillDevData(sheet, row, data) {
const day = formatDay(data.published_timestamp);
const date = formatDate(data.published_timestamp);
const time = formatTime(data.published_timestamp);
sheet.getRange(row, 1).setValue(day);
sheet.getRange(row, 2).setValue(date);
sheet.getRange(row, 3).setValue(time);
sheet.getRange(row, 4).setValue(data.title);
sheet.getRange(row, 5).setValue(data.page_views_count);
sheet.getRange(row, 6).setValue(data.positive_reactions_count);
sheet.getRange(row, 7).setValue(data.comments_count);
}
/**
* Gets Github stats of a repository.
* @params organization Organization.
* @params repository Repository.
*
* @return JSON Github stats.
*/
function getGithubStats(sheet, organization, repository) {
const API_ENDPOINT = "https://api.github.com/repos/" + organization + "/" + repository;
const HEADERS = {
"headers": {
"Accept": "application/vnd.github.v3+json"
}
};
try {
const response = UrlFetchApp.fetch(API_ENDPOINT, HEADERS);
return JSON.parse(response.getContentText());
} catch (err) {
throw new Error(err);
}
}
/**
* Fills Github stats.
* @params sheet Sheet.
* @params row Row number.
*/
function fillGithubData(sheet, row) {
const organization = sheet.getRange(row, 8).getValue();
const repository = sheet.getRange(row, 9).getValue();
if (organization === "" || repository === "")
return;
const github = getGithubStats(sheet, organization, repository);
const stars = github.stargazers_count;
if (sheet.getRange(row, 10).getValue() === "")
sheet.getRange(row, 10).setValue(stars);
sheet.getRange(row, 11).setValue(stars);
}
/**
* Fills sheet.
*/
function DEV_STATS() {
let dev = getDevStats();
let sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(SHEET_NAME);
for(var index = dev.length - 1; index >= 0; --index) {
let row = dev.length - index + 1;
let data = dev[index];
fillDevData(sheet, row, data);
fillGithubData(sheet, row);
}
}
@alexdesousa

This comment has been minimized.

Copy link
Owner Author

@alexdesousa alexdesousa commented Feb 21, 2020

This Gist was inspired by this article

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.