224 lines
7.7 KiB
JavaScript
224 lines
7.7 KiB
JavaScript
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));
|
||
}
|
||
}
|
||
}
|