import type { IDataObject, IExecuteFunctions, INodeExecutionData, INodeProperties, } from 'n8n-workflow'; import { microsoftApiRequest, microsoftApiRequestAllItemsSkip } from '../../transport'; import { tableRLC, workbookRLC, worksheetRLC } from '../common.descriptions'; import { updateDisplayOptions } from '@utils/utilities'; const properties: INodeProperties[] = [ workbookRLC, worksheetRLC, tableRLC, { displayName: 'Return All', name: 'returnAll', type: 'boolean', default: false, description: 'Whether to return all results or only up to a given limit', }, { displayName: 'Limit', name: 'limit', type: 'number', displayOptions: { show: { returnAll: [false], }, }, typeOptions: { minValue: 1, maxValue: 500, }, default: 100, description: 'Max number of results to return', }, { displayName: 'RAW Data', name: 'rawData', type: 'boolean', default: false, description: 'Whether the data should be returned RAW instead of parsed into keys according to their header', }, { displayName: 'Data Property', name: 'dataProperty', type: 'string', default: 'data', displayOptions: { show: { rawData: [true], }, }, description: 'The name of the property into which to write the RAW data', }, { displayName: 'Filters', name: 'filters', type: 'collection', placeholder: 'Add Filter', default: {}, displayOptions: { show: { rawData: [true], }, }, options: [ { displayName: 'Fields', name: 'fields', type: 'string', default: '', description: 'A comma-separated list of the fields to include in the response', }, ], }, ]; const displayOptions = { show: { resource: ['table'], operation: ['getColumns'], }, }; export const description = updateDisplayOptions(displayOptions, properties); export async function execute( this: IExecuteFunctions, items: INodeExecutionData[], ): Promise { //https://docs.microsoft.com/en-us/graph/api/table-list-columns?view=graph-rest-1.0&tabs=http const returnData: INodeExecutionData[] = []; for (let i = 0; i < items.length; i++) { try { const qs: IDataObject = {}; const workbookId = this.getNodeParameter('workbook', i, undefined, { extractValue: true, }) as string; const worksheetId = this.getNodeParameter('worksheet', i, undefined, { extractValue: true, }) as string; const tableId = this.getNodeParameter('table', i, undefined, { extractValue: true, }) as string; const returnAll = this.getNodeParameter('returnAll', i); const rawData = this.getNodeParameter('rawData', i); if (rawData) { const filters = this.getNodeParameter('filters', i); if (filters.fields) { qs.$select = filters.fields; } } let responseData; if (returnAll) { responseData = await microsoftApiRequestAllItemsSkip.call( this, 'value', 'GET', `/drive/items/${workbookId}/workbook/worksheets/${worksheetId}/tables/${tableId}/columns`, {}, qs, ); } else { qs.$top = this.getNodeParameter('limit', i); responseData = await microsoftApiRequest.call( this, 'GET', `/drive/items/${workbookId}/workbook/worksheets/${worksheetId}/tables/${tableId}/columns`, {}, qs, ); responseData = responseData.value; } if (!rawData) { responseData = responseData.map((column: IDataObject) => ({ name: column.name })); } else { const dataProperty = this.getNodeParameter('dataProperty', i) as string; responseData = { [dataProperty]: responseData }; } const executionData = this.helpers.constructExecutionMetaData( this.helpers.returnJsonArray(responseData as IDataObject[]), { itemData: { item: i } }, ); returnData.push(...executionData); } catch (error) { if (this.continueOnFail()) { const executionErrorData = this.helpers.constructExecutionMetaData( this.helpers.returnJsonArray({ error: error.message }), { itemData: { item: i } }, ); returnData.push(...executionErrorData); continue; } throw error; } } return returnData; }