From 1fe0cd9f84febba427bf3d852431d90bf55ffb2f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C4=B1dvan=20Akca?= Date: Fri, 1 Dec 2023 13:59:39 +0300 Subject: [PATCH] feat(google-sheets): add find worksheet action --- .../actions/find-worksheet/index.js | 175 ++++++++++++++++++ .../src/apps/google-sheets/actions/index.js | 8 +- .../google-sheets/dynamic-fields/index.js | 3 +- .../list-create-worksheet-fields/index.js | 26 +++ .../docs/pages/apps/google-sheets/actions.md | 2 + 5 files changed, 212 insertions(+), 2 deletions(-) create mode 100644 packages/backend/src/apps/google-sheets/actions/find-worksheet/index.js create mode 100644 packages/backend/src/apps/google-sheets/dynamic-fields/list-create-worksheet-fields/index.js diff --git a/packages/backend/src/apps/google-sheets/actions/find-worksheet/index.js b/packages/backend/src/apps/google-sheets/actions/find-worksheet/index.js new file mode 100644 index 00000000..b7390966 --- /dev/null +++ b/packages/backend/src/apps/google-sheets/actions/find-worksheet/index.js @@ -0,0 +1,175 @@ +import defineAction from '../../../../helpers/define-action.js'; + +export default defineAction({ + name: 'Find worksheet', + key: 'findWorksheet', + description: + 'Finds a worksheet by title. Optionally, create a worksheet if none are found.', + arguments: [ + { + label: 'Drive', + key: 'driveId', + type: 'dropdown', + 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', + 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', + required: true, + description: + 'The worksheet title needs to match exactly, and the search is case-sensitive.', + variables: true, + }, + { + label: 'Create worksheet if none are found.', + key: 'createWorksheet', + type: 'dropdown', + required: false, + options: [ + { label: 'Yes', value: true }, + { label: 'No', value: false }, + ], + additionalFields: { + type: 'query', + name: 'getDynamicFields', + arguments: [ + { + name: 'key', + value: 'listCreateWorksheetFields', + }, + { + name: 'parameters.createWorksheet', + value: '{parameters.createWorksheet}', + }, + ], + }, + }, + ], + + async run($) { + const createWorksheet = $.step.parameters.createWorksheet; + + async function findWorksheet() { + const { + data: { sheets }, + } = await $.http.get(`/v4/spreadsheets/${$.step.parameters.spreadsheetId}`); + + const selectedSheet = sheets.find( + (sheet) => sheet.properties.title === $.step.parameters.title + ); + + return selectedSheet; + } + + const selectedSheet = await findWorksheet(); + + if (selectedSheet) { + $.setActionItem({ + raw: selectedSheet, + }); + + return; + } + + if (createWorksheet) { + const headers = $.step.parameters.headers; + const headerValues = headers.map((entry) => entry.header); + + const body = { + requests: [ + { + addSheet: { + properties: { + title: $.step.parameters.title, + }, + }, + }, + ], + }; + + const { data } = await $.http.post( + `/v4/spreadsheets/${$.step.parameters.spreadsheetId}:batchUpdate`, + body + ); + + if (headerValues.length) { + const body = { + requests: [ + { + updateCells: { + rows: [ + { + values: headerValues.map((header) => ({ + userEnteredValue: { stringValue: header }, + })), + }, + ], + fields: '*', + start: { + sheetId: + data.replies[data.replies.length - 1].addSheet.properties + .sheetId, + rowIndex: 0, + columnIndex: 0, + }, + }, + }, + ], + }; + + await $.http.post( + `/v4/spreadsheets/${$.step.parameters.spreadsheetId}:batchUpdate`, + body + ); + + const createdSheet = await findWorksheet(); + + $.setActionItem({ + raw: createdSheet, + }); + + return; + } + } + + $.setActionItem({ + raw: null, + }); + }, +}); diff --git a/packages/backend/src/apps/google-sheets/actions/index.js b/packages/backend/src/apps/google-sheets/actions/index.js index b5143cc2..053143c8 100644 --- a/packages/backend/src/apps/google-sheets/actions/index.js +++ b/packages/backend/src/apps/google-sheets/actions/index.js @@ -1,5 +1,11 @@ import createSpreadsheet from './create-spreadsheet/index.js'; import createSpreadsheetRow from './create-spreadsheet-row/index.js'; import createWorksheet from './create-worksheet/index.js'; +import findWorksheet from './find-worksheet/index.js'; -export default [createSpreadsheet, createSpreadsheetRow, createWorksheet]; +export default [ + createSpreadsheet, + createSpreadsheetRow, + createWorksheet, + findWorksheet, +]; diff --git a/packages/backend/src/apps/google-sheets/dynamic-fields/index.js b/packages/backend/src/apps/google-sheets/dynamic-fields/index.js index 0a8bc04b..0a413613 100644 --- a/packages/backend/src/apps/google-sheets/dynamic-fields/index.js +++ b/packages/backend/src/apps/google-sheets/dynamic-fields/index.js @@ -1,3 +1,4 @@ import listSheetHeaders from './list-sheet-headers/index.js'; +import listCreateWorksheetFields from './list-create-worksheet-fields/index.js'; -export default [listSheetHeaders]; +export default [listSheetHeaders, listCreateWorksheetFields]; diff --git a/packages/backend/src/apps/google-sheets/dynamic-fields/list-create-worksheet-fields/index.js b/packages/backend/src/apps/google-sheets/dynamic-fields/list-create-worksheet-fields/index.js new file mode 100644 index 00000000..46f7f89b --- /dev/null +++ b/packages/backend/src/apps/google-sheets/dynamic-fields/list-create-worksheet-fields/index.js @@ -0,0 +1,26 @@ +export default { + name: 'List create worksheet fields', + key: 'listCreateWorksheetFields', + + async run($) { + if ($.step.parameters.createWorksheet) { + return [ + { + label: 'Headers', + key: 'headers', + type: 'dynamic', + required: false, + fields: [ + { + label: 'Header', + key: 'header', + type: 'string', + required: true, + variables: true, + }, + ], + }, + ]; + } + }, +}; diff --git a/packages/docs/pages/apps/google-sheets/actions.md b/packages/docs/pages/apps/google-sheets/actions.md index 63ae0910..caf6137d 100644 --- a/packages/docs/pages/apps/google-sheets/actions.md +++ b/packages/docs/pages/apps/google-sheets/actions.md @@ -7,6 +7,8 @@ items: desc: Creates a new row in a specific spreadsheet. - name: Create worksheet desc: Create a blank worksheet with a title. Optionally, provide headers. + - name: Find worksheet + desc: Finds a worksheet by title. Optionally, create a worksheet if none are found. ---