58 lines
1.6 KiB
TypeScript
58 lines
1.6 KiB
TypeScript
import * as d3 from "d3";
|
|
|
|
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;
|
|
}
|
|
|
|
const sheet_id = "12pGfvJx0SQmb6mnnVygmZsEeLZ6bFrpZvq8GYw2oX9E";
|
|
const sheet_name = "Responses";
|
|
const url = `https://docs.google.com/spreadsheets/d/${sheet_id}/gviz/tq?tqx=out:csv&sheet=${sheet_name}`;
|
|
|
|
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() {
|
|
return fetch(url)
|
|
.then((response) => {
|
|
if (!response.ok) {
|
|
throw new Error(`HTTP error! status: ${response.status}`);
|
|
}
|
|
return response.text();
|
|
})
|
|
.then((csv) => {
|
|
return parseCSV(csv);
|
|
});
|
|
}
|