fix(Google Sheets Node): Fix "Append or Update" on an empty sheet (#9175)

Co-authored-by: Michael Kret <michael.k@radency.com>
This commit is contained in:
Elias Meire 2024-04-23 10:29:39 +02:00 committed by GitHub
parent f5ccb5fe33
commit 29ee4fab61
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 24 additions and 11 deletions

View file

@ -19,6 +19,7 @@ import { fieldCannotBeDeleted, parseResourceMapperFieldName } from '@/utils/node
import { isResourceMapperValue } from '@/utils/typeGuards';
import { i18n as locale } from '@/plugins/i18n';
import { useNDVStore } from '@/stores/ndv.store';
import { useWorkflowsStore } from '@/stores/workflows.store';
type Props = {
parameter: INodeProperties;
@ -32,6 +33,7 @@ type Props = {
const nodeTypesStore = useNodeTypesStore();
const ndvStore = useNDVStore();
const workflowsStore = useWorkflowsStore();
const props = withDefaults(defineProps<Props>(), {
teleported: true,
@ -71,6 +73,16 @@ watch(
},
);
// Reload fields to map when node is executed
watch(
() => workflowsStore.getWorkflowExecution,
async (data) => {
if (data?.status === 'success' && state.paramValue.mappingMode === 'autoMapInputData') {
await initFetching(true);
}
},
);
onMounted(async () => {
if (props.node) {
state.parameterValues = {
@ -199,9 +211,9 @@ const pluralFieldWord = computed<string>(() => {
);
});
async function initFetching(inlineLading = false): Promise<void> {
async function initFetching(inlineLoading = false): Promise<void> {
state.loadingError = false;
if (inlineLading) {
if (inlineLoading) {
state.refreshInProgress = true;
} else {
state.loading = true;

View file

@ -249,18 +249,23 @@ export async function execute(
}
}
const dataMode =
nodeVersion < 4
? (this.getNodeParameter('dataMode', 0) as string)
: (this.getNodeParameter('columns.mappingMode', 0) as string);
let columnNames: string[] = [];
const sheetData = await sheet.getData(sheetName, 'FORMATTED_VALUE');
const sheetData = (await sheet.getData(sheetName, 'FORMATTED_VALUE')) ?? [];
if (sheetData?.[headerRow] === undefined) {
if (!sheetData[headerRow] && dataMode !== 'autoMapInputData') {
throw new NodeOperationError(
this.getNode(),
`Could not retrieve the column names from row ${headerRow + 1}`,
);
}
columnNames = sheetData[headerRow];
columnNames = sheetData[headerRow] ?? [];
const newColumns = new Set<string>();
@ -269,11 +274,6 @@ export async function execute(
? [this.getNodeParameter('columnToMatchOn', 0) as string]
: (this.getNodeParameter('columns.matchingColumns', 0) as string[]);
const dataMode =
nodeVersion < 4
? (this.getNodeParameter('dataMode', 0) as string)
: (this.getNodeParameter('columns.mappingMode', 0) as string);
// TODO: Add support for multiple columns to match on in the next overhaul
const keyIndex = columnNames.indexOf(columnsToMatchOn[0]);
@ -379,6 +379,7 @@ export async function execute(
headerRow + 1,
);
columnNames = newColumnNames;
sheetData[headerRow] = newColumnNames;
newColumns.clear();
}

View file

@ -476,7 +476,7 @@ export class GoogleSheet {
const keyIndex = columnNames.indexOf(indexKey);
if (keyIndex === -1) {
if (keyIndex === -1 && !upsert) {
throw new NodeOperationError(
this.executeFunctions.getNode(),
`Could not find column for key "${indexKey}"`,