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); }); }