From 55ce74bf8c9284b337520f153f8f6e37cd712e9c Mon Sep 17 00:00:00 2001 From: SheetJS Date: Sat, 8 Jun 2024 23:40:45 -0400 Subject: [PATCH] Google Sheets demo refresh --- README.md | 6 + docz/docs/03-demos/02-frontend/08-dojo.md | 6 +- .../02-frontend/19-bundler/20-parcel.md | 10 +- docz/docs/03-demos/30-cloud/21-gsheet.md | 883 ++++++++++-------- docz/docs/03-demos/32-extensions/12-maple.md | 7 +- docz/static/gsheet/SheetJS1.png | Bin 0 -> 13068 bytes docz/static/gsheet/SheetJS2.png | Bin 0 -> 26035 bytes docz/static/gsheet/creds.png | Bin 0 -> 56513 bytes docz/static/gsheet/dump.mjs | 39 + docz/static/gsheet/init.mjs | 87 ++ docz/static/gsheet/load.mjs | 87 ++ docz/static/gsheet/notification.png | Bin 0 -> 37801 bytes docz/static/gsheet/raw.mjs | 38 + docz/static/gsheet/selector.png | Bin 0 -> 50646 bytes tests/bundler-parcel.sh | 93 ++ 15 files changed, 836 insertions(+), 420 deletions(-) create mode 100644 docz/static/gsheet/SheetJS1.png create mode 100644 docz/static/gsheet/SheetJS2.png create mode 100644 docz/static/gsheet/creds.png create mode 100644 docz/static/gsheet/dump.mjs create mode 100644 docz/static/gsheet/init.mjs create mode 100644 docz/static/gsheet/load.mjs create mode 100644 docz/static/gsheet/notification.png create mode 100644 docz/static/gsheet/raw.mjs create mode 100644 docz/static/gsheet/selector.png create mode 100755 tests/bundler-parcel.sh diff --git a/README.md b/README.md index 50d7bda..1f72139 100644 --- a/README.md +++ b/README.md @@ -81,6 +81,12 @@ do not work in MDX v2. Instead, string literals and concatenation must be used: {"Foo" + current + ""} ``` +**Tables** + +MDX inconsistently requires different indentation levels for `TD` / `TH`, `TR`, +`THEAD` / `TBODY` / `TFOOT`, and `TABLE` tags. Unconventional indentation is +intentional. + diff --git a/docz/docs/03-demos/02-frontend/08-dojo.md b/docz/docs/03-demos/02-frontend/08-dojo.md index 434f7b1..66da80d 100644 --- a/docz/docs/03-demos/02-frontend/08-dojo.md +++ b/docz/docs/03-demos/02-frontend/08-dojo.md @@ -72,7 +72,11 @@ The script https://docs.sheetjs.com/dojo/dojo.js was fetched from the official :::note Tested Deployments -The demos were last tested on 2023-12-04. +This demo was tested in the following environments: + +| Platform | Date | +|:-------------|:-----------| +| Chromium 125 | 2024-06-08 | Demos exclusively using Dojo Core were tested using Dojo Toolkit `1.17.3`. diff --git a/docz/docs/03-demos/02-frontend/19-bundler/20-parcel.md b/docz/docs/03-demos/02-frontend/19-bundler/20-parcel.md index 62529dd..f764f89 100644 --- a/docz/docs/03-demos/02-frontend/19-bundler/20-parcel.md +++ b/docz/docs/03-demos/02-frontend/19-bundler/20-parcel.md @@ -34,8 +34,8 @@ This demo was tested in the following environments: | Version | Date | |:---------|:-----------| -| `2.10.3` | 2023-12-04 | -| `1.12.3` | 2023-12-04 | +| `2.12.0` | 2024-06-08 | +| `1.12.4` | 2024-06-08 | ::: @@ -135,7 +135,7 @@ main `index.html` page should load the `index.js` script:

SheetJS export demo

- + ``` @@ -208,7 +208,7 @@ yarn add https://cdn.sheetjs.com/xlsx-${current}/xlsx-${current}.tgz`} 3) Run the ParcelJS development server: ```bash -npx -y parcel@2.10.3 index.html +npx -y parcel index.html ``` The process will print a URL: @@ -231,7 +231,7 @@ a web browser and click the "Click to Export!" button to generate a file. 6) Build the production site: ```bash -npx -y parcel@2.10.0 build index.html +npx -y parcel build index.html ``` The production site will be stored in the `dist` folder diff --git a/docz/docs/03-demos/30-cloud/21-gsheet.md b/docz/docs/03-demos/30-cloud/21-gsheet.md index eb2800e..08c16e3 100644 --- a/docz/docs/03-demos/30-cloud/21-gsheet.md +++ b/docz/docs/03-demos/30-cloud/21-gsheet.md @@ -33,8 +33,8 @@ libraries and written to a Google Sheets Document - "Exporting data": Data in Google Sheets will be pulled into arrays of objects. A workbook will be assembled and exported to Excel Binary workbooks (XLSB). -- "Exporting files": SheetJS libraries will read XLSX and ODS files exported by -Google Sheets and generate CSV rows from every worksheet. +- "Exporting files": SheetJS libraries will read XLSX files exported by Google +Sheets and generate CSV rows from every worksheet. :::danger pass @@ -53,10 +53,8 @@ referenced APIs will be available in the future. ## Integration Details -This demo uses the following NodeJS modules: - -- `google-auth-library`[^1] simplifies authentication with Google APIs -- `node-google-spreadsheet`[^2] interacts with Google Sheets v4 API +This demo uses the Sheets v4 and Drive v3 APIs through the official `googleapis` +connector module. :::info Initial Setup @@ -65,6 +63,31 @@ for an account. The [Complete Example](#complete-example) covers the process. ::: +### Document Duality + +Each Google Sheets document is identified with a unique ID. This ID can be found +from the Google Sheets edit URL. + +The edit URL starts with `https://docs.google.com/spreadsheets/d/` and includes +`/edit`. The ID is the string of characters between the slashes. For example: + +``` +https://docs.google.com/spreadsheets/d/a_long_string_of_characters/edit#gid=0 + |^^^^^^^^^^^^^^^^^^^^^^^^^^^|--- ID +``` + +The same ID is used in Google Drive operations. + +The following operations are covered in this demo: + +| Operation | API | +|:------------------------------|:-------| +| Create Google Sheets Document | Sheets | +| Add and Remove worksheets | Sheets | +| Modify data in worksheets | Sheets | +| Share Sheets with other users | Drive | +| Generate raw file exports | Drive | + ### Authentication It is strongly recommended to use a service account for Google API operations. @@ -75,52 +98,44 @@ The generated JSON key file includes `client_email` and `private_key` fields. These fields can be used in JWT authentication: ```js title="JWT Authentication using a JSON key file" -import { JWT } from 'google-auth-library' -import { GoogleSpreadsheet } from 'google-spreadsheet'; +import { google } from "googleapis"; // adjust the path to the actual key file. // highlight-next-line import creds from './sheetjs-test-726272627262.json' assert { type: "json" }; -const jwt = new JWT({ +/* connect to google services */ +const jwt = new google.auth.JWT({ email: creds.client_email, key: creds.private_key, scopes: [ - 'https://www.googleapis.com/auth/spreadsheets', - 'https://www.googleapis.com/auth/drive.file', + 'https://www.googleapis.com/auth/spreadsheets', // Google Sheets + 'https://www.googleapis.com/auth/drive.file', // Google Drive ] }); ``` -### Connecting to Documents +### Connecting to Services -To connect to existing documents, the document ID must be specified. This ID can -be found from the edit URL. +The `google` named export includes special methods to connect to various APIs. -The edit URL starts with `https://docs.google.com/spreadsheets/d/` and includes -`/edit`. The ID is the string of characters between the slashes. For example: +#### Google Sheets -``` -https://docs.google.com/spreadsheets/d/a_long_string_of_characters/edit#gid=0 - |^^^^^^^^^^^^^^^^^^^^^^^^^^^|--- ID +```js +const sheets = google.sheets({ version: "v4", auth: jwt }); ``` -The `GoogleSpreadsheet` constructor accepts a document ID and auth object: +`google.sheets` takes an options argument that includes API version number and +authentication details. -```js title="Connect to a document" -const doc = new GoogleSpreadsheet('DOCUMENT_ID', jwt); -await doc.loadInfo(); +#### Google Drive + +```js +const drive = google.drive({ version: "v3", auth: jwt }); ``` -### Creating New Documents - -The `createNewSpreadsheetDocument` makes a request to create a new document. It -is strongly recommended to create a blank sheet. - -```js title="Create a new document with blank sheet" -const doc = await GoogleSpreadsheet.createNewSpreadsheetDocument(jwt, { title: 'Document Title' }); -const newSheet = await doc.addSheet({ title: 'Sheet Title' }); -``` +`google.drive` takes an options argument that includes API version number and +authentication details. ### Array of Arrays @@ -130,8 +145,8 @@ row arrays, and each row array includes data. SheetJS provides methods for working with Arrays of Arrays: -- `aoa_to_sheet`[^3] creates SheetJS worksheet objects from arrays of arrays -- `sheet_to_json`[^4] can generate arrays of arrays from SheetJS worksheets +- `aoa_to_sheet`[^1] creates SheetJS worksheet objects from arrays of arrays +- `sheet_to_json`[^2] can generate arrays of arrays from SheetJS worksheets ## Export Document Data @@ -140,205 +155,274 @@ not natively support the XLSB format. SheetJS fills the gap. ### Convert a Single Sheet -The idea is to extract the raw data from the Google Sheet headers and combine -with the raw data rows to produce a large array of arrays. +`sheets.spreadsheets.values.get` returns data from an existing Google Sheet. The +method expects a range. Passing the sheet name as the title will pull all rows. + +If successful, the response object will have a `data` property. It will be an +object with a `values` property. The values will be represented as an Array of +Arrays of values. This array of arrays can be converted to a SheetJS sheet: ```js -async function wb_append_sheet(sheet, name, wb) { - /* get the header and data rows */ - await sheet.loadHeaderRow(); - const header = sheet.headerValues; - const rows = await sheet.getRows(); +async function gsheet_ws_to_sheetjs_ws(id, sheet_name) { + /* get values */ + const res = await sheets.spreadsheets.values.get({ + spreadsheetId: id, + range: `'${sheet_name}'` + }); + const values = res.data.values; - /* construct the array of arrays */ - const aoa = [header].concat(rows.map(r => r._rawData)); - - /* generate a SheetJS Worksheet */ - const ws = XLSX.utils.aoa_to_sheet(aoa); - - /* add to workbook */ - XLSX.utils.book_append_sheet(wb, ws, name); + /* create SheetJS worksheet */ + const ws = XLSX.utils.aoa_to_sheet(values); + return ws; } ``` ### Convert a Workbook -`doc.sheetsByIndex` is an array of worksheets in the Google Sheet Document. By -looping across the sheets, the entire workbook can be written: +`sheets.spreadsheets.get` returns metadata about the Google Sheets document. In +the result object, the `data` property is an object which has a `sheets` +property. The value of the `sheets` property is an array of sheet objects. + +The SheetJS `book_new` [^3] method creates blank SheetJS workbook objects. The +`book_append_sheet` [^4] method adds SheetJS worksheet objects to the workbook. + +By looping across the sheets, the entire workbook can be converted: ```js -async function doc_to_wb(doc) { +async function gsheet_doc_to_sheetjs_wb(doc) { /* Create a new workbook object */ const wb = XLSX.utils.book_new(); - /* Loop across the Document sheets */ - for(let i = 0; i < doc.sheetsByIndex.length; ++i) { - const sheet = doc.sheetsByIndex[i]; - /* Get the worksheet name */ - const name = sheet.title; + /* Get metadata */ + const wsheet = await sheets.spreadsheets.get({spreadsheetId: id}); - /* Add sheet to workbook */ - await add_sheet_to_wb(sheet, name, wb); + /* Loop across the Document sheets */ + for(let sheet of wsheet.data.sheets) { + /* Get the worksheet name */ + const name = sheet.properties.title; + + /* Convert Google Docs sheet to SheetJS worksheet */ + const ws = await gsheet_ws_to_sheetjs_ws(id, name); + + /* Append worksheet to workbook */ + XLSX.utils.book_append_sheet(wb, ws, name); } return wb; } ``` +This method returns a SheetJS workbook object that can be exported with the +`writeFile` and `write` methods.[^5] + ## Update Document Data The goal is to import data from a NUMBERS file to Google Sheets. Google Sheets does not natively support the NUMBERS format. SheetJS fills the gap. -### Clear the Document +### Create New Document -Google Sheets does not allow users to delete every worksheet. This function -deletes every worksheet after the first, then clears the first worksheet: +`sheets.spreadsheets.create` creates a new Google Sheets document. It can accept +a document title. It will generate a new workbook with a blank "Sheet1" sheet. +The response includes the document ID for use in subsequent operations: -```js -/* clear google sheets doc */ -async function doc_clear(doc) { - /* delete all sheets after the first sheet */ - const old_sheets = doc.sheetsByIndex; - for(let i = 1; i < old_sheets.length; ++i) await old_sheets[i].delete(); - - /* clear first worksheet */ - old_sheets[0].clear(); -} -``` - -### Update First Sheet - -There are two steps: "update worksheet name" and "update worksheet data": - -#### Update Sheet Name - -The worksheet name is assigned by using the `updateProperties` method. The -desired sheet name is the name of the first worksheet from the file. - -```js -async function doc_update_first_sheet_name(doc, wb) { - /* get first worksheet name */ - const wsname = wb.SheetNames[0]; - - /* get first gsheet */ - const sheet = doc.sheetsByIndex[0]; - - /* update worksheet name */ - await sheet.updateProperties({title: wsname}); -} -``` - -#### Update Sheet Data - -`sheet.addRows` reads an Array of Arrays of values. `XLSX.utils.sheet_to_json` -can generate this exact shape with the option `header: 1`. Unfortunately -Google Sheets requires at least one "Header Row". This can be implemented by -converting the entire worksheet to an Array of Arrays and setting the header -row to the first row of the result: - -```js -async function doc_update_first_sheet_data(doc, wb) { - /* get first worksheet */ - const ws = wb.Sheets[wb.SheetNames[0]]; - /* generate array of arrays from the first worksheet */ - const aoa = XLSX.utils.sheet_to_json(ws, {header: 1}); - - /* get first gsheet */ - const sheet = doc.sheetsByIndex[0]; - /* set document header row to first row of the AOA */ - await sheet.setHeaderRow(aoa[0]); - - /* add the remaining rows */ - await sheet.addRows(aoa.slice(1)); -} -``` - -### Append Remaining Worksheets - -Each name in the SheetJS Workbook `SheetNames` array maps to a worksheet. The -list of names not including the first sheet is `wb.SheetNames.slice(1)`. - -There are two steps for each sheet: "create new sheet" and "load data". - -Due to JavaScript `async` idiosyncrasies, a plain `for` loop must be used: - -```js -async function doc_append_remaining_sheets(doc, wb) { - const names = wb.SheetNames.slice(1); - - /* loop across names */ - for(let i = 0; i < names.length; ++i) { - /* wb.SheetNames[i] is the sheet name */ - const name = wb.SheetNames[i]; - /* wb.Sheets[name] is the worksheet object */ - const ws = wb.Sheets[name]; - - /* create new google sheet */ - const sheet = await doc_add_new_sheet(doc, name); - /* load sheet with data */ - await sheet_load_from_ws(sheet, ws); +```js title="Create a new document with blank sheet" +const res = await sheets.spreadsheets.create({ + requestBody: { + properties: { + /* Document Title */ + title: "SheetJS Test" + } } +}); +const id = res.data.spreadsheetId; +``` + +:::caution pass + +When using a service worker, the main account does not have access to the new +document by default. The document has to be shared with the main account using +the Drive API: + +```js title="Sharing the generated sheet with the main account" +await drive.permissions.create({ + fileId: id, // this ID was returned in the response to the create request + fields: "id", + requestBody: { + type: "user", + role: "writer", + emailAddress: "YOUR_ADDRESS@gmail.com" // main address + } +}); +``` + +::: + +### Delete Non-Initial Sheets + +Google Sheets does not allow users to delete every worksheet. + +The recommended approach involves deleting every worksheet after the first. + +The delete operation requires a unique identifier for a sheet within the Google +Sheets document. These IDs are found in the `sheets.spreadsheets.get` response. + +The following snippet performs one bulk operation using `batchUpdate`: + +```js title="Deleting non-initial sheets" +/* get existing sheets */ +const wsheet = await sheets.spreadsheets.get({spreadsheetId: id}); + +/* remove all sheets after the first */ +if(wsheet.data.sheets.length > 1) await sheets.spreadsheets.batchUpdate({ + spreadsheetId: id, + requestBody: { requests: wsheet.data.sheets.slice(1).map(s => ({ + deleteSheet: { + sheetId: s.properties.sheetId + } + }))} +}); +``` + +### Rename First Sheet + +The first sheet must be renamed so that the append operations do not collide +with the legacy name. Since most SheetJS-supported file formats and most +spreadsheet applications limit worksheet name lengths to 32 characters, it is +safe to set a name that exceeds 33 characters. + +The `updateSheetProperties` update method can rename individual sheets: + +```js title="Rename legacy first sheet" +/* rename first worksheet to avoid collisions */ +await sheets.spreadsheets.batchUpdate({ + spreadsheetId: id, + requestBody: { requests: [{ + updateSheetProperties: { + fields: "title", + properties: { + sheetId: wsheet.data.sheets[0].properties.sheetId, + // the new title is 34 characters, to be exact + title: "thistitleisatleast33characterslong" + } + } + }]} +}); +``` + +### Append Worksheets + +:::note pass + +The [`read` and `readFile` methods](/docs/api/parse-options) generate SheetJS +workbook objects from existing worksheet files. + +::: + +Starting from a SheetJS workbook, the `SheetNames` property[^6] is an array of +worksheet names and the `Sheets` property is an object that maps sheet names to +worksheet objects. + +Looping over the worksheet names, there are two steps to appending a sheet: + +1) "Append a blank worksheet": The `addSheet` request, submitted through the +`sheets.spreadsheets.batchUpdate` method, accepts a new title and creates a new +worksheet. The new worksheet will be added at the end. + +2) "Write data to the new sheet": The SheetJS `sheet_to_json` method with the +option `header: 1`[^7] will generate an array of arrays of data. This structure +is compatible with the `sheets.spreadsheets.values.update` operation. + +The following snippet pushes all worksheets from a SheetJS workbook into a +Google Sheets document: + +```js title="Push data from a SheetJS workbook to a Google Sheets Document" +/* add sheets from file */ +for(let name of wb.SheetNames) { + /* (1) Create a new Google Sheets sheet */ + await sheets.spreadsheets.batchUpdate({ + spreadsheetId: id, + requestBody: { requests: [ + /* add new sheet */ + { addSheet: { properties: { title: name } } }, + ] } + }); + + /* (2) Push data */ + const aoa = XLSX.utils.sheet_to_json(wb.Sheets[name], {header:1}); + await sheets.spreadsheets.values.update({ + spreadsheetId: id, + range: `'${name}'!A1`, + valueInputOption: "USER_ENTERED", + resource: { values: aoa } + }); } ``` -#### Add a New Worksheet +### Delete Initial Sheet -`doc.addSheet` accepts a properties object that includes the worksheet name: +After adding new worksheets, the final step involves removing the initial sheet. -```js -async function doc_add_new_sheet(doc, name) { - return await doc.addSheet({title: name}); -} -``` +The initial sheet ID can be pulled from the worksheet metadata fetched when the +[non-initial sheets were removed](#delete-non-initial-sheets): -This creates a new worksheet, sets the tab name, and returns a reference to the -created worksheet. - -#### Update Worksheet Data - -```js -async function sheet_load_from_ws(sheet, ws) { - /* generate array of arrays from the first worksheet */ - const aoa = XLSX.utils.sheet_to_json(ws, {header: 1}); - - /* set document header row to first row of the AOA */ - await sheet.setHeaderRow(aoa[0]); - - /* add the remaining rows */ - await sheet.addRows(aoa.slice(1)); -} +```js title="Deleting the Initial sheet" +/* remove first sheet */ +await sheets.spreadsheets.batchUpdate({ + spreadsheetId: id, + requestBody: { requests: [ + /* remove old first sheet */ + { deleteSheet: { sheetId: wsheet.data.sheets[0].properties.sheetId } } + ] } +}); ``` ## Raw File Exports -In the web interface, Google Sheets can export documents to `XLSX` or `ODS`. The -NodeJS library includes similar methods to perform the download[^5]: +In the web interface, Google Sheets can export documents to `XLSX` or `ODS`. -| Format | Google Sheets Description | Method | -|:-------|:--------------------------|:-----------------| -| XLSX | Microsoft Excel (.xlsx) | `downloadAsXLSX` | -| ODS | OpenDocument (.ods) | `downloadAsODS` | +Raw file exports are exposed through the `files.export` method in the Drive API: -The functions resolve to `Buffer` data. The `Buffer` objects can be parsed using -the SheetJS `read`[^6] method: +```js title="Export XLSX workbook" +const drive = google.drive({ version: "v3", auth: jwt }); + +/* Request XLSX export */ +const file = await drive.files.export({ + /* XLSX MIME type */ + mimeType: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", + fileId: id +}); +``` + +The response object has a `data` field whose value will be a `Blob` object. Data +can be pulled into an `ArrayBuffer` and passed to the SheetJS `read`[^8] method: ```js -/* download XLSX */ -const ab = await doc.downloadAsXLSX(); +/* Obtain ArrayBuffer */ +const ab = await file.data.arrayBuffer(); -/* parse */ +/* Parse */ const wb = XLSX.read(buf); ``` -At this point `wb` is a SheetJS workbook object[^7]. +At this point `wb` is a SheetJS workbook object[^9]. ## Complete Example :::note Tested Deployments -This demo was last tested on 2023 September 17 using `google-auth-library` for -authentication (`v8.9.0`) and `google-spreadsheet` for API access (`v4.1.0`). +This demo was last tested on 2024 June 08 using `googleapis` version `140.0.0`. +The demo uses Sheets v4 and Drive v3 APIs. + +::: + +:::caution pass + +**The Google Cloud web interface changes frequently!** + +The screenshots and detailed descriptions may be out of date. Please report any +issues [to the docs repo](https://git.sheetjs.com/sheetjs/docs.sheetjs.com/) or +reach out to [the SheetJS Discord server](https://sheetjs.com/chat). ::: @@ -352,8 +436,11 @@ A valid phone number (for SMS verification) may be required. ::: -1) Open https://console.cloud.google.com in a web browser. Review the Google -Cloud Platform Terms of Service. +1) Open https://console.cloud.google.com in a web browser. + +If this is the first time accessing Google Cloud resources, a terms of service +modal will be displayed. Review the Google Cloud Platform Terms of Service by +clicking the "Google Cloud Platform Terms of Service" link. :::danger pass @@ -361,17 +448,34 @@ You must agree to the Google Cloud Platform Terms of Service to use the APIs. ::: +Check the box under "Terms of Service" and click "AGREE AND CONTINUE". + ### Project Setup -2) Create a new Project. +:::info pass -If the account does not have an existing project, click "CREATE PROJECT" +The goal of this section is to create a new project. -If the account has an existing project, click the project selector (`:·` icon) -and click "NEW PROJECT" in the modal. +::: + +2) Open the Project Selector. + +In the top bar, between the "Google Cloud" logo and the search bar, there will +be a selection box. Click the `▼` icon to show the modal. + +![Project Selector](pathname:///gsheet/selector.png) + +If the selection box is missing, expand the browser window. + +3) Click "NEW PROJECT" in the top right corner of the modal. + +4) In the New Project screen, enter "SheetJS Test" in the Project name textbox +and select "No organization" in the Location box. Click "CREATE". + +A notification will confirm that the project was created: + +![Project notification](pathname:///gsheet/notification.png) -3) In the New Project screen, enter "SheetJS Test" in the Project name textbox -and select "No organization" in the Location box. Click "CREATE" ### API Setup @@ -381,23 +485,34 @@ The goal of this section is to enable Google Sheets API and Google Drive API. ::: -4) Click the Project Selector (`:·` icon) and select "SheetJS Test" +5) Open the Project Selector (`▼` icon) and select "SheetJS Test" -5) In the left sidebar, click "Enabled APIs and services". +6) In the search bar, type "Enabled" and select "Enabled APIs & services". This +item will be in the "PRODUCTS & PAGES" part of the search results. -6) Near the top of the page, click "+ ENABLE APIS AND SERVICES". +#### Enable Google Sheets API -7) In the search bar near the middle of the page, type "Sheets" and look for -"Google Sheets API". Click the card +7) Near the top of the page, click "+ ENABLE APIS AND SERVICES". -8) In the Product Details screen, click the blue "ENABLE" button. +8) In the search bar near the middle of the page (not the search bar at the top), +type "Sheets" and press Enter. -9) Click the left arrow (`<-`) next to API/Service details. +In the results page, look for "Google Sheets API". Click the card -10) In the search bar near the middle of the page, type "Drive" and look for -"Google Drive API". Click the card. +9) In the Product Details screen, click the blue "ENABLE" button. -11) In the Product Details screen, click the blue "ENABLE" button. +10) Click the left arrow (`<-`) next to "API/Service details". + +#### Enable Google Drive API + +11) Near the top of the page, click "+ ENABLE APIS AND SERVICES". + +12) In the search bar near the middle of the page (not the search bar at the top), +type "Drive" and press Enter. + +In the results page, look for "Google Drive API". Click the card + +13) In the Product Details screen, click the blue "ENABLE" button. ### Service Account Setup @@ -407,19 +522,21 @@ The goal of this section is to create a service account and generate a JSON key. ::: +14) Go to https://console.cloud.google.com or click the "Google Cloud" image in +the top bar. + #### Create Service Account -12) Go to https://console.cloud.google.com. +15) Click the Project Selector (`:·` icon) and select "SheetJS Test". -13) Click the Project Selector (`:·` icon) and select "SheetJS Test". +16) In the search bar, type "Credentials" and select the "Credentials" item with +subtitle "APIs & Services". This item will be in the "PRODUCTS & PAGES" group: -14) Click "Dashboard". +![Credentials](pathname:///gsheet/creds.png) -15) In the left sidebar, hover over "APIs and Services" and select "Credentials" +17) Click "+ CREATE CREDENTIALS". In the dropdown, select "Service Account" -16) Click "+ CREATE CREDENTIALS". In the dropdown, select "Service Account" - -17) Enter "SheetJService" for Service account name. Click "CREATE AND CONTINUE" +18) Enter "SheetJService" for Service account name. Click "CREATE AND CONTINUE" :::note pass @@ -427,23 +544,22 @@ The Service account ID is generated automatically. ::: -18) In Step 2 "Grant this service account access to project", click CONTINUE +19) In Step 2 "Grant this service account access to project", click CONTINUE -19) In Step 3 click "DONE". You will be taken back to the credentials screen +20) In Step 3 click "DONE". You will be taken back to the credentials screen #### Create JSON Key -20) Look for "SheetJService" in the "Service Accounts" table and click the email -address in the row - -21) Click the email address of the account in the "Service Accounts" table. +21) Look for "SheetJService" in the "Service Accounts" table and click the email +address in the row. 22) Click "KEYS" in the horizontal bar near the top of the page. 23) Click "ADD KEY" and select "Create new key" in the dropdown. -24) In the popup, select the "JSON" radio button and click "CREATE". The page -will download a JSON file. +24) In the popup, select the "JSON" radio button and click "CREATE". + +The page will download a JSON file. If prompted, allow the download. 25) Click "CLOSE" @@ -469,35 +585,27 @@ npm init -y 28) Install dependencies: {`\ -npm i --save https://cdn.sheetjs.com/xlsx-${current}/xlsx-${current}.tgz google-spreadsheet google-auth-library`} +npm i --save https://cdn.sheetjs.com/xlsx-${current}/xlsx-${current}.tgz googleapis`} -29) Save the following script to `init.mjs`: +29) Download [`init.mjs`](pathname:///gsheet/init.mjs): -```js title="init.mjs" -import { JWT } from 'google-auth-library' -import { GoogleSpreadsheet } from 'google-spreadsheet'; +```bash +curl -LO https://docs.sheetjs.com/gsheet/init.mjs +``` +Edit the marked lines near the top of the file: + +```js title="init.mjs (edit highlighted lines)" +/* Change this import statement to point to the credentials JSON file */ // highlight-next-line import creds from './sheetjs-test-726272627262.json' assert { type: "json" }; -const jwt = new JWT({ - email: creds.client_email, - key: creds.private_key, - scopes: [ - 'https://www.googleapis.com/auth/spreadsheets', - 'https://www.googleapis.com/auth/drive.file', - ] -}); - -const doc = await GoogleSpreadsheet.createNewSpreadsheetDocument(jwt, { title: 'test from NodeJS' }); -const newSheet = await doc.addSheet({ title: 'SheetJSTest' }); +/* Change this to the primary account address, NOT THE SERVICE ACCOUNT */ // highlight-next-line -await doc.share('YOUR_ADDRESS@gmail.com'); +const acct = "YOUR_ADDRESS@gmail.com"; ``` -Edit the highlighted lines as follows: - - `'./sheetjs-test-726272627262.json'` should be replaced with the name of the JSON file in step 27. The `./` prefix is required! @@ -510,10 +618,63 @@ address from step 0. node init.mjs ``` -31) Sign into Google Sheets. A shared document "test from NodeJS" should be +The script will print three lines: + +``` +Created Google Workbook a-long-string-of-characters +Created Google Worksheets "SheetJS1" and "SheetJS2" +Shared a-long-string-of-characters with YOUR_ACCOUNT@gmail.com +``` + +The long string of characters after "Created Google Workbook" is the ID. Take +note of this ID. + +31) Sign into Google Sheets. A shared document "SheetJS Test" should be displayed in the table. It will be owned by the service account. -32) Open the shared document from step 31. +32) Open the shared document from step 31 and confirm that the document has two +worksheets named "SheetJS1" and "SheetJS2". + +Confirm the worksheet data matches the following screenshots: + + + + + + + + + + + +
SheetDataScreenshot
SheetJS1 + +```js +[ + [ "Sheet", "JS" ], + [ 72, 62 ] +] +``` + + + +![SheetJS1 data](pathname:///gsheet/SheetJS1.png) + +
SheetJS2 + +```js +[ + [ "Area Code", "Part 1", "Part 2" ], + [ 201, 867, 5309 ], + [ 281, 330, 8004 ] +] +``` + + + +![SheetJS2 data](pathname:///gsheet/SheetJS2.png) + +
33) Copy the URL and extract the document ID. @@ -527,6 +688,8 @@ https://docs.google.com/spreadsheets/d/a_long_string_of_characters/edit#gid=0 The ID is a long string of letters and numbers and underscore characters (`_`) just before the `/edit` part of the URL. +Confirm that this ID matches the ID printed in step 30. + ### Load Data from NUMBERS :::info pass @@ -542,83 +705,26 @@ NUMBERS file. curl -LO https://docs.sheetjs.com/pres.numbers ``` -35) Save the following script to `load.mjs`: +35) Download [`load.mjs`](pathname:///gsheet/load.mjs): -```js title="load.mjs" -import { JWT } from 'google-auth-library' -import { GoogleSpreadsheet } from 'google-spreadsheet'; - -import { set_fs, readFile, utils } from 'xlsx'; -import * as fs from 'fs'; -set_fs(fs); - -// highlight-next-line -import creds from './sheetjs-test-726272627262.json' assert { type: "json" }; - -const jwt = new JWT({ - email: creds.client_email, - key: creds.private_key, - scopes: [ - 'https://www.googleapis.com/auth/spreadsheets', - 'https://www.googleapis.com/auth/drive.file', - ] -}); - -// highlight-next-line -const doc = new GoogleSpreadsheet('DOCUMENT_ID', jwt); -await doc.loadInfo(); - -const wb = readFile("pres.numbers"); - -/* clear workbook */ -{ - /* delete all sheets after the first sheet */ - const old_sheets = doc.sheetsByIndex; - for(let i = 1; i < old_sheets.length; ++i) { - await old_sheets[i].delete(); - } - /* clear first worksheet */ - old_sheets[0].clear(); -} - -/* write worksheets */ -{ - const name = wb.SheetNames[0]; - const ws = wb.Sheets[name]; - /* first worksheet already exists */ - const sheet = doc.sheetsByIndex[0]; - - /* update worksheet name */ - await sheet.updateProperties({title: name}); - - /* generate array of arrays from the first worksheet */ - const aoa = utils.sheet_to_json(ws, {header: 1}); - - /* set document header row to first row of the AOA */ - await sheet.setHeaderRow(aoa[0]) - - /* add the remaining rows */ - await sheet.addRows(aoa.slice(1)); - - /* the other worksheets must be created manually */ - for(let i = 1; i < wb.SheetNames.length; ++i) { - const name = wb.SheetNames[i]; - const ws = wb.Sheets[name]; - - const sheet = await doc.addSheet({title: name}); - const aoa = utils.sheet_to_json(ws, {header: 1}); - await sheet.setHeaderRow(aoa[0]) - await sheet.addRows(aoa.slice(1)); - } -} +```bash +curl -LO https://docs.sheetjs.com/gsheet/load.mjs ``` -Edit the highlighted lines as follows: +Edit the marked lines near the top of the file: + +```js title="load.mjs (edit highlighted lines)" +/* Change this import statement to point to the credentials JSON file */ +import creds from './sheetjs-test-726272627262.json' assert { type: "json" }; + +/* Change this to the spreadsheet ID */ +const id = "SOME-SPREADSHEETJS-ID"; +``` - `'./sheetjs-test-726272627262.json'` should be replaced with the name of the JSON file in step 27. The `./` prefix is required! -- `'DOCUMENT_ID'` should be replaced with the Document ID from step 33. +- `"SOME-SPREADSHEETJS-ID"` should be replaced with the Document ID from step 33. 36) Run the script: @@ -626,7 +732,7 @@ JSON file in step 27. The `./` prefix is required! node load.mjs ``` -37) Sign into Google Sheets and open the "test from NodeJS" shared document. It +37) Sign into Google Sheets and open the "SheetJS Test" shared document. It should show a list of Presidents, matching the contents of the test file. ### Export Data to XLSB @@ -637,61 +743,26 @@ The goal of this section is to export the raw data from Google Sheets to XLSB. ::: -38) Save the following script to `dump.mjs`: +38) Download [`dump.mjs`](pathname:///gsheet/dump.mjs): -```js title="dump.mjs" -import { JWT } from 'google-auth-library' -import { GoogleSpreadsheet } from 'google-spreadsheet'; - -import { set_fs, writeFile, utils } from 'xlsx'; -import * as fs from 'fs'; -set_fs(fs); - -// highlight-next-line -import creds from './sheetjs-test-726272627262.json' assert { type: "json" }; - -const jwt = new JWT({ - email: creds.client_email, - key: creds.private_key, - scopes: [ - 'https://www.googleapis.com/auth/spreadsheets', - 'https://www.googleapis.com/auth/drive.file', - ] -}); - -// highlight-next-line -const doc = new GoogleSpreadsheet('DOCUMENT_ID', jwt); -await doc.loadInfo(); - -const wb = utils.book_new(); - -for(let i = 0; i < doc.sheetsByIndex.length; ++i) { - const sheet = doc.sheetsByIndex[i]; - const name = sheet.title; - - /* get the header and data rows */ - await sheet.loadHeaderRow(); - const header = sheet.headerValues; - const rows = await sheet.getRows(); - const aoa = [header].concat(rows.map(r => r._rawData)); - - /* generate a SheetJS Worksheet */ - const ws = utils.aoa_to_sheet(aoa); - - /* add to workbook */ - utils.book_append_sheet(wb, ws, name); -} - -/* write to SheetJS.xlsb */ -writeFile(wb, "SheetJS.xlsb"); +```bash +curl -LO https://docs.sheetjs.com/gsheet/dump.mjs ``` -Edit the highlighted lines as follows: +Edit the marked lines near the top of the file: + +```js title="dump.mjs (edit highlighted lines)" +/* Change this import statement to point to the credentials JSON file */ +import creds from './sheetjs-test-726272627262.json' assert { type: "json" }; + +/* Change this to the spreadsheet ID */ +const id = "SOME-SPREADSHEETJS-ID"; +``` - `'./sheetjs-test-726272627262.json'` should be replaced with the name of the JSON file in step 27. The `./` prefix is required! -- `'DOCUMENT_ID'` should be replaced with the Document ID from step 33. +- `"SOME-SPREADSHEETJS-ID"` should be replaced with the Document ID from step 33. 39) Run the script: @@ -699,11 +770,8 @@ JSON file in step 27. The `./` prefix is required! node dump.mjs ``` -The script should create a file `SheetJS.xlsb` in the project folder. This file -can be opened in Excel - -40) Sign into Google Sheets and open the "test from NodeJS" shared document. It -should show a list of Presidents, matching the contents of the test file. +The script should create a file `SheetJSExport.xlsb` in the project folder. This +file can be opened in Excel. ### Export Raw Files @@ -714,74 +782,63 @@ CSV files for each worksheet. ::: -41) Sign into Google Sheets and open the "test from NodeJS" shared document. +40) Sign into Google Sheets and open the "SheetJS Test" shared document. -42) Click the Plus (`+`) icon in the lower left corner to create a new worksheet. +41) Click the Plus (`+`) icon in the lower left corner to create a new worksheet. -43) In the new worksheet, set cell A1 to the formula `=SEQUENCE(3,5)`. This will +42) In the new worksheet, set cell A1 to the formula `=SEQUENCE(3,5)`. This will assign a grid of values -44) Save the following script to `raw.mjs`: +43) Download [`raw.mjs`](pathname:///gsheet/raw.mjs): -```js title="raw.mjs" -import { JWT } from 'google-auth-library' -import { GoogleSpreadsheet } from 'google-spreadsheet'; - -import { read, utils } from 'xlsx'; - -// highlight-next-line -import creds from './sheetjs-test-726272627262.json' assert { type: "json" }; - -const jwt = new JWT({ - email: creds.client_email, - key: creds.private_key, - scopes: [ - 'https://www.googleapis.com/auth/spreadsheets', - 'https://www.googleapis.com/auth/drive.file', - ] -}); - -// highlight-next-line -const doc = new GoogleSpreadsheet('DOCUMENT_ID', jwt); -await doc.loadInfo(); - -const buf = await doc.downloadAsXLSX(); - -/* Parse with SheetJS */ -const wb = read(buf); - -/* Loop over the worksheet names */ -wb.SheetNames.forEach(name => { - /* Print the name to the console */ - console.log(name); - - /* Get the corresponding worksheet object */ - const sheet = wb.Sheets[name]; - - /* Print a CSV export of the worksheet */ - console.log(utils.sheet_to_csv(sheet)); -}); +```bash +curl -LO https://docs.sheetjs.com/gsheet/raw.mjs ``` -Edit the highlighted lines as follows: +Edit the marked lines near the top of the file: + +```js title="raw.mjs (edit highlighted lines)" +/* Change this import statement to point to the credentials JSON file */ +import creds from './sheetjs-test-726272627262.json' assert { type: "json" }; + +/* Change this to the spreadsheet ID */ +const id = "SOME-SPREADSHEETJS-ID"; +``` - `'./sheetjs-test-726272627262.json'` should be replaced with the name of the JSON file in step 27. The `./` prefix is required! -- `'DOCUMENT_ID'` should be replaced with the Document ID from step 33. +- `"SOME-SPREADSHEETJS-ID"` should be replaced with the Document ID from step 33. -45) Run the script: +44) Run the script: ```bash node raw.mjs ``` -The script will display the sheet names and CSV rows from both worksheets. +The script will display the sheet names and CSV rows from both worksheets: -[^1]: The package name is [`google-auth-library`](https://www.npmjs.com/package/google-auth-library) -[^2]: The project name is [`node-google-spreadsheet`](https://github.com/theoephraim/node-google-spreadsheet) but the module name is `google-spreadsheet`. -[^3]: See [`aoa_to_sheet` in "Utilities"](/docs/api/utilities/array#array-of-arrays-input) -[^4]: See [`sheet_to_json` in "Utilities"](/docs/api/utilities/array#array-output) -[^5]: See ["Exporting Data"](https://theoephraim.github.io/node-google-spreadsheet/#/guides/exports) in the `node-google-spreadsheet` documentation -[^6]: See [`read` in "Reading Files"](/docs/api/parse-options) -[^7]: See ["Workbook Object"](/docs/csf/book) for a description of the workbook object or ["API Reference"](/docs/api) for various methods to work with workbook and sheet objects. +``` +#### Sheet1 +Name,Index +Bill Clinton,42 +GeorgeW Bush,43 +Barack Obama,44 +Donald Trump,45 +Joseph Biden,46 + +#### Sheet14 +1,2,3,4,5 +6,7,8,9,10 +11,12,13,14,15 +``` + +[^1]: See [`aoa_to_sheet` in "Utilities"](/docs/api/utilities/array#array-of-arrays-input) +[^2]: See [`sheet_to_json` in "Utilities"](/docs/api/utilities/array#array-output) +[^3]: See [`book_new` in "Utilities"](/docs/api/utilities/wb) +[^4]: See [`book_append_sheet` in "Utilities"](/docs/api/utilities/wb) +[^5]: See [`writeFile` in "Writing Files"](/docs/api/write-options) +[^6]: See ["Workbook Object"](/docs/csf/book) for more details. +[^7]: See [`sheet_to_json` in "Utilities"](/docs/api/utilities/array#array-output) +[^8]: See [`read` in "Reading Files"](/docs/api/parse-options) +[^9]: See ["Workbook Object"](/docs/csf/book) for a description of the workbook object or ["API Reference"](/docs/api) for various methods to work with workbook and sheet objects. diff --git a/docz/docs/03-demos/32-extensions/12-maple.md b/docz/docs/03-demos/32-extensions/12-maple.md index b097332..be7f0d6 100644 --- a/docz/docs/03-demos/32-extensions/12-maple.md +++ b/docz/docs/03-demos/32-extensions/12-maple.md @@ -32,7 +32,12 @@ flowchart LR :::note Tested Deployments -This demo was last tested by SheetJS users on 2024-04-25 in Maple 2024. +This demo was tested by SheetJS users in the following deployments: + +| Architecture | Version | Date | +|:-------------|:--------|:-----------| +| `darwin-x64` | 2024 | 2024-04-25 | +| `win10-x64` | 2024 | 2024-04-25 | ::: diff --git a/docz/static/gsheet/SheetJS1.png b/docz/static/gsheet/SheetJS1.png new file mode 100644 index 0000000000000000000000000000000000000000..01c32669dcce058a55ea3252d04ac30b02124fc1 GIT binary patch literal 13068 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�j85_W&l_5xYnX@s@5IS4JSH z8rgvp_`Qjc5}_Ksx`Q19eRp#|`8SKru7rb%kLd{Pe3cy3*79Xyzzqr;ued z*ZTAFX?zIf-+z5!kbqU#b$Y6~;Ngkf^9aiWD0C3T=wE+}>3R-|+gV~v$Px`*B14z5C?w~{K4qST5-+*@GqA&@fsp=K-qvNv5wiYS8} z4jjSodQKEUZV7@bz}rMoT;B5lZ|;f10bYO%R|XTn*55Y9s!~H@8UB!G`M{@2c$oGI z*iOEvvWw(Icv z`TvsJh~xjSwgvwEcMfomk;c>QLV#v(jTb7h>sRLi+vaL80y)BXZous6i;?P0fBeXe zJzE&cAPZPtXc2LXY(~D>YvLq#T(e^~O;%2H(#F9ZJ%vZ{j1 literal 0 HcmV?d00001 diff --git a/docz/static/gsheet/SheetJS2.png b/docz/static/gsheet/SheetJS2.png new file mode 100644 index 0000000000000000000000000000000000000000..d0553f9239aca8d0e313291273625f93e366882a GIT binary patch literal 26035 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%0D-Q|3fxfO9z{tTn4i@%dvA; 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 literal 0 HcmV?d00001 diff --git a/docz/static/gsheet/creds.png b/docz/static/gsheet/creds.png new file mode 100644 index 0000000000000000000000000000000000000000..f04edeebdb0caadb567dc5971d3de44b37d51ef7 GIT binary patch literal 56513 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 G`@aC)vTA++ literal 0 HcmV?d00001 diff --git a/docz/static/gsheet/dump.mjs b/docz/static/gsheet/dump.mjs new file mode 100644 index 0000000..f850f3b --- /dev/null +++ b/docz/static/gsheet/dump.mjs @@ -0,0 +1,39 @@ +import { google } from "googleapis"; + +import { set_fs, writeFile, utils } from 'xlsx'; +import * as fs from 'fs'; +set_fs(fs); + +/* Change this import statement to point to the credentials JSON file */ +import creds from './sheetjs-test-726272627262.json' assert { type: "json" }; + +/* Change this to the spreadsheet ID */ +const id = "SOME-SPREADSHEETJS-ID"; + +/* connect to google services */ +const jwt = new google.auth.JWT({ + email: creds.client_email, + key: creds.private_key, + scopes: [ + 'https://www.googleapis.com/auth/spreadsheets', + 'https://www.googleapis.com/auth/drive.file', + ] +}); + +const sheets = google.sheets({ version: "v4", auth: jwt }); + +/* get existing sheets */ +const wsheet = await sheets.spreadsheets.get({spreadsheetId: id}); + +/* create a workbook */ +const wb = utils.book_new(); + +for(let sheet of wsheet.data.sheets) { + const name = sheet.properties.title; + const res = await sheets.spreadsheets.values.get({ + spreadsheetId: id, + range: `'${name}'` + }); + utils.book_append_sheet(wb, utils.aoa_to_sheet(res.data.values), name); +} +writeFile(wb, "SheetJSExport.xlsb"); diff --git a/docz/static/gsheet/init.mjs b/docz/static/gsheet/init.mjs new file mode 100644 index 0000000..13f6ae5 --- /dev/null +++ b/docz/static/gsheet/init.mjs @@ -0,0 +1,87 @@ +import { google } from "googleapis"; + +/* Change this import statement to point to the credentials JSON file */ +import creds from './sheetjs-test-726272627262.json' assert { type: "json" }; + +/* Change this to the primary account address, NOT THE SERVICE ACCOUNT */ +const acct = "YOUR_ADDRESS@gmail.com"; + +/* connect to google services */ +const jwt = new google.auth.JWT({ + email: creds.client_email, + key: creds.private_key, + scopes: [ + 'https://www.googleapis.com/auth/spreadsheets', + 'https://www.googleapis.com/auth/drive.file', + ] +}); + +const sheets = google.sheets({ version: "v4", auth: jwt }); +const drive = google.drive({version: "v3", auth: jwt }); + +/* create new google workbook */ +const [id, sheet0id] = await (async() => { + const res = await sheets.spreadsheets.create({ + requestBody: { + properties: { + title: "SheetJS Test" + } + } + }); + const id = res.data.spreadsheetId; + const sheet0id = res.data.sheets[0].properties.sheetId; + return [id, sheet0id]; +})(); +console.log(`Created Google Workbook ${id}`); + +/* create new google worksheet and delete initial sheet */ +const [sheet1id, sheet2id] = await (async() => { + const res = await sheets.spreadsheets.batchUpdate({ + spreadsheetId: id, + requestBody: { requests: [ + /* add SheetJS1 */ + { addSheet: { properties: { title: "SheetJS1" } } }, + /* add SheetJS2 */ + { addSheet: { properties: { title: "SheetJS2" } } }, + /* remove default sheet */ + { deleteSheet: { sheetId: sheet0id } }, + ] } + }); + console.log(`Created Google Worksheets "SheetJS1" and "SheetJS2"`); + return res.data.replies.slice(0,2).map(r => r.addSheet.properties.sheetId); +})(); + +await sheets.spreadsheets.values.update({ + spreadsheetId: id, + range: "SheetJS1!A1", + valueInputOption: "USER_ENTERED", + resource: { values: [ + ["Sheet", "JS"], + [72, 62] + ]} +}); + +await sheets.spreadsheets.values.update({ + spreadsheetId: id, + range: "SheetJS2!A1", + valueInputOption: "USER_ENTERED", + resource: { values: [ + ["Area Code", "Part 1", "Part 2"], + [201, 867, 5309], + [281, 330, 8004], + ]} +}); + +/* Share new Document with the primary account */ +try { + await drive.permissions.create({ + fileId: id, + fields: "id", + requestBody: { + type: "user", + role: "writer", + emailAddress: acct + } + }); + console.log(`Shared ${id} with ${acct}`); +} catch(e) { console.log(e); } diff --git a/docz/static/gsheet/load.mjs b/docz/static/gsheet/load.mjs new file mode 100644 index 0000000..2d5c14d --- /dev/null +++ b/docz/static/gsheet/load.mjs @@ -0,0 +1,87 @@ +import { google } from "googleapis"; + +import { set_fs, readFile, utils } from 'xlsx'; +import * as fs from 'fs'; +set_fs(fs); + +/* Change this import statement to point to the credentials JSON file */ +import creds from './sheetjs-test-726272627262.json' assert { type: "json" }; + +/* Change this to the spreadsheet ID */ +const id = "SOME-SPREADSHEETJS-ID"; + +/* connect to google services */ +const jwt = new google.auth.JWT({ + email: creds.client_email, + key: creds.private_key, + scopes: [ + 'https://www.googleapis.com/auth/spreadsheets', + 'https://www.googleapis.com/auth/drive.file', + ] +}); + +const sheets = google.sheets({ version: "v4", auth: jwt }); + +/* get existing sheets */ +const wsheet = await sheets.spreadsheets.get({spreadsheetId: id}); + +/* remove all sheets after the first */ +if(wsheet.data.sheets.length > 1) await sheets.spreadsheets.batchUpdate({ + spreadsheetId: id, + requestBody: { requests: + wsheet.data.sheets.slice(1).map(s => ({ + deleteSheet: { + sheetId: s.properties.sheetId + } + })) + } +}); + +/* read file */ +const wb = readFile("pres.numbers"); + +/* rename first worksheet to avoid collisions */ +const props0 = wsheet.data.sheets[0].properties; +if(wb.SheetNames.map(n => n.toLowerCase()).includes(props0.title.toLowerCase())) { + await sheets.spreadsheets.batchUpdate({ + spreadsheetId: id, + requestBody: { requests: [{ + updateSheetProperties: { + fields: "title", + properties: { + sheetId: props0.sheetId, + title: "thistitleisatleast33characterslong" + } + } + }]} + }); + console.log(`renamed "${props0.title}" to "thistitleisatleast33characterslong"`); +} + +/* add sheets from file */ +for(let name of wb.SheetNames) { + const aoa = utils.sheet_to_json(wb.Sheets[name], {header:1}); + await sheets.spreadsheets.batchUpdate({ + spreadsheetId: id, + requestBody: { requests: [ + /* add new sheet */ + { addSheet: { properties: { title: name } } }, + ] } + }); + await sheets.spreadsheets.values.update({ + spreadsheetId: id, + range: `'${name}'!A1`, + valueInputOption: "USER_ENTERED", + resource: { values: aoa } + }); + console.log(`Created Google Worksheet "${name}"`); +} + +/* remove first sheet */ +const res = await sheets.spreadsheets.batchUpdate({ + spreadsheetId: id, + requestBody: { requests: [ + /* remove old first sheet */ + { deleteSheet: { sheetId: wsheet.data.sheets[0].properties.sheetId } } + ] } +}); diff --git a/docz/static/gsheet/notification.png b/docz/static/gsheet/notification.png new file mode 100644 index 0000000000000000000000000000000000000000..24b37b69aa8d2b8c82436c66bb224aa71bb2d0b6 GIT binary patch literal 37801 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�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 literal 0 HcmV?d00001 diff --git a/docz/static/gsheet/raw.mjs b/docz/static/gsheet/raw.mjs new file mode 100644 index 0000000..440d565 --- /dev/null +++ b/docz/static/gsheet/raw.mjs @@ -0,0 +1,38 @@ +import { google } from "googleapis"; + +import { read, utils } from 'xlsx'; + +/* Change this import statement to point to the credentials JSON file */ +import creds from './sheetjs-test-726272627262.json' assert { type: "json" }; + +/* Change this to the spreadsheet ID */ +const id = "SOME-SPREADSHEETJS-ID"; + +/* connect to google services */ +const jwt = new google.auth.JWT({ + email: creds.client_email, + key: creds.private_key, + scopes: [ + 'https://www.googleapis.com/auth/spreadsheets', + 'https://www.googleapis.com/auth/drive.file', + ] +}); + +const drive = google.drive({ version: "v3", auth: jwt }); + +/* get XLSX export */ +const file = await drive.files.export({ + mimeType: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", + fileId: id +}); +const ab = await file.data.arrayBuffer(); + +/* parse with SheetJS */ +const wb = read(ab); + +/* print CSV data from each worksheet */ +wb.SheetNames.forEach(n => { + console.log(`#### ${n}`); + console.log(utils.sheet_to_csv(wb.Sheets[n])); + console.log(""); +}) \ No newline at end of file diff --git a/docz/static/gsheet/selector.png b/docz/static/gsheet/selector.png new file mode 100644 index 0000000000000000000000000000000000000000..90c35a5f0a4b44d0d97527a4643ccf54c9c090f7 GIT binary patch literal 50646 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

eg1r7^w@*3>8`F?wQ7~DIp?Z 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 XqMB>;qCZUGU>|vDindex.html < +

SheetJS export demo

+ + + +EOF + +cat >index.js < { + /* fetch JSON data and parse */ + const url = "https://docs.sheetjs.com/executive.json"; + const raw_data = await (await fetch(url)).json(); + + /* filter for the Presidents */ + const prez = raw_data.filter(row => row.terms.some(term => term.type === "prez")); + + /* sort by first presidential term */ + prez.forEach(row => row.start = row.terms.find(term => term.type === "prez").start); + prez.sort((l,r) => l.start.localeCompare(r.start)); + + /* flatten objects */ + const rows = prez.map(row => ({ + name: row.name.first + " " + row.name.last, + birthday: row.bio.birthday + })); + + /* generate worksheet and workbook */ + const worksheet = utils.json_to_sheet(rows); + const workbook = utils.book_new(); + utils.book_append_sheet(workbook, worksheet, "Dates"); + + /* fix headers */ + utils.sheet_add_aoa(worksheet, [["Name", "Birthday"]], { origin: "A1" }); + + /* calculate column width */ + const max_width = rows.reduce((w, r) => Math.max(w, r.name.length), 10); + worksheet["!cols"] = [ { wch: max_width } ]; + + /* create an XLSX file and try to save to Presidents.xlsx */ + writeFileXLSX(workbook, "Presidents.xlsx"); +}; +EOF + +cat >test.js < { + await new Promise((res,rej) => setTimeout(res, 1000)); + const browser = await puppeteer.launch(); + const page = await browser.newPage(); + page.on("console", msg => console.log("PAGE LOG:", msg.text())); + await page.setViewport({width: 1920, height: 1080}); + const client = await page.target().createCDPSession(); + await client.send('Browser.setDownloadBehavior', { + behavior: 'allow', + downloadPath: require("path").resolve('./') + }); + page.on('request', req => console.log(req.url())); + await page.goto('http://localhost:7262/'); + await new Promise((res,rej) => setTimeout(res, 1000)); + await page.click("#xport"); + await new Promise((res,rej) => setTimeout(res, 1000)); + await browser.close(); + process.exit(); +}); +EOF + +node -e 'var pjson = JSON.parse(fs.readFileSync("./package.json")); console.log(pjson); delete pjson.main; fs.writeFileSync("package.json", JSON.stringify(pjson))' + +for n in 1.12.4 2.12.0; do + npx -y parcel build index.html + node test.js + npx -y xlsx-cli Presidents.xlsx | head -n 3 + rm -f Presidents.xlsx +done