forked from sheetjs/docs.sheetjs.com
		
	gsheet-udf
This commit is contained in:
		
							parent
							
								
									c164c3dbcd
								
							
						
					
					
						commit
						5ff93dc4b7
					
				| @ -16,6 +16,14 @@ referenced API version will be available in the future. | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
| :::note | ||||
| 
 | ||||
| This demo focuses on external data processing.  For Google Apps Script custom | ||||
| functions, [the "Google Sheets" extension demo](/docs/demos/extensions/gsheet) | ||||
| covers Apps Script integration. | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
| ## Initial Configuration | ||||
| 
 | ||||
| Install the dependencies: | ||||
|  | ||||
							
								
								
									
										198
									
								
								docz/docs/03-demos/10-extensions/04-gsheet.md
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										198
									
								
								docz/docs/03-demos/10-extensions/04-gsheet.md
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,198 @@ | ||||
| --- | ||||
| title: Google Sheets | ||||
| pagination_prev: demos/cloud/index | ||||
| pagination_next: demos/bigdata/index | ||||
| --- | ||||
| 
 | ||||
| :::note | ||||
| 
 | ||||
| This demo focuses on Google Apps Script custom functions.  For external data | ||||
| processing, [the "Google Sheets" cloud data demo](/docs/demos/cloud/gsheet) | ||||
| covers the API for NodeJS scripts | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
| The [Standalone scripts](/docs/getting-started/installation/standalone) can be | ||||
| uploaded into an Apps Script project.  Once uploaded, the `XLSX` variable is | ||||
| available to other scripts in the project. | ||||
| 
 | ||||
| Google Sheets currently does not provide support for working with Apple Numbers | ||||
| files and some legacy file formats. SheetJS fills the gap. | ||||
| 
 | ||||
| The [Complete Demo](#complete-demo) defines a `SHEETJS` function that fetches a | ||||
| remote file, parses the contents, and writes data to the sheet: | ||||
| 
 | ||||
|  | ||||
| 
 | ||||
| :::note | ||||
| 
 | ||||
| This demo was last tested on 2023 April 17. | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
| ## Integration Details | ||||
| 
 | ||||
| ### Adding the script | ||||
| 
 | ||||
| The `clasp` command line tool can be used to upload the standalone script: | ||||
| 
 | ||||
| ```bash | ||||
| npx @google/clasp clone SCRIPT_ID | ||||
| curl -LO https://cdn.sheetjs.com/xlsx-latest/package/dist/xlsx.full.min.js | ||||
| npx @google/clasp push | ||||
| ``` | ||||
| 
 | ||||
| Once uploaded, the script `xlsx.full.min.gs` will be added to the project. | ||||
| 
 | ||||
| The [Complete Demo](#complete-demo) includes more detailed setup instructions. | ||||
| 
 | ||||
| ### Fetching data | ||||
| 
 | ||||
| `UrlFetchApp.fetch` performs a network request and returns a `HTTPResponse`: | ||||
| 
 | ||||
| ```js | ||||
| const response = UrlFetchApp.fetch("https://sheetjs.com/pres.numbers"); | ||||
| ``` | ||||
| 
 | ||||
| `HTTPResponse#getContent` returns the file data as an array of *signed* bytes: | ||||
| 
 | ||||
| ```js | ||||
| const content = response.getContent(); | ||||
| ``` | ||||
| 
 | ||||
| The `"array"` type for `XLSX.read` expects an array of *unsigned* bytes. | ||||
| Fortunately, the content can be corrected with bitwise operations: | ||||
| 
 | ||||
| ```js | ||||
| for(var i = 0; i < content.length; ++i) content[i] &= 0xFF; | ||||
| const wb = XLSX.read(content, { type: "array" }); | ||||
| ``` | ||||
| 
 | ||||
| ### Returning data | ||||
| 
 | ||||
| `XLSX.utils.sheet_to_json` with the option `header: 1` returns arrays of arrays | ||||
| that play nice with Google Sheets: | ||||
| 
 | ||||
| ```js | ||||
| const first_worksheet = wb.Sheets[wb.SheetNames[0]]; | ||||
| const aoa = XLSX.utils.sheet_to_json(first_worksheet, {header: 1}); | ||||
| ``` | ||||
| 
 | ||||
| ## Complete Demo | ||||
| 
 | ||||
| This demo creates a function `SHEETJS(url)` that fetches the specified URL, | ||||
| extracts data from the first worksheet, and writes the data | ||||
| 
 | ||||
| ### Initial Setup | ||||
| 
 | ||||
| 0) Sign into a Google account (or create a new one) | ||||
| 
 | ||||
| 1) In a terminal window, run | ||||
| 
 | ||||
| ```bash | ||||
| npx @google/clasp login | ||||
| ``` | ||||
| 
 | ||||
