Compare Changes at consolidate
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
/* global Excel, console */
|
||||
import { SheetInfo, SheetMappingStatus, TARGET_COLUMNS } from "./models";
|
||||
import { SheetInfo, SheetMappingStatus, TARGET_COLUMNS, ConsolidateSettings } from "./models";
|
||||
|
||||
/**
|
||||
* Holt alle sichtbaren Arbeitsblätter des aktuellen Workbooks, außer "Gesamtliste".
|
||||
@@ -126,9 +126,9 @@ function buildSheetMappingStatus(sheetInfo: SheetInfo, headerRow: any[], rowInde
|
||||
|
||||
/**
|
||||
* Führt die eigentliche Konsolidierung aus allen Arbeitsblättern durch und schreibt
|
||||
* das Ergebnis in das Blatt "Gesamtliste".
|
||||
* das Ergebnis in das Blatt "Gesamtliste" (jetzt "Kabelliste").
|
||||
*/
|
||||
export async function consolidateData(mappings: SheetMappingStatus[]): Promise<number> {
|
||||
export async function consolidateData(mappings: SheetMappingStatus[], settings: ConsolidateSettings): Promise<number> {
|
||||
return Excel.run(async (context) => {
|
||||
let rowsConsolidated = 0;
|
||||
const finalData: any[][] = [];
|
||||
@@ -197,59 +197,153 @@ export async function consolidateData(mappings: SheetMappingStatus[]): Promise<n
|
||||
}
|
||||
}
|
||||
|
||||
// Kabelliste erstellen oder überschreiben
|
||||
// Prüfen, ob "Kabelliste" existiert
|
||||
let targetSheet: Excel.Worksheet;
|
||||
let listExists = false;
|
||||
try {
|
||||
targetSheet = context.workbook.worksheets.getItem("Kabelliste");
|
||||
// Falls sie existiert, zuerst löschen, um sie neu zu erstellen
|
||||
targetSheet.delete();
|
||||
targetSheet.load("name");
|
||||
await context.sync();
|
||||
listExists = true;
|
||||
} catch (e) {
|
||||
// Ignorieren (Blatt existiert noch nicht)
|
||||
listExists = false;
|
||||
}
|
||||
|
||||
try {
|
||||
targetSheet = context.workbook.worksheets.add("Kabelliste");
|
||||
const fullHeaders = [...TARGET_COLUMNS.map(tc => tc.id), "Länge", "gezogen am", "von (Monteur)"];
|
||||
|
||||
// Header Zeile schreiben
|
||||
const fullHeaders = [...TARGET_COLUMNS.map(tc => tc.id), "Länge", "gezogen am", "von (Monteur)"];
|
||||
if (listExists) {
|
||||
try {
|
||||
// Existierende Liste aktualisieren
|
||||
const table = targetSheet.tables.getItem("KonsolidierteKabel");
|
||||
const bodyRange = table.getDataBodyRange();
|
||||
bodyRange.load("values, rowCount, columnCount");
|
||||
await context.sync();
|
||||
|
||||
// finalData hat fullHeaders.length Spalten
|
||||
const totalRowsCount = finalData.length + 1; // +1 für Header
|
||||
const totalColsCount = fullHeaders.length;
|
||||
const existingValues = bodyRange.values;
|
||||
|
||||
const targetRange = targetSheet.getRangeByIndexes(0, 0, totalRowsCount, totalColsCount);
|
||||
const formatChangedQueue: { row: number, col: number }[] = [];
|
||||
const formatDeletedQueue: number[] = [];
|
||||
|
||||
const allValues = [fullHeaders, ...finalData];
|
||||
const incomingMap = new Map<string, any[]>();
|
||||
for (const row of finalData) {
|
||||
const kNr = String(row[0] || "").trim();
|
||||
if (kNr) {
|
||||
incomingMap.set(kNr, row);
|
||||
}
|
||||
}
|
||||
|
||||
// Formatiere die Zielzellen als Text ("@"), BEVOR die Werte reingeschrieben werden,
|
||||
// damit Excel nicht versucht, Datumsstrings als numerische Datumsformate umzuwandeln.
|
||||
const formatArray: string[][] = [];
|
||||
for (let i = 0; i < totalRowsCount; i++) {
|
||||
formatArray.push(new Array(totalColsCount).fill("@"));
|
||||
const newRows: any[][] = [];
|
||||
|
||||
// Update existing & mark deleted
|
||||
for (let r = 0; r < existingValues.length; r++) {
|
||||
const row = existingValues[r];
|
||||
const kNr = String(row[0] || "").trim();
|
||||
|
||||
if (!kNr) continue;
|
||||
|
||||
if (incomingMap.has(kNr)) {
|
||||
// Geändert prüfen
|
||||
const inVals = incomingMap.get(kNr)!;
|
||||
for (let c = 0; c < TARGET_COLUMNS.length; c++) {
|
||||
const oldVal = String(row[c] || "").trim();
|
||||
const newVal = String(inVals[c] || "").trim();
|
||||
if (oldVal !== newVal) {
|
||||
existingValues[r][c] = newVal;
|
||||
formatChangedQueue.push({ row: r, col: c });
|
||||
}
|
||||
}
|
||||
incomingMap.delete(kNr);
|
||||
} else {
|
||||
// Entfallen
|
||||
// Optional die Zeile einfärben
|
||||
formatDeletedQueue.push(r);
|
||||
}
|
||||
}
|
||||
|
||||
// Verbleibend = Neue Kabel
|
||||
incomingMap.forEach((newRow) => {
|
||||
newRows.push(newRow);
|
||||
});
|
||||
|
||||
// Werte in die bestehende Tabelle zurückschreiben
|
||||
if (existingValues.length > 0) {
|
||||
bodyRange.values = existingValues;
|
||||
}
|
||||
|
||||
// Neue Zeilen anhängen
|
||||
let newRowsStartIndex = existingValues.length;
|
||||
if (newRows.length > 0) {
|
||||
table.rows.add(null as any, newRows);
|
||||
}
|
||||
|
||||
await context.sync();
|
||||
|
||||
// Formate anwenden
|
||||
const currentBody = table.getDataBodyRange();
|
||||
|
||||
// Geänderte Zellen markieren
|
||||
for (const cell of formatChangedQueue) {
|
||||
currentBody.getCell(cell.row, cell.col).format.fill.color = settings.colorChanged;
|
||||
}
|
||||
|
||||
// Entfallene Zeilen markieren
|
||||
for (const rowIndex of formatDeletedQueue) {
|
||||
currentBody.getRow(rowIndex).format.fill.color = settings.colorDeleted;
|
||||
//Zellen durchgestrichen
|
||||
currentBody.getRow(rowIndex).format.font.strikethrough = true;
|
||||
}
|
||||
|
||||
// Neue Zeilen markieren
|
||||
for (let i = 0; i < newRows.length; i++) {
|
||||
currentBody.getRow(newRowsStartIndex + i).format.fill.color = settings.colorNew;
|
||||
}
|
||||
|
||||
table.getRange().format.autofitColumns();
|
||||
await context.sync();
|
||||
|
||||
targetSheet.activate();
|
||||
return rowsConsolidated;
|
||||
} catch (error) {
|
||||
console.error("Fehler beim Aktualisieren der Kabelliste:", error);
|
||||
throw new Error("Fehler beim Aktualisieren der 'Kabelliste'.");
|
||||
}
|
||||
} else {
|
||||
try {
|
||||
// Neu erstellen (wie bisher)
|
||||
targetSheet = context.workbook.worksheets.add("Kabelliste");
|
||||
|
||||
targetRange.numberFormat = formatArray;
|
||||
targetRange.values = allValues;
|
||||
const totalRowsCount = finalData.length + 1; // +1 für Header
|
||||
const totalColsCount = fullHeaders.length;
|
||||
|
||||
await context.sync();
|
||||
const targetRange = targetSheet.getRangeByIndexes(0, 0, totalRowsCount, totalColsCount);
|
||||
const allValues = [fullHeaders, ...finalData];
|
||||
|
||||
// Als Tabelle formatieren
|
||||
const table = targetSheet.tables.add(targetRange, true /* hasHeaders */);
|
||||
table.name = "KonsolidierteKabel";
|
||||
table.style = "TableStyleLight9";
|
||||
table.showFilterButton = true;
|
||||
const formatArray: string[][] = [];
|
||||
for (let i = 0; i < totalRowsCount; i++) {
|
||||
formatArray.push(new Array(totalColsCount).fill("@"));
|
||||
}
|
||||
|
||||
// Spaltenbreite anpassen (AutoFit)
|
||||
targetRange.format.autofitColumns();
|
||||
await context.sync();
|
||||
targetRange.numberFormat = formatArray;
|
||||
targetRange.values = allValues;
|
||||
|
||||
targetSheet.activate();
|
||||
await context.sync();
|
||||
|
||||
return rowsConsolidated;
|
||||
} catch (error) {
|
||||
console.error("Fehler beim Erstellen der Kabelliste:", error);
|
||||
throw new Error("Fehler beim Erstellen der 'Kabelliste'. Möglicherweise ist die Arbeitsmappe schreibgeschützt.");
|
||||
const table = targetSheet.tables.add(targetRange, true /* hasHeaders */);
|
||||
table.name = "KonsolidierteKabel";
|
||||
table.style = "TableStyleLight9";
|
||||
table.showFilterButton = true;
|
||||
|
||||
// Markiere komplett neu entfernt auf Userwunsch
|
||||
|
||||
targetRange.format.autofitColumns();
|
||||
await context.sync();
|
||||
|
||||
targetSheet.activate();
|
||||
return rowsConsolidated;
|
||||
} catch (error) {
|
||||
console.error("Fehler beim Erstellen der Kabelliste:", error);
|
||||
throw new Error("Fehler beim Erstellen der 'Kabelliste'. Möglicherweise ist die Arbeitsmappe schreibgeschützt.");
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user