initial commit - code moved to separate repo
This commit is contained in:
223
_doc/GoogleFormsScript.gs
Normal file
223
_doc/GoogleFormsScript.gs
Normal file
@ -0,0 +1,223 @@
|
||||
function main() {
|
||||
var form = FormApp.openById("11VuGKjoywNA0ajrfeRVwdNYDXSM0ge2qAn6bhiXOZj0"); // Replace with your Form's ID
|
||||
var sheet = SpreadsheetApp.openById("17CFpEDZ2Bn5GJSfMUhliwBBdbCaghATxZ5lYwRSbGsY").getSheetByName("Sheet1");
|
||||
var sheetResults = SpreadsheetApp.openById("1jIW27zh-502WIBpFVWGuNSZp7vBuB-SW6L_NPKgf4Ys").getSheetByName("Form Responses 1");
|
||||
|
||||
setNamesDropdownOptions(form, sheet);
|
||||
//updateWeeklyQuestions(form, new Date(2023,11 - 1,1));
|
||||
//mergeColumnsWithSameNames(sheetResults);
|
||||
}
|
||||
|
||||
function setNamesDropdownOptions(form, sheet) {
|
||||
var names = sheet.getRange("A4:A").getValues(); // Replace 'Sheet1' and 'A:A' with your sheet name and range respectively
|
||||
var colAFontWeights = sheet.getRange("A4:A").getFontWeights();
|
||||
|
||||
var flatList = names
|
||||
.flat()
|
||||
.map(function (name) {
|
||||
return normalizeName(name[0]);
|
||||
})
|
||||
.filter(String); // Flatten the array, normalize names, and remove any empty strings
|
||||
|
||||
var title = "Име, Фамилия";
|
||||
var item = form.getItems(FormApp.ItemType.LIST); // or FormApp.ItemType.LIST or MULTIPLE_CHOICE
|
||||
var multipleChoiceItem = item[0].asListItem(); // or .asMultipleChoiceItem()
|
||||
|
||||
var boldValues = [];
|
||||
for (var i = 0; i < colAFontWeights.length; i++) {
|
||||
if (colAFontWeights[i][0] === "bold") {
|
||||
boldValues.push(names[i][0]);
|
||||
}
|
||||
}
|
||||
var bulgarianOrder = "АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЬЮЯ";
|
||||
|
||||
function customBulgarianSort(a, b) {
|
||||
for (var i = 0; i < Math.min(a.length, b.length); i++) {
|
||||
var indexA = bulgarianOrder.indexOf(a[i]);
|
||||
var indexB = bulgarianOrder.indexOf(b[i]);
|
||||
|
||||
// Default behavior for characters not in the bulgarianOrder string
|
||||
if (indexA === -1 && indexB === -1) {
|
||||
if (a[i] < b[i]) return -1;
|
||||
if (a[i] > b[i]) return 1;
|
||||
}
|
||||
|
||||
if (indexA === -1) return 1;
|
||||
if (indexB === -1) return -1;
|
||||
if (indexA < indexB) return -1;
|
||||
if (indexA > indexB) return 1;
|
||||
}
|
||||
|
||||
if (a.length < b.length) return -1;
|
||||
if (a.length > b.length) return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
boldValues.sort(customBulgarianSort);
|
||||
|
||||
multipleChoiceItem.setChoiceValues(boldValues);
|
||||
}
|
||||
|
||||
// Helper function to remove leading, trailing, and consecutive spaces
|
||||
function normalizeName(name) {
|
||||
if (typeof name !== "string") {
|
||||
return ""; // Return an empty string if the name is not a valid string
|
||||
}
|
||||
return name.split(" ").filter(Boolean).join(" ");
|
||||
}
|
||||
|
||||
function ReverseNames(names, destination = "D") {
|
||||
// Reverse the name order for each name
|
||||
var reversedNames = names.map(function (name) {
|
||||
var splitName = name[0].trim().split(" ");
|
||||
if (splitName.length === 2) {
|
||||
// Ensure there's a Lastname and Firstname to swap
|
||||
return [splitName[1] + " " + splitName[0]];
|
||||
} else {
|
||||
return [name[0]]; // Return the original name if it doesn't fit the "Lastname Firstname" format
|
||||
}
|
||||
});
|
||||
|
||||
// Write reversed names to column D
|
||||
sheet.getRange(destination + "4:" + destination + "" + (3 + reversedNames.length)).setValues(reversedNames);
|
||||
}
|
||||
|
||||
function updateWeeklyQuestions(form, forDate) {
|
||||
var items = form.getItems(FormApp.ItemType.CHECKBOX_GRID);
|
||||
|
||||
var today = forDate;
|
||||
var firstDayOfMonth = new Date(today.getFullYear(), today.getMonth(), 1);
|
||||
var weeks = getWeeksInMonth(today.getMonth(), today.getFullYear());
|
||||
|
||||
var columns = [];
|
||||
columns.push("Не мога");
|
||||
var weekDays = ["пон", "вт", "ср", "четв", "пет", "съб"];
|
||||
|
||||
//Summer
|
||||
//for (var i = 8; i <= 18; i += 2) {
|
||||
// columns.push("(" + i + "ч-" + (i + 2) + "ч)");
|
||||
//Winter
|
||||
for (var i = 9; i <= 18; i += 1.5) {
|
||||
columns.push("" + formatTime(i) + "-" + formatTime(i + 1.5) + "");
|
||||
}
|
||||
|
||||
for (var i = 0; i < weeks.length; i++) {
|
||||
var week = weeks[i];
|
||||
// Skip weeks that started in the previous month
|
||||
if (week[0].getMonth() !== firstDayOfMonth.getMonth()) {
|
||||
continue;
|
||||
}
|
||||
console.log("Week from " + week[0].getDate());
|
||||
|
||||
var title = "Седмица " + (i + 1) + " (" + week[0].getDate() + "-" + week[5].getDate() + " " + getMonthName(week[0].getMonth()) + ")"; // Always represent Monday to Saturday
|
||||
if (week[5].getMonth() !== week[0].getMonth()) {
|
||||
title = "Седмица " + (i + 1) + " (" + week[0].getDate() + " " + getMonthName(week[0].getMonth()) + " - " + week[5].getDate() + " " + getMonthName(week[5].getMonth()) + ")"; // Always represent Monday to Saturday
|
||||
}
|
||||
if (i < items.length) {
|
||||
// Modify existing checkbox grid
|
||||
var checkboxGrid = items[i].asCheckboxGridItem();
|
||||
checkboxGrid.setTitle(title);
|
||||
checkboxGrid.setColumns(columns);
|
||||
checkboxGrid.setRows(weekDays);
|
||||
} else {
|
||||
// Create a new checkbox grid
|
||||
var checkboxGrid = form.addCheckboxGridItem();
|
||||
checkboxGrid.setTitle(title);
|
||||
checkboxGrid.setColumns(columns);
|
||||
checkboxGrid.setRows(weekDays);
|
||||
checkboxGrid.setRequired(true);
|
||||
}
|
||||
}
|
||||
|
||||
// Delete extra checkbox grids
|
||||
for (var j = weeks.length; j < items.length; j++) {
|
||||
form.deleteItem(items[j]);
|
||||
}
|
||||
}
|
||||
|
||||
function getWeeksInMonth(month, year) {
|
||||
var weeks = [],
|
||||
firstDate = new Date(year, month, 1),
|
||||
lastDate = new Date(year, month + 1, 0);
|
||||
|
||||
// Find the first Monday of the month
|
||||
while (firstDate.getDay() !== 1) {
|
||||
firstDate.setDate(firstDate.getDate() + 1);
|
||||
}
|
||||
|
||||
var currentDate = new Date(firstDate);
|
||||
|
||||
while (currentDate <= lastDate) {
|
||||
var week = [];
|
||||
|
||||
// For 6 days (Monday to Saturday)
|
||||
for (var i = 0; i < 6; i++) {
|
||||
week.push(new Date(currentDate));
|
||||
currentDate.setDate(currentDate.getDate() + 1);
|
||||
}
|
||||
|
||||
currentDate.setDate(currentDate.getDate() + 1); //Sunday
|
||||
weeks.push(week);
|
||||
|
||||
// If we are already in the next month, break out of the loop
|
||||
if (currentDate.getMonth() !== month) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return weeks;
|
||||
}
|
||||
|
||||
function getMonthName(monthIndex) {
|
||||
var months = ["януари", "февруари", "март", "април", "май", "юни", "юли", "август", "септември", "октомври", "ноември", "декември"];
|
||||
return months[monthIndex];
|
||||
}
|
||||
|
||||
function formatTime(hourDecimal) {
|
||||
var hours = Math.floor(hourDecimal);
|
||||
var minutes = (hourDecimal - hours) * 60;
|
||||
if (minutes === 0) {
|
||||
return hours.toString().padStart(2, "0");
|
||||
}
|
||||
return hours.toString().padStart(2, "0") + ":" + minutes.toString().padStart(2, "0");
|
||||
}
|
||||
|
||||
function mergeColumnsWithSameNames(sheet) {
|
||||
var headers = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues()[0];
|
||||
var uniqueHeaders = [...new Set(headers)]; // Get unique headers
|
||||
|
||||
for (var u = 0; u < uniqueHeaders.length; u++) {
|
||||
var currentHeader = uniqueHeaders[u];
|
||||
var columnsToMerge = [];
|
||||
|
||||
// Identify columns with the same name
|
||||
for (var i = 0; i < headers.length; i++) {
|
||||
if (headers[i] === currentHeader) {
|
||||
columnsToMerge.push(i + 1); // '+1' because column indices are 1-based
|
||||
}
|
||||
}
|
||||
|
||||
if (columnsToMerge.length > 1) {
|
||||
// If there's more than one column with the same name
|
||||
var sumData = [];
|
||||
for (var col of columnsToMerge) {
|
||||
var columnData = sheet.getRange(2, col, sheet.getLastRow() - 1).getValues(); // '-1' to exclude the header
|
||||
for (var j = 0; j < columnData.length; j++) {
|
||||
if (!sumData[j]) sumData[j] = [];
|
||||
sumData[j][0] = (sumData[j][0] || 0) + (columnData[j][0] || 0);
|
||||
}
|
||||
}
|
||||
|
||||
// Write back summed data to the first column in the list
|
||||
sheet.getRange(2, columnsToMerge[0], sumData.length, 1).setValues(sumData);
|
||||
|
||||
// Delete the other duplicate columns
|
||||
for (var k = columnsToMerge.length - 1; k > 0; k--) {
|
||||
sheet.deleteColumn(columnsToMerge[k]);
|
||||
}
|
||||
|
||||
// Adjust headers array to reflect the deleted columns
|
||||
headers = headers.slice(0, columnsToMerge[1] - 1).concat(headers.slice(columnsToMerge[columnsToMerge.length - 1], headers.length));
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user