diff --git a/src/main/capabilities/data-table-common.ts b/src/main/capabilities/data-table-common.ts index 2d232ce..d7fd2ca 100644 --- a/src/main/capabilities/data-table-common.ts +++ b/src/main/capabilities/data-table-common.ts @@ -90,9 +90,21 @@ register(["Bivartable_ColumnOperationDf", "Bivartable_DoCal"], (_ctx, _node, arg const result: Table = [[...headers, name]]; for (const row of source.slice(1)) result.push([...row, calculate(row[left], row[right], operator)]); return result; }); +function columnIndexOf(candidate: unknown): number { + const text = String(candidate ?? "").trim(); + if (/^\d+$/.test(text)) return Number(text) - 1; + let result = 0; + for (const char of text.toUpperCase()) result = result * 26 + (char.charCodeAt(0) - 64); + return result - 1; +} + register(["Bivartable_SpliceColData", "Bivartable_DoJoint"], (_ctx, _node, args) => { const source = table(args.df); if (!source.length) return source; const headers = source[0]; - const left = index(headers, args.col1 ?? args.cola); const right = index(headers, args.col2 ?? args.colb); const name = String(args.name ?? args.colnew ?? "拼接结果"); const separator = String(args.separator ?? ""); + // catalog 字段:change_type(name/num) + col_name_1/2 或 col_num_1/2;兼容旧键 col1/col2 + const byName = String(args.change_type ?? "name") !== "num"; + const left = byName ? index(headers, args.col_name_1 ?? args.col1 ?? args.cola) : columnIndexOf(args.col_num_1); + const right = byName ? index(headers, args.col_name_2 ?? args.col2 ?? args.colb) : columnIndexOf(args.col_num_2); + const name = String(args.new_col_name ?? args.name ?? args.colnew ?? "拼接结果"); const separator = String(args.connector ?? args.separator ?? ""); return [[...headers, name], ...source.slice(1).map((row) => [...row, `${row[left] ?? ""}${separator}${row[right] ?? ""}`])]; });