Files
skills-framework-demonstrator/src/lib/parser.ts
2025-07-10 12:47:35 +02:00

56 lines
1.6 KiB
TypeScript

import * as d3 from "d3";
import { responsesSheetId, responsesSheetName } from "../config";
export const skills: { [key: string]: number } = {
"Keine Kenntnisse": 0,
"Geringe Kenntnisse": 1,
"Grundlegende Kenntnisse": 2,
"Gute Kenntnisse": 3,
"Sehr fundierte Kenntnisse": 4,
};
function mapSkillToNumber(skill: string): number {
return skills[skill] !== undefined ? skills[skill] : -1;
}
export interface ResponseData {
timestamp: number;
question: string;
response: number;
}
export function parseCSV(csv: string): ResponseData[] {
const rowConverter = (row: d3.DSVRowString): ResponseData[] => {
const responses: { [key: string]: number } = {};
Object.keys(row).forEach((key) => {
// Likert scale responses have their group name in square brackets at the end of the column name
const m = key.match(/\[([^\]]+)\]$/);
if (m) {
const category = m[1];
responses[category] = mapSkillToNumber(row[key]);
}
});
return Object.entries(responses).flatMap(([category, response]) => ({
timestamp: new Date(row["Timestamp"]).getTime(),
question: category,
response: response,
}));
};
const rows = d3.csvParse(csv, rowConverter);
return rows.flatMap((row) => row);
}
export function fetchGoogleSheet() {
const url = `https://docs.google.com/spreadsheets/d/${responsesSheetId}/gviz/tq?tqx=out:csv&sheet=${responsesSheetName}`;
return fetch(url)
.then((response) => {
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
return response.text();
})
.then((csv) => {
return parseCSV(csv);
});
}