From 0dd444d50b9276b4c68b8cb1254109b1fc436ace Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C4=B1dvan=20Akca?= Date: Fri, 30 Jun 2023 19:02:16 +0300 Subject: [PATCH] feat(google-sheets): add create worksheet action --- .../actions/create-worksheet/index.ts | 191 ++++++++++++++++++ .../src/apps/google-sheets/actions/index.ts | 3 +- .../docs/pages/apps/google-sheets/actions.md | 2 + 3 files changed, 195 insertions(+), 1 deletion(-) create mode 100644 packages/backend/src/apps/google-sheets/actions/create-worksheet/index.ts diff --git a/packages/backend/src/apps/google-sheets/actions/create-worksheet/index.ts b/packages/backend/src/apps/google-sheets/actions/create-worksheet/index.ts new file mode 100644 index 00000000..9a1abe81 --- /dev/null +++ b/packages/backend/src/apps/google-sheets/actions/create-worksheet/index.ts @@ -0,0 +1,191 @@ +import { IJSONObject } from '@automatisch/types'; +import defineAction from '../../../../helpers/define-action'; + +type THeaders = { + __id: string; + header: string; +}[]; + +type TSheetsResponse = { + sheets: { + properties: { + sheetId: string; + title: string; + }; + }[]; +}; + +type TBody = { + requests: IJSONObject[]; +}; + +export default defineAction({ + name: 'Create worksheet', + key: 'createWorksheet', + description: + 'Create a blank worksheet with a title. Optionally, provide headers.', + arguments: [ + { + label: 'Drive', + key: 'driveId', + type: 'dropdown' as const, + required: false, + description: + 'The Google Drive where your spreadsheet resides. If nothing is selected, then your personal Google Drive will be used.', + variables: true, + source: { + type: 'query', + name: 'getDynamicData', + arguments: [ + { + name: 'key', + value: 'listDrives', + }, + ], + }, + }, + { + label: 'Spreadsheet', + key: 'spreadsheetId', + type: 'dropdown' as const, + required: true, + dependsOn: ['parameters.driveId'], + variables: true, + source: { + type: 'query', + name: 'getDynamicData', + arguments: [ + { + name: 'key', + value: 'listSpreadsheets', + }, + { + name: 'parameters.driveId', + value: '{parameters.driveId}', + }, + ], + }, + }, + { + label: 'Title', + key: 'title', + type: 'string' as const, + required: true, + description: '', + variables: true, + }, + { + label: 'Headers', + key: 'headers', + type: 'dynamic' as const, + required: false, + fields: [ + { + label: 'Header', + key: 'header', + type: 'string' as const, + required: true, + variables: true, + }, + ], + }, + { + label: 'Overwrite', + key: 'overwrite', + type: 'dropdown' as const, + required: false, + value: false, + description: + 'If a worksheet with the specified title exists, its content would be lost. Please, use with caution.', + variables: true, + options: [ + { + label: 'Yes', + value: 'true', + }, + { + label: 'No', + value: 'false', + }, + ], + }, + ], + + async run($) { + const { + data: { sheets }, + } = await $.http.get( + `/v4/spreadsheets/${$.step.parameters.spreadsheetId}` + ); + const selectedSheet = sheets.find( + (sheet) => sheet.properties.title === $.step.parameters.title + ); + const headers = $.step.parameters.headers as THeaders; + const values = headers.map((entry) => entry.header); + + const body: TBody = { + requests: [ + { + addSheet: { + properties: { + title: $.step.parameters.title, + }, + }, + }, + ], + }; + + if ($.step.parameters.overwrite === 'true' && selectedSheet) { + body.requests.unshift({ + deleteSheet: { + sheetId: selectedSheet.properties.sheetId, + }, + }); + } + + const { data } = await $.http.post( + `https://sheets.googleapis.com/v4/spreadsheets/${$.step.parameters.spreadsheetId}:batchUpdate`, + body + ); + + if (values.length) { + const body = { + requests: [ + { + updateCells: { + rows: [ + { + values: values.map((header) => ({ + userEnteredValue: { stringValue: header }, + })), + }, + ], + fields: '*', + start: { + sheetId: + data.replies[data.replies.length - 1].addSheet.properties + .sheetId, + rowIndex: 0, + columnIndex: 0, + }, + }, + }, + ], + }; + + const { data: response } = await $.http.post( + `https://sheets.googleapis.com/v4/spreadsheets/${$.step.parameters.spreadsheetId}:batchUpdate`, + body + ); + + $.setActionItem({ + raw: response, + }); + return; + } + + $.setActionItem({ + raw: data, + }); + }, +}); diff --git a/packages/backend/src/apps/google-sheets/actions/index.ts b/packages/backend/src/apps/google-sheets/actions/index.ts index 40e375bb..5608ae22 100644 --- a/packages/backend/src/apps/google-sheets/actions/index.ts +++ b/packages/backend/src/apps/google-sheets/actions/index.ts @@ -1,4 +1,5 @@ import createSpreadsheet from './create-spreadsheet'; import createSpreadsheetRow from './create-spreadsheet-row'; +import createWorksheet from './create-worksheet'; -export default [createSpreadsheet, createSpreadsheetRow]; +export default [createSpreadsheet, createSpreadsheetRow, createWorksheet]; diff --git a/packages/docs/pages/apps/google-sheets/actions.md b/packages/docs/pages/apps/google-sheets/actions.md index 51c66a08..63ae0910 100644 --- a/packages/docs/pages/apps/google-sheets/actions.md +++ b/packages/docs/pages/apps/google-sheets/actions.md @@ -5,6 +5,8 @@ items: desc: Create a blank spreadsheet or duplicate an existing spreadsheet. Optionally, provide headers. - name: Create spreadsheet row desc: Creates a new row in a specific spreadsheet. + - name: Create worksheet + desc: Create a blank worksheet with a title. Optionally, provide headers. ---