| A browser window should direct to an account selection page. Select the account | ||||
| from the previous step. In the next page, there will be a title like | ||||
| 
 | ||||
| > clasp – The Apps Script CLI wants to access your Google Account | ||||
| 
 | ||||
| At the bottom of the screen, click "Allow". | ||||
| 
 | ||||
| The terminal window should now state | ||||
| 
 | ||||
| ``` | ||||
| Authorization successful. | ||||
| ``` | ||||
| 
 | ||||
| ### Creating a Sheet | ||||
| 
 | ||||
| 2) Sign into Google Sheets with the same account and create a new blank sheet | ||||
| 
 | ||||
| 3) Open up the apps script window (Extensions > Apps Script) | ||||
| 
 | ||||
| 4) Click the gear icon (Project Settings) and copy the Script ID | ||||
| 
 | ||||
| ### Cloning the Apps Script | ||||
| 
 | ||||
| 5) In the terminal window, create a new folder for your project: | ||||
| 
 | ||||
| ```bash | ||||
| mkdir SheetJSGAS | ||||
| cd SheetJSGAS | ||||
| ``` | ||||
| 
 | ||||
| 6) Clone the Apps Script project.  The official command is: | ||||
| 
 | ||||
| ```bash | ||||
| npx @google/clasp clone PASTE_YOUR_ID_HERE | ||||
| ``` | ||||
| 
 | ||||
| Type `npx @google/clasp clone ` in the terminal with a trailing space (do not | ||||
| press Enter yet!), then copy the Script ID from the Apps Script settings page | ||||
| and paste in the terminal.  Press Enter after pasting the ID. | ||||
| 
 | ||||
| ### Adding the SheetJS Library | ||||
| 
 | ||||
| 7) Download the standalone build and move to the project directory: | ||||
| 
 | ||||
| ```bash | ||||
| curl -LO https://cdn.sheetjs.com/xlsx-latest/package/dist/xlsx.full.min.js | ||||
| ``` | ||||
| 
 | ||||
| 8) Push the project to Apps Script: | ||||
| 
 | ||||
| ```bash | ||||
| npx @google/clasp push | ||||
| ``` | ||||
| 
 | ||||
| :::caution | ||||
| 
 | ||||
| If the push command fails with an error message like | ||||
| 
 | ||||
| > User has not enabled the Apps Script API | ||||
| 
 | ||||
| The message includes a URL (`https://script.google.com/home/usersettings` when | ||||
| the demo was last tested). Visit that URL and enable the Google Apps Script API. | ||||
| After enabling the API, run `npx @google/clasp push` again. | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
| 9) Reopen the Google Sheet and Apps Script editor (Extensions > Apps Script). | ||||
| 
 | ||||
| In the Files listing, there should be a new entry `xlsx.full.min.gs` | ||||
| 
 | ||||
| ### Creating a Custom Function | ||||
| 
 | ||||
| 10) In Apps Script editor, select `Code.gs` and erase the code in the editor. | ||||
| Replace with the following function: | ||||
| 
 | ||||
| ```js title="Code.gs" | ||||
| function SHEETJS(url) { | ||||
|   /* fetch data */ | ||||
|   const res = UrlFetchApp.fetch(url || "https://sheetjs.com/pres.numbers"); | ||||
|   const content = res.getContent(); | ||||
| 
 | ||||
|   /* fix data */ | ||||
|   for(var i = 0; i < content.length; ++i) content[i] &= 0xFF; | ||||
| 
 | ||||
|   /* parse */ | ||||
|   const wb = XLSX.read(content, {type: "array"}); | ||||
| 
 | ||||
|   /* generate array of arrays from worksheet */ | ||||
|   const ws = wb.Sheets[wb.SheetNames[0]]; | ||||
|   const aoa = XLSX.utils.sheet_to_json(ws, {header: 1}); | ||||
|   return aoa; | ||||
| } | ||||
| ``` | ||||
| 
 | ||||
| Click the "Save Project" icon to save the project. | ||||
| 
 | ||||
| 11) In the Google Sheets window, select cell A1 and enter the formula | ||||
| 
 | ||||
| ``` | ||||
| =SHEETJS("https://sheetjs.com/pres.numbers") | ||||
| ``` | ||||
| 
 | ||||
| The file will be fetched and the contents will be written to the sheet. | ||||
							
								
								
									
										
											BIN
										
									
								
								docz/static/gsheet/udf.png
									
									
									
									
									
										Normal file
									
								
							
							
								
									
								
								
								
								
								
									
									
								
							
						
						
									
										
											BIN
										
									
								
								docz/static/gsheet/udf.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 53 KiB | 
| @ -1,2 +1,2 @@ | ||||
| const current = "0.19.2"; | ||||
| const current = "0.19.3"; | ||||
| export default current; | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user