-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsession_submit.js
More file actions
177 lines (145 loc) · 5.3 KB
/
session_submit.js
File metadata and controls
177 lines (145 loc) · 5.3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
// Created by Max Ostapenko, bvz2001@gmail.com
/*
* Updates response item in the Google Form with available session time slots
*/
function updateSlots() {
const spreadsheetId = '1xEd2daCtBSeItYTe3q1-YILtG9fB-MOTOku3Ggm8uIs'; // Google Sheet ID that hosts data for session board
const sheetName = 'Europe'; // Sessions sheet name
const sessionsItemId = 1515269446; // ID of the form field with session slots. May change in case the form fields are added manually.
const slotNameSeparator = ', room ';
let form = FormApp.getActiveForm();
let sessionsItem = form.getItemById(sessionsItemId);
let sheet = SpreadsheetApp.openById(spreadsheetId).getSheetByName(sheetName);
let sheetsRange = sheet.getRange("A1").getDataRegion();
let sheetValues = sheetsRange.getValues();
let cell = sheet.getRange('A1');
let columnsInfo = {
speaker: {
formItemIndex: 0,
},
twitter: {
formItemIndex: 1,
},
title: {
formItemIndex: 2,
},
description: {
formItemIndex: 3,
},
type: {
formItemIndex: 4,
},
level: {
formItemIndex: 5,
},
focus: {
formItemIndex: 6,
},
tags: {
formItemIndex: 7,
},
time: {
'read-only': true,
},
room_sponsor: {
'read-only': true,
},
response_id: {},
response_url: {},
};
Object.keys(columnsInfo).forEach(key => {
columnsInfo[key].column = getColumnIndex(sheetValues[0], key);
});
freeSessionSlots = [];
let formResponses = form.getResponses();
if (formResponses.length > 0) {
var formResponse = formResponses[formResponses.length - 1];
var itemResponses = formResponse.getItemResponses();
// console.log(formResponse.getResponseForItem(sessionsItem).getResponse().split(slotNameSeparator))
let responseParsed = formResponse.getResponseForItem(sessionsItem).getResponse().split(slotNameSeparator);
var timeSubmitted = responseParsed[0];
var roomSubmitted = responseParsed[1];
console.log('session submitted: ', [timeSubmitted, roomSubmitted]);
}
for (var row = 1; row < sheetValues.length; row++) { // Iterating through sheet rows with sessions
if (sheetValues[row][columnsInfo.room_sponsor.column] != 'Main Area') { // Skipping sessions in Main Area
let slotName = sheetValues[row][columnsInfo.time.column] + slotNameSeparator + sheetValues[row][columnsInfo.room_sponsor.column];
if (sheetValues[row][columnsInfo.speaker.column] == '') {
// If speaker name is empty then the slot is free
if (
formResponse &&
timeSubmitted && timeSubmitted == sheetValues[row][columnsInfo.time.column] &&
roomSubmitted && roomSubmitted == sheetValues[row][columnsInfo.room_sponsor.column]
) {
// Fills in the submitted session data to the slot.
console.log(row, 'free slot:', slotName, 'session matched: ', [timeSubmitted, roomSubmitted]);
Object.keys(columnsInfo).forEach(key => {
if (typeof columnsInfo[key].formItemIndex === 'number') {
cell.offset(row, columnsInfo[key].column).setValue(
itemResponses[columnsInfo[key].formItemIndex].getResponse()
);
}
});
cell.offset(row, columnsInfo.response_id.column).setValue(
formResponse.getId()
);
cell.offset(row, columnsInfo.response_url.column).setValue(
formResponse.getEditResponseUrl()
);
} else {
// Skips empty slot, submitted session doesn't match.
console.log(row, 'free slot:', slotName, 'added to form field');
slotReset(columnsInfo, cell, row)
// Collecting all free slots left for form field update.
freeSessionSlots.push(slotName);
}
} else {
// Speaker name is filled means the session is booked
console.log(row, 'slot booked: ', slotName);
// Removes outdated response data from the sheet
if (
formResponse &&
formResponse.getId() == sheetValues[row][columnsInfo.response_id.column] &&
( timeSubmitted != sheetValues[row][columnsInfo.time.column] ||
roomSubmitted != sheetValues[row][columnsInfo.room_sponsor.column] )
) {
console.log(row, 'free slot', slotName, ', reset session data and added to form field');
slotReset(columnsInfo, cell, row)
freeSessionSlots.push(slotName);
}
}
}
}
if (freeSessionSlots.length > 0) {
// Updates session form field with a new list of free slots.
sessionsItem.asMultipleChoiceItem().setChoiceValues(freeSessionSlots);
} else {
// Stops collecting session submissions.
form.setAcceptingResponses(false);
}
return true;
}
/*
* Gets sheet column index by title
* @param {array} headerRow
* @param {string} title
*/
function getColumnIndex(headerRow, title) {
let index = headerRow.findIndex(element => element == title);
if (index > -1) {
return index;
} else {
return undefined;
}
}
function slotReset(columnsInfo, cell, row){
Object.keys(columnsInfo).forEach(key => {
if (!columnsInfo[key]['read-only']) {
cell.offset(row, columnsInfo[key].column).setValue('');
}
});
}
function enableAcceptResponses(){
let form = FormApp.getActiveForm();
form.setAcceptingResponses(true);
}