Skip to content

Commit a3e737a

Browse files
authored
Merge pull request #8 from es92/one-submission-per-email-option
add option for one submission per email
2 parents aec0432 + bfabc1b commit a3e737a

File tree

4 files changed

+50
-23
lines changed

4 files changed

+50
-23
lines changed

dist/googlesheet.js

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ Object.defineProperty(exports, "__esModule", {
66
exports.fetchSpreadsheetData = fetchSpreadsheetData;
77
var _axios = _interopRequireDefault(require("axios"));
88
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
9-
async function fetchSpreadsheetData(url, pieChartColumnNames = [], filterEmails) {
9+
async function fetchSpreadsheetData(url, pieChartColumnNames = [], filterEmails, oneSubmissionPerEmail) {
1010
// extract the spreadsheet id from the url
1111
const regex = /\/spreadsheets\/d\/([a-zA-Z0-9-_]+)/;
1212
const matches = url.match(regex);
@@ -22,11 +22,12 @@ async function fetchSpreadsheetData(url, pieChartColumnNames = [], filterEmails)
2222
// extract the columns and rows
2323
const columns = json.table.cols.map(x => x.label);
2424
let rows = json.table.rows.map(x => x.c.map(y => y?.v));
25+
const emailColumn = columns.indexOf("Email Address");
2526

2627
// filter out rows with forbidden email addresses
2728
if (filterEmails) {
2829
rows = rows.filter(row => {
29-
const email = row[columns.indexOf("Email Address")];
30+
const email = row[emailColumn];
3031
return filterEmails.includes(email);
3132
});
3233
}
@@ -63,15 +64,24 @@ async function fetchSpreadsheetData(url, pieChartColumnNames = [], filterEmails)
6364
}))
6465
};
6566
});
66-
67-
// extract the comments
68-
const data = rows.map((row, id) => ({
69-
id: String(id),
70-
comment: commentColumns.map(({
71-
name,
72-
index
73-
}) => `> ${name}\n\n${row[index] || "(not answered)"}`).join("\n\n")
74-
}));
67+
const emailToData = {};
68+
rows.forEach((row, id) => {
69+
emailToData[row[emailColumn]] ??= [];
70+
emailToData[row[emailColumn]].push({
71+
id: String(id),
72+
comment: commentColumns.map(({
73+
name,
74+
index
75+
}) => `> ${name}\n\n${row[index] || "(not answered)"}`).join("\n\n")
76+
});
77+
});
78+
let data;
79+
if (oneSubmissionPerEmail) {
80+
data = Object.values(emailToData).map(v => v[v.length - 1]);
81+
} else {
82+
data = Object.values(emailToData).flat();
83+
}
84+
console.log(data);
7585
return {
7686
data,
7787
pieCharts

dist/server.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,11 @@ app.post("/generate", async (req, res) => {
2525
const {
2626
data,
2727
pieCharts
28-
} = await (0, _googlesheet.fetchSpreadsheetData)(config.googleSheet.url, config.googleSheet.pieChartColumns, config.googleSheet.filterEmails);
28+
} = await (0, _googlesheet.fetchSpreadsheetData)(config.googleSheet.url, config.googleSheet.pieChartColumns, config.googleSheet.filterEmails, config.googleSheet.oneSubmissionPerEmail);
2929
config.data = (0, _utils.formatData)(data);
3030
config.pieCharts = pieCharts;
3131
}
32+
throw new Error('test');
3233
if (!config.data) {
3334
throw new Error("Missing data");
3435
}

src/googlesheet.ts

Lines changed: 25 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@ import { SourceRow, PieChart } from "./types";
44
export async function fetchSpreadsheetData(
55
url: string,
66
pieChartColumnNames: string[] = [],
7-
filterEmails?: string[]
7+
filterEmails?: string[],
8+
oneSubmissionPerEmail?: boolean
89
): Promise<{ data: SourceRow[]; pieCharts: PieChart[] }> {
910
// extract the spreadsheet id from the url
1011
const regex = /\/spreadsheets\/d\/([a-zA-Z0-9-_]+)/;
@@ -24,10 +25,12 @@ export async function fetchSpreadsheetData(
2425
x.c.map((y: any) => y?.v)
2526
);
2627

28+
const emailColumn = columns.indexOf("Email Address")
29+
2730
// filter out rows with forbidden email addresses
2831
if (filterEmails) {
2932
rows = rows.filter((row) => {
30-
const email = row[columns.indexOf("Email Address")];
33+
const email = row[emailColumn];
3134
return filterEmails.includes(email);
3235
});
3336
}
@@ -57,14 +60,26 @@ export async function fetchSpreadsheetData(
5760
});
5861

5962
// extract the comments
60-
const data = rows.map((row, id) => ({
61-
id: String(id),
62-
comment: commentColumns
63-
.map(
64-
({ name, index }) => `> ${name}\n\n${row[index] || "(not answered)"}`
65-
)
66-
.join("\n\n"),
67-
}));
63+
const emailToData = {};
64+
65+
rows.forEach((row, id) => {
66+
emailToData[row[emailColumn]] ??= [];
67+
emailToData[row[emailColumn]].push({
68+
id: String(id),
69+
comment: commentColumns
70+
.map(
71+
({ name, index }) => `> ${name}\n\n${row[index] || "(not answered)"}`
72+
)
73+
.join("\n\n"),
74+
});
75+
});
76+
77+
let data;
78+
if (oneSubmissionPerEmail) {
79+
data = Object.values(emailToData).map((v) => v[v.length-1])
80+
} else {
81+
data = Object.values(emailToData).flat();
82+
}
6883

6984
return { data, pieCharts };
7085
}

src/server.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,8 @@ app.post("/generate", async (req, res) => {
2424
const { data, pieCharts } = await fetchSpreadsheetData(
2525
config.googleSheet.url,
2626
config.googleSheet.pieChartColumns,
27-
config.googleSheet.filterEmails
27+
config.googleSheet.filterEmails,
28+
config.googleSheet.oneSubmissionPerEmail,
2829
);
2930
config.data = formatData(data);
3031
config.pieCharts = pieCharts;

0 commit comments

Comments
 (0)