mirror of
https://github.com/n8n-io/n8n.git
synced 2025-03-05 20:50:17 -08:00
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:
parent
f5ccb5fe33
commit
29ee4fab61
|
@ -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;
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
||||
|
|
|
@ -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}"`,
|
||||
|
|
Loading…
Reference in a new issue