From 4aafcce8be52d2ab6f6a5c1a64c8bf8e7ab75688 Mon Sep 17 00:00:00 2001 From: SheetJS Date: Mon, 30 May 2022 01:04:05 -0400 Subject: [PATCH] extendscript --- .../03-demos/02-extendscript.md | 190 ++++++++++++++++++ .../docs/04-getting-started/03-demos/index.md | 2 +- docz/docs/06-solutions/01-input.md | 2 +- docz/docs/06-solutions/05-output.md | 13 +- docz/docs/07-csf/03-book.md | 4 +- docz/docs/index.md | 4 +- docz/static/files/SheetJS.xlsb | Bin 0 -> 8362 bytes docz/static/files/psparse.png | Bin 0 -> 6210 bytes docz/static/files/pswrite.png | Bin 0 -> 7187 bytes docz/static/live/parse.jsx | 22 ++ docz/static/live/write.jsx | 23 +++ 11 files changed, 248 insertions(+), 12 deletions(-) create mode 100644 docz/docs/04-getting-started/03-demos/02-extendscript.md create mode 100644 docz/static/files/SheetJS.xlsb create mode 100644 docz/static/files/psparse.png create mode 100644 docz/static/files/pswrite.png create mode 100644 docz/static/live/parse.jsx create mode 100644 docz/static/live/write.jsx diff --git a/docz/docs/04-getting-started/03-demos/02-extendscript.md b/docz/docs/04-getting-started/03-demos/02-extendscript.md new file mode 100644 index 00000000..c12764d3 --- /dev/null +++ b/docz/docs/04-getting-started/03-demos/02-extendscript.md @@ -0,0 +1,190 @@ +--- +sidebar_position: 3 +--- + +# Adobe Apps + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Photoshop, InDesign and other Adobe Creative Suite applications offer extension +support. Over the years there have been a few different JavaScript platforms: + +- "ExtendScript": This uses an old JavaScript dialect but is supported in older + versions of Creative Suite and Creative Cloud. + +- "CEP": This was recommended in CS6 but eventually deprecated. + +- "UXP": This is the current Adobe recommendation for new CC extensions. + +This demo intends to cover the SheetJS-related parts. General setup as well as +general Adobe considerations are not covered here. A basic familiarity with +extension development is assumed. + +## ExtendScript Scripts + +[Installation is straightforward:](../../installation/extendscript) download a +script and move it to your project directory. + +### Reading Files + +`XLSX.readFile` can directly accept an absolute URI: + +```js +var workbook = XLSX.readFile("~/Documents/test.xlsx"); +``` + +The path can be user-configurable using `File.openDialog`: + +```js +/* Show File Picker */ +var thisFile = File.openDialog("Select a spreadsheet"); +if(!thisFile) { alert("File not found!"); return; } + +/* Read file from disk */ +var workbook = XLSX.readFile(thisFile.absoluteURI); +``` + +
Complete Example (click to hide) + +In this example, the script will show a dialog to select a file. After reading +the file, the workbook Author property will be extracted and the Photoshop doc +author (`activeDocument.info.author`) will be changed accordingly. + +This demo was verified in Photoshop CS6 64-bit on Windows 10. + +```js +#target photoshop +#include "xlsx.extendscript.js"; + +function main_parse() { + /* Show File Picker */ + var thisFile = File.openDialog("Select a spreadsheet"); + if(!thisFile) { alert("File not found!"); return; } + + /* Read file from disk */ + var workbook = XLSX.readFile(thisFile.absoluteURI); + + /* Get Workbook Author */ + var Props = workbook.Props; if(!Props) { alert("Missing Author!"); return; } + var Author = Props.Author; if(!Author) { alert("Missing Author!"); return; } + + /* Change Document Author to Workbook Author */ + var info = activeDocument.info; + alert("Changing Author from |" + info.author + "| to |" + Author + "|"); + info.author = Author; +} + +main_parse(); +``` + +0) Download the [test workbook](pathname:///files/SheetJS.xlsb). + +1) Download the following scripts: +- [`xlsx.extendscript.js`](https://cdn.sheetjs.com/xlsx-latest/package/dist/xlsx.extendscript.js) +- [`parse.jsx`](pathname:///live/parse.jsx) + +and place in the scripts directory. For CS6 Windows 10 the path is typically + +`C:\Program Files\Adobe\Adobe Photoshop CS6 (64 Bit)\Presets\Scripts` + +2) Restart Photoshop and open a file (or create a new one) + +3) File > Scripts > parse and select the test workbook + +4) An alert will confirm that the file was read and the author will be changed: + +!["Changing Author" popup](pathname:///files/psparse.png) + +5) File > File Info... should show the updated Author field! + +
+ +### Writing Files + +`XLSX.writeFile` can directly accept an absolute URI: + +```js +XLSX.writeFile(workbook, "~/Documents/test.xlsx"); +``` + +The path can be user-configurable using `File.saveDialog`: + +```js +/* Show File Picker */ +var thisFile = File.saveDialog("Select an output file", "*.xlsx;*.xls"); +if(!thisFile) { alert("File not found!"); return; } + +/* Write file to disk */ +XLSX.writeFile(workbook, thisFile.absoluteURI); +``` + +
Complete Example (click to hide) + +In this example, the script will show a dialog to select an output file. Once +selected, the library will create a new workbook with one worksheet. Cell A1 +will be "Author" and cell B1 will be the active Photoshop document Author. +The PS author is available as `activeDocument.info.author`. + +This demo was verified in Photoshop CS6 64-bit on Windows 10. + +```js +#target photoshop +#include "xlsx.extendscript.js"; + +function main_write() { + /* Show File Picker */ + var thisFile = File.saveDialog("Select an output file", "*.xlsx;*.xls"); + if(!thisFile) { alert("File not found!"); return; } + + /* Create new Worksheet */ + var ws = XLSX.utils.aoa_to_sheet([ + ["Author", activeDocument.info.author] + ]); + + /* Create new Workbook and add worksheet */ + var wb = XLSX.utils.book_new(); + XLSX.utils.book_append_sheet(wb, ws, "Sheet1"); + + /* Write file to disk */ + XLSX.writeFile(wb, thisFile.absoluteURI); + alert("Created File " + thisFile.absoluteURI); +} + +main_write(); +``` + +1) Download the following scripts: +- [`xlsx.extendscript.js`](https://cdn.sheetjs.com/xlsx-latest/package/dist/xlsx.extendscript.js) +- [`write.jsx`](pathname:///live/write.jsx) + +and place in the scripts directory. For CS6 Windows 10 the path is typically + +`C:\Program Files\Adobe\Adobe Photoshop CS6 (64 Bit)\Presets\Scripts` + +2) Restart Photoshop and open a file (or create a new one) + +3) File > File Info ... and confirm there is an Author. If not, set to `SheetJS` + +4) File > Scripts > write and use the popup to select the Documents folder. + Enter `SheetJSPSTest.xlsx` and hit "Save" + +4) An alert will confirm that the file was created: + +!["Created File" popup](pathname:///files/pswrite.png) + +5) Open the generated `SheetJSPSTest.xlsx` file and compare to Photoshop author + +
+ +## CEP + +[The standalone scripts](../../installation/standalone) can be added to CEP +extension HTML + +## UXP + +UXP officially recommends `require` and NodeJS Modules for third party support. + +[Use the "Frameworks" instructions to download.](../../installation/frameworks) + diff --git a/docz/docs/04-getting-started/03-demos/index.md b/docz/docs/04-getting-started/03-demos/index.md index 888f9740..dd631626 100644 --- a/docz/docs/04-getting-started/03-demos/index.md +++ b/docz/docs/04-getting-started/03-demos/index.md @@ -33,7 +33,7 @@ The demo projects include small runnable examples and short explainers. - [`NW.js`](https://github.com/SheetJS/SheetJS/tree/master/demos/nwjs/) - [`Chrome / Chromium Extension`](https://github.com/SheetJS/SheetJS/tree/master/demos/chrome/) - [`Google Sheets API`](./gsheet) -- [`ExtendScript for Adobe Apps`](https://github.com/SheetJS/SheetJS/tree/master/demos/extendscript/) +- [`ExtendScript for Adobe Apps`](./extendscript) - [`Headless Browsers`](https://github.com/SheetJS/SheetJS/tree/master/demos/headless/) - [`Other JavaScript Engines`](https://github.com/SheetJS/SheetJS/tree/master/demos/altjs/) - [`"serverless" functions`](https://github.com/SheetJS/SheetJS/tree/master/demos/function/) diff --git a/docz/docs/06-solutions/01-input.md b/docz/docs/06-solutions/01-input.md index 69372bc5..f45eea37 100644 --- a/docz/docs/06-solutions/01-input.md +++ b/docz/docs/06-solutions/01-input.md @@ -338,7 +338,7 @@ request({url: url, encoding: null}, function(err, resp, body) { }); ``` -[`axios`](https://npm.im/axios) works the same way in browser and in NodeJS: +[`axios`](https://axios-http.com/) works the same way in browser and in NodeJS: ```js const XLSX = require("xlsx"); diff --git a/docz/docs/06-solutions/05-output.md b/docz/docs/06-solutions/05-output.md index 34d2c4df..08998859 100644 --- a/docz/docs/06-solutions/05-output.md +++ b/docz/docs/06-solutions/05-output.md @@ -296,10 +296,10 @@ data grid for previewing and modifying structured data in the web browser. The
Previewing data in a React data grid (click to show) -[`react-data-grid`](https://npm.im/react-data-grid) is a data grid tailored for -react. It expects two properties: `rows` of data objects and `columns` which -describe the columns. For the purposes of massaging the data to fit the react -data grid API it is easiest to start from an array of arrays. +[`react-data-grid`](https://adazzle.github.io/react-data-grid) is a data grid +built for React. It uses two properties: `rows` of data objects and `columns` +which describe the columns. For the purposes of massaging the data to fit the +`react-data-grid` API it is easiest to start from an array of arrays. This demo starts by fetching a remote file and using `XLSX.read` to extract: @@ -336,8 +336,9 @@ export default function App() {
Previewing data in a VueJS data grid (click to show) -[`vue3-table-lite`](https://github.com/linmasahiro/vue3-table-lite) is a simple -VueJS 3 data table. It is featured [in the VueJS demo](https://github.com/SheetJS/SheetJS/tree/master/demos/vue/modify/). +[`vue3-table-lite`](https://linmasahiro.github.io/vue3-table-lite/dist/) is a +simple VueJS 3 data table. It is featured in the +[VueJS demo](https://github.com/SheetJS/SheetJS/tree/master/demos/vue/modify/).
diff --git a/docz/docs/07-csf/03-book.md b/docz/docs/07-csf/03-book.md index c7de8818..ee9065c4 100644 --- a/docz/docs/07-csf/03-book.md +++ b/docz/docs/07-csf/03-book.md @@ -67,9 +67,9 @@ XLSX.write(wb, {Props:{Author:"SheetJS"}});
Format Support (click to show) -**Defined Names**: XLSX/M, XLSB, BIFF8 XLS, XLML, SYLK +**Simple Defined Names**: XLSX/M, XLSB, BIFF8 XLS, XLML, ODS, SYLK -**Unicode Defined Names**: XLSX/M, XLSB, BIFF8 XLS, XLML +**Unicode Defined Names**: XLSX/M, XLSB, BIFF8 XLS, XLML, ODS **Defined Name Comment**: XLSX/M, XLSB, BIFF8 XLS diff --git a/docz/docs/index.md b/docz/docs/index.md index 45e8f57f..217c568f 100644 --- a/docz/docs/index.md +++ b/docz/docs/index.md @@ -8,7 +8,7 @@ hide_table_of_contents: true ![License](https://img.shields.io/github/license/SheetJS/sheetjs) [![Build Status](https://img.shields.io/github/workflow/status/sheetjs/sheetjs/Tests:%20node.js)](https://github.com/SheetJS/sheetjs/actions) [![Snyk Vulnerabilities](https://img.shields.io/snyk/vulnerabilities/github/SheetJS/sheetjs)](https://snyk.io/test/github/SheetJS/sheetjs) -[![npm Downloads](https://img.shields.io/npm/dm/xlsx.svg)](https://npmjs.org/package/xlsx) +[![npm Downloads](https://img.shields.io/npm/dm/xlsx.svg)](https://cdn.sheetjs.com/) SheetJS Community Edition offers battle-tested open-source solutions for extracting useful data from almost any complex spreadsheet and generating new @@ -67,7 +67,7 @@ document.getElementById("sheetjsexport").addEventListener('click', function() { function Table2XLSX(props) { /* Callback invoked when the button is clicked */ - const xport = React.useCallback(() => { + const xport = React.useCallback(async () => { /* Create worksheet from HTML DOM TABLE */ const table = document.getElementById("Table2XLSX"); const wb = XLSX.utils.table_to_book(table); diff --git a/docz/static/files/SheetJS.xlsb b/docz/static/files/SheetJS.xlsb new file mode 100644 index 0000000000000000000000000000000000000000..c8f8ff098c1599ba0bfd1e523f3667b0f39ea0b3 GIT binary patch literal 8362 zcmeHsby!qe+y2lUBArTiryvc|3_VCm3?U6egER~wE#07mbV~>fAsj(cDe0C50R@q7 z(DNQV9Dl#>{r-O6eO-IcHP_zj-ZS@lp7q?%y@1L{$b3006L~ z006fE=!ga~jt&s81H?qz%L(ji#OY~ocPAeikvSKD2!H;+$A2&bt=ezZy14OM=??JX zE1BJAkfe)k@PPE3zzEuR6>awU_Zn8+l+RA>M#FPIv5{~_5cpWSpS-8heXgjBU*#ld zZZv0#0a}Hau9KZ-wie>CcQThJ_v-gelE>koH40tyPa`pgG^AFG$zL)fmr^Q4eDtb< z@Ve$D#fx_tdX^Bo;O0+ke#Ba}L#7x5xmHPCl3BXgnDLfwoH8cZnCc(az0y+#t9UzN zGSH#0>gpa5XcZHZ#)wF+Ajg>wDwhON=!*zQ>d{w23%(&>8{>c3qMg0B5Mme9(Yo*X zKv11|oT-S)&Ur8C3}~&;%iArapP;TmcCZ7>uMW-kaC`9);}D_Tka<@+jwFQ3pXbLhGVrhU5E=*6!u5`O>5l zs8y=Xf>6Gm4nx#o8lGXNM)U7DVhobIy`5f#o4CW`axDj?BPC3<=+yxi0aR~CjpKD? zd^&^ECEI-XH|VDGr`&>R;1PIvi39-tEsbS@mU~X&cU0h6iUm(&6Bn?ZD;MY0^}p%+ zADpwl{PpOBA$a;?_wFgQ%B-A!a!^3et8ckeIE&AUx4_^)QUA1nUh?$Bf~lClf$C!K zXeg(3c5tltwXiH(MUb0DkXca=XhLUyq_rYjvPbsaFmnu>uuF)MpMRs@db}oeWZSU@ zn23aJL+fw|s&Oi&!QNf__L(kBmL)t-M%_C%##t*lmh}5$$+lr_A1$fL3^d^2$ok+! z{d4>BHIk8>+bs}Fl*7zPGC?*PUIPU|lLB%~sv^wjjmFFvg*g&3ihZ$>HTV3>%ASbZ zWJ)0q5lz-a+zb&P&f`L6^TBT_MUSBK1YyB_K*}=FwBRV3V*lUfiLW;hBnB^cd+-wv z{)DF;mxrT^t(l{vEvK1{gJHa?va|+%SdRH>>98CY#`H7M2p={9jHQRD96`DH#6b`p z?la)HBy{5hq5h?jEY0~7<(BV?=ecvPyol?(e0!N*>zQe<^uqeSU@NFN$I3+eRyaNg z@mo8vI1)=QX;0S(wiIUba zk|I%vt73x*@s|2=mO7i8t;L&&JVRAnAgUyOq278zEoBW>n~S8+c?TIWg1#o&Woz{wH1{wo78KMFZulg)?6JudE9$;9pA6C z&xuQX=z99xc@b5;*UA11oXUSLNEjE@eBa>&KR^Ni$N}gGaH4;%Nx#zluk{H5E-&CH z|Jg@t!r)bT4T0xpaJ|P8{WtWydu?|Ljq}6;6a}l_cQ>@YRiC3~gC;9HH>8c>V;l0V zv8?}2>U|IvU*>@s$&MCSaq`qHD`i)u=xIJoJ&G{eu8x0Z87`X~Eyx3YGD$zD(BmWQy5Ez``#n4uYK1l{h~C13aK z<{KJ%eN5VMH@+x@u5^d80N>#1cha{H&?@KNiRDXD=50N1q6_Xri)oW{X-=Aoa%=A- zyu{YZ40>fu5EdOXDdw!QT+p>Qu&u?d7X{m&EGpk?lurC!ky86rF9$y9|BN1JYs=Xp z{0mT4Y;kEz7wd8iny+4fAzLv1}WLBQ$Q9We$XBzvvj9w-V+Ke-V!P?k9|<{ zhjT|XgA)JG_R6;$Sq6}AOVKfL%N1_5vgAf2k~jy5mG1uWjYwe+K|5*0RJt>hBf3rw zk8WqA3yKk0A>qd>a2DRr)Ry}CWfIxsSavygAG=_4}+69XvrUoOSzH zbSa^@G3zAaj9-#CNhC${y~rxNQ>=V6KgSyj>y&dw`5=nl(xSGpm$v->r-k<~T7dYW zLmwNa73gM7J0mL?l8K3iXtN9GWm}F&h>iQElNk<(2Ml{nV2byOT-QHVj@>ntTFtT@ z4t;-o*Cv@TBAzgL(MqMS__f=1X8~ji&I`q3-vO^eXd|HuEM%A+Uj<{6m0PY`SR{`f zKi9Hyz&P+TwWJOil_E39{YZu?;ymwN_XUuE*7;&1v1CMI0CC=j$8Uy(Z^1zg)N=oc zDTZ47$-;xL?-cwYDj~sR5 zzSt-M~CTB^>=ekRp;;Ommk>iye8ELb}YGMwV z1d@`j)@`-zr)zEV=Y0MrpX!%W^JHl0R~7k+jVq9$^ml1SEk0uJp0uP0BGMD7g{2;Z z@CUQRch;AC%)g2h(vdX_k`#~6Xd;tUdY-|?#v5YF&UKVTzwgj37fmD+{CS z;;C*5ohK60a?QfqN{O!*Z}CPP)!V(le&LfaPCk(EKOIq*c=8EN8fB2(``~M$N%noO zgPu3-PmU&$=7~LlVW&1K^v$XLNd{|B4p4b#m{sqR2Y!(Cz>|w*)v_coUt2GWAS60ly z&6G{Yn9b$s27fvtliqQv^}(wbKJsdl!8M{MM7E?}J`WM$H-2+F)I8@8@fiKIeFKo3 zIGvBytz>7ak~^d3FyT+w5lP}{qKMx(P%aq5o~+`Wb7u5%YBGB-jCou zlYRJ;nY`dj-*98?w7nytCGE97@RYJA@Xm-a+CSO z)if!)N70{rQVPSM{0MqP7mTb&10*`8&4j&fBe!NSPb;BTPIAFmm*d-hUw%+^s&`VS zKe3KKBSNp+;%gl~@!9FgN9J+Tm%VE$8R~T}h}cD^rk|;>d^urE)T!4{9?}(fk@jL^ zK)0!kMR46Ex77&;6-&_6D)^BEGJ9oLwTU{;I@LfQ@W{bDDZEE^u@XaLt=^3uCSxYE zf}Jv1mOi=4!oQy5KD5^Nb&?%~H2O{uR@k%jO+R79urt~MU(86Aon?Ypd02zbdR%V{ z0n>RJTi$6jG{+fJD$$z@Iz?I$CCy;>AzMG{g@P5e&^LXZ(6>=2D9cICtcBB^yfr-h zl{LU>*&&M^lky2jjZrjGwq;Ewku60W?PV$v{$rs!3x3)>RcO zGj=Tt-cpMSmGUVh7X^^XX@}cvFcP6uX@)~WJwmW(mjAA+u2gXKTtU*-;HE{-sEzHy z-dxk98ETQ*4g=)-+BXtL;+N-k$F+y@VkUHNV>U=?jWjtbF|7`4`D;q%hC{%_3!@Kh zML%S|d3pR%7`oK@h8whPrP+igeMSSiEJjbeFwP?x7oQKGi(EJgUd5BrH5oO+;Z+b) zIJX6yQ;S+BD!!~4w-lureE1q%$mO%l!0iXu^T@2%>pr!r6w zkUfD!z=oM6!c#j^@r+g-HGKC0h;2xX-)~#CtMwCRt56mCz$_*L@QS9?8FzwgYt?d0 z`4bqT5@MP_CPXDIekoqdqmX8jah~h zCyD$h<@D=Tgm+{3DjJ!i`lFwW>1v88PcDKQFQ79)R&?opJe~p!;9EnywL}$sm7Z=(+5MIv>Nm0Mv!^+`UH-lg!WDy-=-5 z(>U8rYRTGX-TcWdZ1n#oFcCJ_L3P-W#e7+{cf z0f7K&?~Bi4PH>U;&)|*tBHZzBG4Mkj|BC^oZf<HxR4Q_Oi5Oe=wLN>X1aR9AgS&%PC9Afma+UtKp?CZcK2!syV@sPc1W-A&2ib>>(qpfaL%o ziKp|wje!#Khn&ptJ3{c2`X4a>PhnFRFGU9nu;-7qX*A&x01@R*G9pi0Ko~M#oDdBw ztgoXl7t2Bj@j#mqF0p^d^1uC#A1wdh-T{DbM=&71)}AJ!KiPo4Jr*9zw*Zs?3rBOH zi=&e(m${=0_)5m>Xk!47JA{RgE z?nq6HVoKB+)^A5)C$1pha=tf6T#mKtd?@af>NT@7qB2DiTAZ~btCK`a7o}z+3R&7Y z=JChZx3GDZnfY8TlR47f-)Ah}aTvuL0_|r&o5=E92ohf0Vr;_4Czn!x>jSg?vXMK~jYptcxdQwsW)fP6r=g z?TA`0=l^c~28=X2hQR3}gVTTycUu0U%+$&0&+VK4`YZ5|%7ptXTip1er&s>xeYc1B z($CC8zTCp9aClA(qOckTHMy^lHw~+#0)GuTUK*i_5(X4G1lcNPm@NZ97StSw#sd zF`Fh`5-bOov05#1PRHUPC)A3yCsi?^GbC9J>gAFWtaDrl)Zf?2bYBt|gN&*$m%Xo?kO%v`hRxZ=YKKRe^B(+KhfZT> z*ToS5kpo@`f4}>9we0+Q{AMo_sQh<;zwdkeI`|Dd9e&vbxjFEr5qv##55D}}u!V09 z{=2z(Jrn={!FN^v-&W^MoSQb+HBvI>Uq9j>rq@lBo379`N;%eVQGTq?H&Jd{DAy>x z*gsHi8Y(vdZYs!Y0Cc$Wfs=BrCvOhDsgkaTnh^aQdQ&sqM7XJet`WL^BK&WP=qBJz zNpTI>Lwu9eUnJJGz_!oXPgm%ob1b^S&8S$}WT-kU%1?^Wps>Yo=F*)Onv)+nGd$`8?j2j7$-MFs$T IDX$*>AFZ4PGynhq literal 0 HcmV?d00001 diff --git a/docz/static/files/psparse.png b/docz/static/files/psparse.png new file mode 100644 index 0000000000000000000000000000000000000000..11e56ff1f6bb61de871327ffdd6ebd3d93215aea GIT binary patch literal 6210 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 literal 0 HcmV?d00001 diff --git a/docz/static/files/pswrite.png b/docz/static/files/pswrite.png new file mode 100644 index 0000000000000000000000000000000000000000..4a793f5f7617940349630753c12e4c547c798333 GIT binary patch literal 7187 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 STJR$eV0IOJrPTP&<9`EO$bqH+ literal 0 HcmV?d00001 diff --git a/docz/static/live/parse.jsx b/docz/static/live/parse.jsx new file mode 100644 index 00000000..e9269b76 --- /dev/null +++ b/docz/static/live/parse.jsx @@ -0,0 +1,22 @@ +#target photoshop +#include "xlsx.extendscript.js"; + +function main_parse() { + /* Show File Picker */ + var thisFile = File.openDialog("Select a spreadsheet"); + if(!thisFile) { alert("File not found!"); return; } + + /* Read file from disk */ + var workbook = XLSX.readFile(thisFile.absoluteURI); + + /* Get Workbook Author */ + var Props = workbook.Props; if(!Props) { alert("Missing Author!"); return; } + var Author = Props.Author; if(!Author) { alert("Missing Author!"); return; } + + /* Change Document Author to Workbook Author */ + var info = activeDocument.info; + alert("Changing Author from |" + info.author + "| to |" + Author + "|"); + info.author = Author; +} + +main_parse(); \ No newline at end of file diff --git a/docz/static/live/write.jsx b/docz/static/live/write.jsx new file mode 100644 index 00000000..97794a21 --- /dev/null +++ b/docz/static/live/write.jsx @@ -0,0 +1,23 @@ +#target photoshop +#include "xlsx.extendscript.js"; + +function main_write() { + /* Show File Picker */ + var thisFile = File.saveDialog("Select an output file", "*.xlsx;*.xls"); + if(!thisFile) { alert("File not found!"); return; } + + /* Create new Worksheet */ + var ws = XLSX.utils.aoa_to_sheet([ + ["Author", activeDocument.info.author] + ]); + + /* Create new Workbook and add worksheet */ + var wb = XLSX.utils.book_new(); + XLSX.utils.book_append_sheet(wb, ws, "Sheet1"); + + /* Write file to disk */ + XLSX.writeFile(wb, thisFile.absoluteURI); + alert("Created File " + thisFile.absoluteURI); +} + +main_write(); \ No newline at end of file