UNPKG

@ngblaylock/extract-gsheet

Version:

Quickly get public Google Sheet data as JSON for use on any website.

2 lines (1 loc) 1.62 kB
var extractGSheet=function(){"use strict";const e=function(e){let t=e.innerHTML;return t.includes('<use href="#checked')?"true":t.includes('<use href="#unchecked')?"false":""},t=function(t){let r=[],a=[];return t.querySelectorAll("#sheets-viewport table").forEach((e=>{e.textContent&&r.push(e)})),r.forEach(((r,n)=>{let o=[],l=t.querySelectorAll("#sheet-menu li")[n];a.push({tab:l?l.textContent:"",keys:[],data:[]}),r.querySelectorAll("tr").forEach((e=>{(e.textContent||e.innerHTML.match(/<use href="#(un)?checked/g))&&o.push(e)})),o[0].querySelectorAll("td").forEach((e=>{e.textContent&&a[n].keys.push({name:e.textContent,key:e.textContent.replace(/\W+/gi,"_").replace(/^\d/,"_$&").toLowerCase()})}));for(let t=0;t<o.length;t++)0!=t&&(a[n].data.push({}),o[t].querySelectorAll("td").forEach(((r,o)=>{if(a[n].keys[o]){let l=a[n].keys[o].key;if(l){let o=r.textContent.trim();o||(o=e(r)),o&&"true"===o.toLowerCase()?o=!0:o&&"false"===o.toLowerCase()&&(o=!1),o&&"string"==typeof o&&!isNaN(o)&&(o=parseFloat(o)),a[n].data[t-1][l]=o}}})))})),a.forEach((e=>{e.data=e.data.filter((e=>!Object.values(e).every((e=>""===e))))})),a.forEach((e=>{let t=!1;e.data.forEach(((r,a)=>{r.id||(t=!0,e.data[a]={id:a+1,...r})})),t&&e.keys.unshift({name:"ID",key:"id"})})),a};return async function(e){try{if(e.startsWith("https://docs.google.com/spreadsheets")){let a=await async function(e){let t=await fetch(e);return await t.text()}(e).then((e=>e));var r=(new DOMParser).parseFromString(a,"text/html");return{title:r.querySelector("#doc-title .name").textContent,tables:t(r)}}throw"Invalid Public Google Sheet"}catch(e){throw new Error(e)}}}();