feat(google-sheets): create spreadsheet row

This commit is contained in:
Rıdvan Akca
2023-05-25 18:22:54 +03:00
committed by Ali BARIN
parent 078b8efb56
commit 3fd1d4d9b3
11 changed files with 285 additions and 5 deletions

View File

@@ -0,0 +1,145 @@
import defineAction from '../../../../helpers/define-action';
type TSheetsResponse = {
sheets: {
properties: {
sheetId: string;
title: string;
};
}[];
};
export default defineAction({
name: 'Create Spreadsheet Row',
key: 'createSpreadsheetRow',
description: 'Creates a new row in a specific spreadsheet.',
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: false,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listDrives',
},
],
},
},
{
label: 'Spreadsheet',
key: 'spreadsheetId',
type: 'dropdown' as const,
required: true,
dependsOn: ['parameters.driveId'],
description: 'The spreadsheets in your Google Drive.',
variables: false,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listSpreadsheets',
},
{
name: 'parameters.driveId',
value: '{parameters.driveId}',
},
],
},
},
{
label: 'Worksheet',
key: 'worksheetId',
type: 'dropdown' as const,
required: true,
dependsOn: ['parameters.spreadsheetId'],
description: 'The worksheets in your selected spreadsheet.',
variables: false,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listWorksheets',
},
{
name: 'parameters.spreadsheetId',
value: '{parameters.spreadsheetId}',
},
],
},
additionalFields: {
type: 'query',
name: 'getDynamicFields',
arguments: [
{
name: 'key',
value: 'listSheetHeaders',
},
{
name: 'parameters.worksheetId',
value: '{parameters.worksheetId}',
},
{
name: 'parameters.spreadsheetId',
value: '{parameters.spreadsheetId}',
},
],
},
},
],
async run($) {
const {
data: { sheets },
} = await $.http.get<TSheetsResponse>(
`/v4/spreadsheets/${$.step.parameters.spreadsheetId}`
);
const selectedSheet = sheets.find(
(sheet) => sheet.properties.sheetId === $.step.parameters.worksheetId
);
const sheetName = selectedSheet.properties.title;
const range = sheetName;
const dataValues = Object.entries($.step.parameters)
.filter((entry: [string, string]) => entry[0].startsWith('header-'))
.map((value) => value[1]);
const values = [dataValues];
const params = {
valueInputOption: 'USER_ENTERED',
insertDataOption: 'INSERT_ROWS',
includeValuesInResponse: true,
};
const body = {
majorDimension: 'ROWS',
range,
values,
};
const { data } = await $.http.post(
`/v4/spreadsheets/${$.step.parameters.spreadsheetId}/values/${range}:append`,
body,
{ params }
);
$.setActionItem({
raw: data,
});
},
});

View File

@@ -0,0 +1,3 @@
import createSpreadsheetRow from './create-spreadsheet-row';
export default [createSpreadsheetRow];

View File

@@ -1,4 +1,5 @@
import listDrives from './list-drives';
import listSpreadsheets from './list-spreadsheets';
import listWorksheets from './list-worksheets';
export default [listDrives, listSpreadsheets];
export default [listDrives, listSpreadsheets, listWorksheets];

View File

@@ -0,0 +1,42 @@
import { IGlobalVariable, IJSONObject } from '@automatisch/types';
export default {
name: 'List worksheets',
key: 'listWorksheets',
async run($: IGlobalVariable) {
const spreadsheetId = $.step.parameters.spreadsheetId as string;
const worksheets: {
data: IJSONObject[];
} = {
data: [],
};
if (!spreadsheetId) {
return worksheets;
}
const params: Record<string, unknown> = {
pageToken: undefined as unknown as string,
};
do {
const { data } = await $.http.get(`/v4/spreadsheets/${spreadsheetId}`, {
params,
});
params.pageToken = data.nextPageToken;
if (data.sheets?.length) {
for (const sheet of data.sheets) {
worksheets.data.push({
value: sheet.properties.sheetId,
name: sheet.properties.title,
});
}
}
} while (params.pageToken);
return worksheets;
},
};

View File

@@ -0,0 +1,3 @@
import listSheetHeaders from './list-sheet-headers';
export default [listSheetHeaders];

View File

@@ -0,0 +1,67 @@
import { IGlobalVariable } from '@automatisch/types';
type TSheetsResponse = {
sheets: {
properties: {
sheetId: string;
title: string;
};
}[];
};
type TSheetsValueResponse = {
majorDimension: string;
range: string;
values: string[][];
};
export default {
name: 'List Sheet Headers',
key: 'listSheetHeaders',
async run($: IGlobalVariable) {
if (!$.step.parameters.spreadsheetId || !$.step.parameters.worksheetId) {
return;
}
const {
data: { sheets },
} = await $.http.get<TSheetsResponse>(
`/v4/spreadsheets/${$.step.parameters.spreadsheetId}`
);
const selectedSheet = sheets.find(
(sheet) => sheet.properties.sheetId === $.step.parameters.worksheetId
);
const sheetName = selectedSheet.properties.title;
const range = `${sheetName}!1:1`;
const params: Record<string, unknown> = {
majorDimension: 'ROWS',
};
const { data } = await $.http.get<TSheetsValueResponse>(
`/v4/spreadsheets/${$.step.parameters.spreadsheetId}/values/${range}`,
{
params,
}
);
if (!data.values) {
return;
}
const result = data.values[0].map((item: string, index: number) => ({
label: item,
key: `header-${index}`,
type: 'string' as const,
required: false,
value: item,
variables: true,
}));
return result;
},
};

View File

@@ -2,7 +2,9 @@ import defineApp from '../../helpers/define-app';
import addAuthHeader from './common/add-auth-header';
import auth from './auth';
import triggers from './triggers';
import actions from './actions';
import dynamicData from './dynamic-data';
import dynamicFields from './dynamic-fields';
export default defineApp({
name: 'Google Sheets',
@@ -16,5 +18,7 @@ export default defineApp({
beforeRequest: [addAuthHeader],
auth,
triggers,
actions,
dynamicData,
dynamicFields,
});