Вы создаете календарь выхода на основе электронных таблиц на основе информации из ответа формы. Основываясь на существующем календаре, у вас возникают проблемы с определением соответствующих дат отпуска, а затем с заполнением ячеек календаря для указания предлагаемого отпуска.
Проблема в том, что в строках 1, 2 или 3 календаря нет полей, которые имеюттот же формат даты, что и в полях «Дата начала» и «Дата окончания» в форме. В результате нет простого способа поиска совпадения полей данных формы.
Решение, на мой взгляд, состоит в том, чтобы изменить формат полей даты в строках 2 и 3 и включить поискдля совпадения.
Строка 2
- существующий формат "d" - день месяца (числовой)
- изменитьформат, соответствующий дате начала / окончания формы: "d-MMM-yyyy".
- цвет шрифта для этого поля можно использовать, чтобы «скрыть» эти даты, а также уменьшить ширину столбца.
Строка 3
- существующий формат «E» - день недели (имя)
- изменить формат, чтобы объединить существующие форматы строк № 2 и № 3 - «Ed»
Аспекты сценария
- данные формы извлекаются как
getDisplayValues()
. Целью этого является получение даты в виде строки для облегчения поиска. - Получены два набора данных календаря
1) строка дат (строка № 2)
2) именастолбец (Кол. № 1). Метод Javascript map используется для преобразования имен из двумерного массива в одномерный массив. Это создает массив, который можно легко найти. - метод Javascript indexOf используется для поиска совпадения столбцов для дат начала и окончания, а также для сопоставления имени в столбце календаря (который выдает строку)
- скрипт перебирает количество оставшихся дней для создания временного массива значений "V".
- с использованием номера строки и номеров начала и конца столбца, aдиапазон может быть определен в календаре, а затем обновлен из значений во временном массиве.
Предположительно, ваша функция будет запущена с помощью onFormSubmit (e).
Данные формы
Календарь - До
Календарь - После
function so5871726503(){
var ss = SpreadsheetApp.getActiveSpreadsheet();
var form = ss.getSheetByName("Form");
var calendar = ss.getSheetByName("Calander");
//get form data
var formdataRange = form.getRange(6,1,1,9);// test data
var formData = formdataRange.getDisplayValues(); // display values to format date as string
//get the employee name, start date and end date
var formName = formData[0][1];
var formSD = formData[0][3];
var formED = formData[0][4];
// Logger.log("DEBUG: name = "+formName+", start date = "+formSD+", end date = "+formED);
//get Calendar variables
var calLR = calendar.getLastRow();
var calLC = calendar.getLastColumn();
var caldateStart = 9;
var calnameStart=4;
// get Calendar dates
var calDateRange = calendar.getRange(2,caldateStart,1,calLC-caldateStart+1);
var calDateValues = calDateRange.getDisplayValues();
// get Calendar names
var calNameRange = calendar.getRange(calnameStart,1,calLR-calnameStart+1);
var calNameValues = calNameRange.getValues();
var calNames = calNameValues.map(function(e){return e[0];});//[[e],[e],[e]]=>[e,e,e]
// there should be some error checking on indexof results = -1 in case there is a mismatch.
// find form start date in calender
var startdateresult = calDateValues[0].indexOf(formSD);
var startdateresultcol = startdateresult+caldateStart;
// Logger.log("DEBUG: start date result = "+startdateresult+", column = "+startdateresultcol);
// find form end date in calender
var enddateresult = calDateValues[0].indexOf(formED);
var enddateresultcol = enddateresult+caldateStart;
// Logger.log("DEBUG: end date result = "+enddateresult+", column = "+enddateresultcol);
// find form name in calender
var nameresult = calNames.indexOf(formName);
var nameresultrow = nameresult+calnameStart;
// Logger.log("DEBUG: name result = "+nameresult+", row = "+nameresultrow)
// calculate number of days leave
var daysleave = enddateresultcol-startdateresultcol+1
// Logger.log("DEBUG: days leave = "+daysleave)
// create array variable to hold leave data
var leave=[];
// loop to create data to fill Calendar
for (i=0;i<daysleave;i++){
leave.push("V");
}
// Logger.log(leave); // DEBUG
// build leave range
var calLeave = calendar.getRange(nameresultrow,startdateresultcol,1,daysleave);
//Logger.log(calLeave.getA1Notation()); //DEBUG
// Update the leave range
calLeave.setValues([leave]);
}