n8n-nodes-base
Version:
Base nodes of n8n
463 lines • 26.5 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.MicrosoftExcelV1 = void 0;
const n8n_workflow_1 = require("n8n-workflow");
const descriptions_1 = require("../../../../utils/descriptions");
const GenericFunctions_1 = require("./GenericFunctions");
const TableDescription_1 = require("./TableDescription");
const WorkbookDescription_1 = require("./WorkbookDescription");
const WorksheetDescription_1 = require("./WorksheetDescription");
const utilities_1 = require("../../../../utils/utilities");
const versionDescription = {
displayName: 'Microsoft Excel',
name: 'microsoftExcel',
icon: 'file:excel.svg',
group: ['input'],
version: 1,
subtitle: '={{$parameter["operation"] + ": " + $parameter["resource"]}}',
description: 'Consume Microsoft Excel API',
defaults: {
name: 'Microsoft Excel',
},
inputs: [n8n_workflow_1.NodeConnectionTypes.Main],
outputs: [n8n_workflow_1.NodeConnectionTypes.Main],
credentials: [
{
name: 'microsoftExcelOAuth2Api',
required: true,
},
],
properties: [
descriptions_1.oldVersionNotice,
{
displayName: 'Resource',
name: 'resource',
type: 'options',
noDataExpression: true,
options: [
{
name: 'Table',
value: 'table',
description: 'Represents an Excel table',
},
{
name: 'Workbook',
value: 'workbook',
description: 'Workbook is the top level object which contains related workbook objects such as worksheets, tables, ranges, etc',
},
{
name: 'Worksheet',
value: 'worksheet',
description: 'An Excel worksheet is a grid of cells. It can contain data, tables, charts, etc.',
},
],
default: 'workbook',
},
...WorkbookDescription_1.workbookOperations,
...WorkbookDescription_1.workbookFields,
...WorksheetDescription_1.worksheetOperations,
...WorksheetDescription_1.worksheetFields,
...TableDescription_1.tableOperations,
...TableDescription_1.tableFields,
],
};
class MicrosoftExcelV1 {
description;
constructor(baseDescription) {
this.description = {
...baseDescription,
...versionDescription,
};
}
methods = {
loadOptions: {
// Get all the workbooks to display them to user so that he can
// select them easily
async getWorkbooks() {
const qs = {
select: 'id,name',
};
const returnData = [];
const workbooks = await GenericFunctions_1.microsoftApiRequestAllItems.call(this, 'value', 'GET', "/drive/root/search(q='.xlsx')", {}, qs);
for (const workbook of workbooks) {
const workbookName = workbook.name;
const workbookId = workbook.id;
returnData.push({
name: workbookName,
value: workbookId,
});
}
return returnData;
},
// Get all the worksheets to display them to user so that he can
// select them easily
async getworksheets() {
const workbookId = this.getCurrentNodeParameter('workbook');
const qs = {
select: 'id,name',
};
const returnData = [];
const worksheets = await GenericFunctions_1.microsoftApiRequestAllItems.call(this, 'value', 'GET', `/drive/items/${workbookId}/workbook/worksheets`, {}, qs);
for (const worksheet of worksheets) {
const worksheetName = worksheet.name;
const worksheetId = worksheet.id;
returnData.push({
name: worksheetName,
value: worksheetId,
});
}
return returnData;
},
// Get all the tables to display them to user so that he can
// select them easily
async getTables() {
const workbookId = this.getCurrentNodeParameter('workbook');
const worksheetId = this.getCurrentNodeParameter('worksheet');
const qs = {
select: 'id,name',
};
const returnData = [];
const tables = await GenericFunctions_1.microsoftApiRequestAllItems.call(this, 'value', 'GET', `/drive/items/${workbookId}/workbook/worksheets/${worksheetId}/tables`, {}, qs);
for (const table of tables) {
const tableName = table.name;
const tableId = table.id;
returnData.push({
name: tableName,
value: tableId,
});
}
return returnData;
},
},
};
async execute() {
const items = this.getInputData();
const itemData = (0, utilities_1.generatePairedItemData)(items.length);
const returnData = [];
const length = items.length;
let qs = {};
const result = [];
let responseData;
const resource = this.getNodeParameter('resource', 0);
const operation = this.getNodeParameter('operation', 0);
if (resource === 'table') {
//https://docs.microsoft.com/en-us/graph/api/table-post-rows?view=graph-rest-1.0&tabs=http
if (operation === 'addRow') {
try {
// TODO: At some point it should be possible to use item dependent parameters.
// Is however important to then not make one separate request each.
const workbookId = this.getNodeParameter('workbook', 0);
const worksheetId = this.getNodeParameter('worksheet', 0);
const tableId = this.getNodeParameter('table', 0);
const additionalFields = this.getNodeParameter('additionalFields', 0);
const body = {};
if (additionalFields.index) {
body.index = additionalFields.index;
}
// Get table columns to eliminate any columns not needed on the input
responseData = await GenericFunctions_1.microsoftApiRequest.call(this, 'GET', `/drive/items/${workbookId}/workbook/worksheets/${worksheetId}/tables/${tableId}/columns`, {}, qs);
const columns = responseData.value.map((column) => column.name);
const rows = [];
// Bring the items into the correct format
for (const item of items) {
const row = [];
for (const column of columns) {
row.push(item.json[column]);
}
rows.push(row);
}
body.values = rows;
const { id } = await GenericFunctions_1.microsoftApiRequest.call(this, 'POST', `/drive/items/${workbookId}/workbook/createSession`, { persistChanges: true });
responseData = await GenericFunctions_1.microsoftApiRequest.call(this, 'POST', `/drive/items/${workbookId}/workbook/worksheets/${worksheetId}/tables/${tableId}/rows/add`, body, {}, '', { 'workbook-session-id': id });
await GenericFunctions_1.microsoftApiRequest.call(this, 'POST', `/drive/items/${workbookId}/workbook/closeSession`, {}, {}, '', { 'workbook-session-id': id });
const executionData = this.helpers.constructExecutionMetaData(this.helpers.returnJsonArray(responseData), { itemData });
returnData.push(...executionData);
}
catch (error) {
if (this.continueOnFail()) {
const executionErrorData = this.helpers.constructExecutionMetaData(this.helpers.returnJsonArray({ error: error.message }), { itemData });
returnData.push(...executionErrorData);
}
else {
throw error;
}
}
}
//https://docs.microsoft.com/en-us/graph/api/table-list-columns?view=graph-rest-1.0&tabs=http
if (operation === 'getColumns') {
for (let i = 0; i < length; i++) {
try {
qs = {};
const workbookId = this.getNodeParameter('workbook', i);
const worksheetId = this.getNodeParameter('worksheet', i);
const tableId = this.getNodeParameter('table', i);
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;
}
}
if (returnAll) {
responseData = await GenericFunctions_1.microsoftApiRequestAllItemsSkip.call(this, 'value', 'GET', `/drive/items/${workbookId}/workbook/worksheets/${worksheetId}/tables/${tableId}/columns`, {}, qs);
}
else {
qs.$top = this.getNodeParameter('limit', i);
responseData = await GenericFunctions_1.microsoftApiRequest.call(this, 'GET', `/drive/items/${workbookId}/workbook/worksheets/${worksheetId}/tables/${tableId}/columns`, {}, qs);
responseData = responseData.value;
}
if (!rawData) {
responseData = responseData.map((column) => ({ name: column.name }));
}
else {
const dataProperty = this.getNodeParameter('dataProperty', i);
responseData = { [dataProperty]: responseData };
}
const executionData = this.helpers.constructExecutionMetaData(this.helpers.returnJsonArray(responseData), { 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;
}
}
}
//https://docs.microsoft.com/en-us/graph/api/table-list-rows?view=graph-rest-1.0&tabs=http
if (operation === 'getRows') {
for (let i = 0; i < length; i++) {
qs = {};
try {
const workbookId = this.getNodeParameter('workbook', i);
const worksheetId = this.getNodeParameter('worksheet', i);
const tableId = this.getNodeParameter('table', i);
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;
}
}
if (returnAll) {
responseData = await GenericFunctions_1.microsoftApiRequestAllItemsSkip.call(this, 'value', 'GET', `/drive/items/${workbookId}/workbook/worksheets/${worksheetId}/tables/${tableId}/rows`, {}, qs);
}
else {
const rowsQs = { ...qs };
rowsQs.$top = this.getNodeParameter('limit', i);
responseData = await GenericFunctions_1.microsoftApiRequest.call(this, 'GET', `/drive/items/${workbookId}/workbook/worksheets/${worksheetId}/tables/${tableId}/rows`, {}, rowsQs);
responseData = responseData.value;
}
if (!rawData) {
const columnsQs = { ...qs };
columnsQs.$select = 'name';
// TODO: That should probably be cached in the future
let columns = await GenericFunctions_1.microsoftApiRequestAllItemsSkip.call(this, 'value', 'GET', `/drive/items/${workbookId}/workbook/worksheets/${worksheetId}/tables/${tableId}/columns`, {}, columnsQs);
columns = columns.map((column) => column.name);
for (let index = 0; index < responseData.length; index++) {
const object = {};
for (let y = 0; y < columns.length; y++) {
object[columns[y]] = responseData[index].values[0][y];
}
const executionData = this.helpers.constructExecutionMetaData(this.helpers.returnJsonArray({ ...object }), { itemData: { item: index } });
returnData.push(...executionData);
}
}
else {
const dataProperty = this.getNodeParameter('dataProperty', i);
const executionData = this.helpers.constructExecutionMetaData(this.helpers.returnJsonArray({ [dataProperty]: responseData }), { 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;
}
}
}
if (operation === 'lookup') {
for (let i = 0; i < length; i++) {
qs = {};
try {
const workbookId = this.getNodeParameter('workbook', i);
const worksheetId = this.getNodeParameter('worksheet', i);
const tableId = this.getNodeParameter('table', i);
const lookupColumn = this.getNodeParameter('lookupColumn', i);
const lookupValue = this.getNodeParameter('lookupValue', i);
const options = this.getNodeParameter('options', i);
responseData = await GenericFunctions_1.microsoftApiRequestAllItemsSkip.call(this, 'value', 'GET', `/drive/items/${workbookId}/workbook/worksheets/${worksheetId}/tables/${tableId}/rows`, {}, {});
qs.$select = 'name';
// TODO: That should probably be cached in the future
let columns = await GenericFunctions_1.microsoftApiRequestAllItemsSkip.call(this, 'value', 'GET', `/drive/items/${workbookId}/workbook/worksheets/${worksheetId}/tables/${tableId}/columns`, {}, qs);
columns = columns.map((column) => column.name);
if (!columns.includes(lookupColumn)) {
throw new n8n_workflow_1.NodeApiError(this.getNode(), responseData, {
message: `Column ${lookupColumn} does not exist on the table selected`,
});
}
result.length = 0;
for (let index = 0; index < responseData.length; index++) {
const object = {};
for (let y = 0; y < columns.length; y++) {
object[columns[y]] = responseData[index].values[0][y];
}
result.push({ ...object });
}
if (options.returnAllMatches) {
responseData = result.filter((data) => {
return data[lookupColumn]?.toString() === lookupValue;
});
const executionData = this.helpers.constructExecutionMetaData(this.helpers.returnJsonArray(responseData), { itemData: { item: i } });
returnData.push(...executionData);
}
else {
responseData = result.find((data) => {
return data[lookupColumn]?.toString() === lookupValue;
});
const executionData = this.helpers.constructExecutionMetaData(this.helpers.returnJsonArray(responseData), { 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;
}
}
}
}
if (resource === 'workbook') {
for (let i = 0; i < length; i++) {
qs = {};
try {
//https://docs.microsoft.com/en-us/graph/api/worksheetcollection-add?view=graph-rest-1.0&tabs=http
if (operation === 'addWorksheet') {
const workbookId = this.getNodeParameter('workbook', i);
const additionalFields = this.getNodeParameter('additionalFields', i);
const body = {};
if (additionalFields.name) {
body.name = additionalFields.name;
}
const { id } = await GenericFunctions_1.microsoftApiRequest.call(this, 'POST', `/drive/items/${workbookId}/workbook/createSession`, { persistChanges: true });
responseData = await GenericFunctions_1.microsoftApiRequest.call(this, 'POST', `/drive/items/${workbookId}/workbook/worksheets/add`, body, {}, '', { 'workbook-session-id': id });
await GenericFunctions_1.microsoftApiRequest.call(this, 'POST', `/drive/items/${workbookId}/workbook/closeSession`, {}, {}, '', { 'workbook-session-id': id });
}
if (operation === 'getAll') {
const returnAll = this.getNodeParameter('returnAll', i);
const filters = this.getNodeParameter('filters', i);
if (filters.fields) {
qs.$select = filters.fields;
}
if (returnAll) {
responseData = await GenericFunctions_1.microsoftApiRequestAllItems.call(this, 'value', 'GET', "/drive/root/search(q='.xlsx')", {}, qs);
}
else {
qs.$top = this.getNodeParameter('limit', i);
responseData = await GenericFunctions_1.microsoftApiRequest.call(this, 'GET', "/drive/root/search(q='.xlsx')", {}, qs);
responseData = responseData.value;
}
}
if (Array.isArray(responseData)) {
const executionData = this.helpers.constructExecutionMetaData(this.helpers.returnJsonArray(responseData), { itemData: { item: i } });
returnData.push(...executionData);
}
else if (responseData !== undefined) {
const executionData = this.helpers.constructExecutionMetaData(this.helpers.returnJsonArray(responseData), { 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;
}
}
}
if (resource === 'worksheet') {
for (let i = 0; i < length; i++) {
qs = {};
try {
//https://docs.microsoft.com/en-us/graph/api/workbook-list-worksheets?view=graph-rest-1.0&tabs=http
if (operation === 'getAll') {
const returnAll = this.getNodeParameter('returnAll', i);
const workbookId = this.getNodeParameter('workbook', i);
const filters = this.getNodeParameter('filters', i);
if (filters.fields) {
qs.$select = filters.fields;
}
if (returnAll) {
responseData = await GenericFunctions_1.microsoftApiRequestAllItems.call(this, 'value', 'GET', `/drive/items/${workbookId}/workbook/worksheets`, {}, qs);
}
else {
qs.$top = this.getNodeParameter('limit', i);
responseData = await GenericFunctions_1.microsoftApiRequest.call(this, 'GET', `/drive/items/${workbookId}/workbook/worksheets`, {}, qs);
responseData = responseData.value;
}
}
//https://docs.microsoft.com/en-us/graph/api/worksheet-range?view=graph-rest-1.0&tabs=http
if (operation === 'getContent') {
const workbookId = this.getNodeParameter('workbook', i);
const worksheetId = this.getNodeParameter('worksheet', i);
const range = this.getNodeParameter('range', i);
const rawData = this.getNodeParameter('rawData', i);
if (rawData) {
const filters = this.getNodeParameter('filters', i);
if (filters.fields) {
qs.$select = filters.fields;
}
}
responseData = await GenericFunctions_1.microsoftApiRequest.call(this, 'GET', `/drive/items/${workbookId}/workbook/worksheets/${worksheetId}/range(address='${range}')`, {}, qs);
if (!rawData) {
const keyRow = this.getNodeParameter('keyRow', i);
const dataStartRow = this.getNodeParameter('dataStartRow', i);
if (responseData.values === null) {
throw new n8n_workflow_1.NodeApiError(this.getNode(), responseData, {
message: 'Range did not return data',
});
}
const keyValues = responseData.values[keyRow];
for (let index = dataStartRow; index < responseData.values.length; index++) {
const object = {};
for (let y = 0; y < keyValues.length; y++) {
object[keyValues[y]] = responseData.values[index][y];
}
const executionData = this.helpers.constructExecutionMetaData(this.helpers.returnJsonArray({ ...object }), { itemData: { item: index } });
returnData.push(...executionData);
}
}
else {
const dataProperty = this.getNodeParameter('dataProperty', i);
const executionData = this.helpers.constructExecutionMetaData(this.helpers.returnJsonArray({ [dataProperty]: responseData }), { 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];
}
}
exports.MicrosoftExcelV1 = MicrosoftExcelV1;
//# sourceMappingURL=MicrosoftExcelV1.node.js.map