Skip to content

Instantly share code, notes, and snippets.

@Akiyamka
Last active November 23, 2018 21:34
Show Gist options
  • Save Akiyamka/cb58b704ee1d162a67ac7a08e5027b19 to your computer and use it in GitHub Desktop.
Save Akiyamka/cb58b704ee1d162a67ac7a08e5027b19 to your computer and use it in GitHub Desktop.
fetchGoogleSheet

Just run it in console

npx https://gist.github.com/Akiyamka/cb58b704ee1d162a67ac7a08e5027b19
const https = require('https');
const { StringDecoder } = require('string_decoder');
/**
* Simple Node.js script to turn a specific page on a Google Sheet
* into a JSON object for the main purpose of HTML Templating.
*
* @author jonobr1 / http://jonobr1.com
* @author akiyamka / [email protected]
*
*/
class GoogleSheetJSON {
constructor({ id, format, page }) {
this.sheetId = id ;
this.format = format || 'tsv';
this.page = page || 0;
this.data = null;
}
get url() {
return `https://docs.google.com/spreadsheets/d/${
this.sheetId
}/export?format=${
this.format
}&id=${
this.sheetId
}&gid=${
this.page
}`;
}
_fixType(value) {
if (typeof value !== 'string') return value;
if (value.toLowerCase() === 'true') return true;
if (value.toLowerCase() === 'false') return false;
const maybeNumber = Number(value);
if (!Number.isNaN(maybeNumber)) return maybeNumber;
return value;
}
load() {
return new Promise(res => {
https.get(this.url, resp => {
const decoder = new StringDecoder('utf8');
let buff = '';
resp
.on('data', data => {
buff += decoder.write(data);
})
.on('end', () => {
const json = [];
const rows = buff.split(/\r\n/i);
for (let i = 0; i < rows.length; i++) {
json.push(rows[i].split(/\t/i));
}
this.data = json;
res(json);
});
});
});
}
convert() {
const model = this.data[0];
return this.data.slice(1).map(d => {
const obj = {};
model.forEach((field, i) => obj[field] = this._fixType(d[i]))
return obj
});
}
}
module.exports = GoogleSheetJSON;
#!/usr/bin/env node
const GoogleSheetJSON = require('./googleSheetJSON');
const jsonfile = require('jsonfile');
const mkdirp = require('mkdirp');
async function dawnloadData() {
const questionsSheet = new GoogleSheetJSON({ id: '1bBruVm9vsktmfsz_OxcBUdPyq110nCHykCaCa5K627M', page: 0 });
const questions = questionsSheet.load().then(res => questionsSheet.convert(), err => console.error(err));
const tasksSheet = new GoogleSheetJSON({ id: '1bBruVm9vsktmfsz_OxcBUdPyq110nCHykCaCa5K627M', page: 1379254750 });
const tasks = tasksSheet.load().then(res => tasksSheet.convert(), err => console.error(err));
const invariantsSheet = new GoogleSheetJSON({ id: '1bBruVm9vsktmfsz_OxcBUdPyq110nCHykCaCa5K627M', page: 254257973 });
const invariants = invariantsSheet.load().then(res => invariantsSheet.convert(), err => console.error(err));
const reducedInvariants = await invariants;
return await {
questions: await questions,
tasks: await tasks,
invariants: reducedInvariants.reduce((acc, inv) => {
Object.entries(inv).forEach(([key, val]) => {
if (!Array.isArray(acc[key])) acc[key] = [acc[key]];
acc[key].push(val);
});
return acc;
}),
}
}
function saveData(data, dir) {
mkdirp(dir, () => {
jsonfile.writeFile(`${dir}/data.json`, data, { spaces: 2 }, err => {
if (err) console.error(err);
});
});
}
dawnloadData().then(data => saveData(data, './src/'));
{
"name": "fetch-google-sheet",
"version": "0.0.1",
"bin": "./index.js",
"dependencies": {
"jsonfile": "^5.0.0",
"mkdirp": "^0.5.1"
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment