From 6ecfeb602bf04918e66cc3761367c106b3b60c2c Mon Sep 17 00:00:00 2001 From: Francisco Presencia Date: Tue, 20 Oct 2020 11:32:28 +0900 Subject: [PATCH] Added google sheet example Description Added to readme Fixed typo --- demos/README.md | 1 + demos/google-sheet/README.md | 71 +++++++++++++++++++++++++++++++++ demos/google-sheet/index.js | 17 ++++++++ demos/google-sheet/package.json | 13 ++++++ 4 files changed, 102 insertions(+) create mode 100644 demos/google-sheet/README.md create mode 100644 demos/google-sheet/index.js create mode 100644 demos/google-sheet/package.json diff --git a/demos/README.md b/demos/README.md index 9625a7b..802aad1 100644 --- a/demos/README.md +++ b/demos/README.md @@ -43,6 +43,7 @@ can be installed with Bash on Windows or with `cygwin`. - [`electron application`](electron/) - [`nw.js application`](nwjs/) - [`Chrome / Chromium extensions`](chrome/) +- [`Download a Google Sheet locally`](google-sheet/) - [`Adobe ExtendScript`](extendscript/) - [`Headless Browsers`](headless/) - [`canvas-datagrid`](datagrid/) diff --git a/demos/google-sheet/README.md b/demos/google-sheet/README.md new file mode 100644 index 0000000..0da6d72 --- /dev/null +++ b/demos/google-sheet/README.md @@ -0,0 +1,71 @@ +# Google Sheet Demo + +This demo is using [`drive-db`](https://github.com/franciscop/drive-db) to fetch a public Google Sheet and then `xlsx` to save the data locally as `test.xlsx`. + +It uses modern Javascript; `import/export`, `async/away`, etc. To run this you need Node.js 12 or newer, and you will notice we added `"type": "module"` to the `package.json`. + +Here is the full code: + +```js +import xlsx from "xlsx"; +import drive from "drive-db"; + +(async () => { + const data = await drive("1fvz34wY6phWDJsuIneqvOoZRPfo6CfJyPg1BYgHt59k"); + + /* Create a new workbook */ + const workbook = xlsx.utils.book_new(); + + /* make worksheet */ + const worksheet = xlsx.utils.json_to_sheet(data); + + /* Add the worksheet to the workbook */ + xlsx.utils.book_append_sheet(workbook, worksheet); + + xlsx.writeFile(workbook, "test.xlsx"); +})(); +``` + +Let's go over the different parts: + +```js +import xlsx from "xlsx"; +import drive from "drive-db"; +``` + +This imports both `xlsx` and `drive-db` libraries. While these are written in commonjs, Javascript Modules can usually import the commonjs modules with no problem. + +```js +(async () => { + // ... +})(); +``` + +This is what is called an [Immediately Invoked Function Expression](https://flaviocopes.com/javascript-iife/). These are normally used to either create a new execution context, or in this case to allow to run async code easier. + +```js +const data = await drive("1fvz34wY6phWDJsuIneqvOoZRPfo6CfJyPg1BYgHt59k"); +``` + +Using `drive-db`, fetch the data for the given spreadsheet id. In this case it's [this Google Sheet document](https://docs.google.com/spreadsheets/d/1fvz34wY6phWDJsuIneqvOoZRPfo6CfJyPg1BYgHt59k/edit), and since we don't specify the sheet it's the default one. + +```js +const workbook = xlsx.utils.book_new(); +const worksheet = xlsx.utils.json_to_sheet(data); +``` + +We need to create a workbook with a worksheet inside. The worksheet is created from the previously fetched data. `drive-db` exports the data in the same format that `xlsx`'s `.json_to_sheet()` method expects, so it's a straightforward operation. + +```js +xlsx.utils.book_append_sheet(workbook, worksheet); +``` + +The worksheet needs to be inside the workbook, so we use the operation `.book_append_sheet()` to make it so. + +```js +xlsx.writeFile(workbook, "test.xlsx"); +``` + +Finally we save the workbook into a XLSX file in out filesystem. With this, now it can be opened by any spreadsheet program that we have installed. + +[![Analytics](https://ga-beacon.appspot.com/UA-36810333-1/SheetJS/js-xlsx?pixel)](https://github.com/SheetJS/js-xlsx) diff --git a/demos/google-sheet/index.js b/demos/google-sheet/index.js new file mode 100644 index 0000000..2e657b1 --- /dev/null +++ b/demos/google-sheet/index.js @@ -0,0 +1,17 @@ +import xlsx from "xlsx"; +import drive from "drive-db"; + +(async () => { + const data = await drive("1fvz34wY6phWDJsuIneqvOoZRPfo6CfJyPg1BYgHt59k"); + + /* Create a new workbook */ + const workbook = xlsx.utils.book_new(); + + /* make worksheet */ + const worksheet = xlsx.utils.json_to_sheet(data); + + /* Add the worksheet to the workbook */ + xlsx.utils.book_append_sheet(workbook, worksheet); + + xlsx.writeFile(workbook, "test.xlsx"); +})(); diff --git a/demos/google-sheet/package.json b/demos/google-sheet/package.json new file mode 100644 index 0000000..d8e7d34 --- /dev/null +++ b/demos/google-sheet/package.json @@ -0,0 +1,13 @@ +{ + "name": "google-sheet", + "version": "1.0.0", + "description": " This demo is using 'drive-db' to fetch a public Google Sheet and then `xlsx` to save the data locally as test.xlsx", + "main": "index.js", + "type": "module", + "scripts": { + "start": "node ." + }, + "keywords": [], + "author": "Francisco Presencia (https://francisco.io/)", + "license": "MIT" +}