Вы хотите ограничить средство выбора даты JQuery, чтобы исключить даты, ранее выбранные пользователем.
Тема Как отключить определенные дни и даты с помощью beforeShowDay в jQueryUiDatepicker? (поддерживает @Amal) показать, что скрипт datepicker требует простой массив дат. Хотя значения даты должны быть в кавычках.
Следующий скрипт берет данные электронной таблицы и ищет экземпляры имени пользователя, затем получает соответствующую дату VL и передает эту дату в массив, который будет передан вскрипт datepicker.
Аспекты скрипта
- все данные получены с самого начала:
var datasheetData = datasheetRange.getDisplayValues();
- данные отсортированыпо дате, чтобы выходные данные были в порядке дат:
datasheetRange.sort(6);
(столбец F на ненулевой основе.) - список имен пользователей извлекается с использованием Javascript map метод доступа к данным:
var datanames = datasheetData.map(function(e){return e[2];});//[[e],[e],[e]]=>[e,e,e]
. (Получите доступ к столбцу C или столбцу 2 на основе нуля.) - Временный массив настроен для захвата предыдущих дат (если есть):
var userdates = [];
- сценарий повторяет мыслиимена пользователей, совпадает с именем пользователя и извлекает дату VL (в кавычках) во временный массив:
userdates.push('"' + datasheetData[i][5]+ '"');
- данные электронной таблицы пересматриваются по метке времени:
datasheetRange.sort(1);
- в концесценарий проверяет, были ли записаны какие-либо предыдущие даты:
if (userdates.length !=0){
- временный массив
userdates
может быть передан в средство выбора даты.
Временный массив будет выглядеть следующим образомэто:
["11/11/2019", "11/15/2019", "11/16/2019", "11/17/2019", "11/24/2019"]
function so5875278401() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheetname = "VL Request";
var datasheet = ss.getSheetByName(sheetname);
// assume user name
//var userName = Session.getEffectiveUser().getUsername()
var username = "user1";
// set variables
var datafirstrow = 2;
var dataLR = datasheet.getLastRow();
var dataLC = datasheet.getLastColumn();
var datasheetRange = datasheet.getRange(datafirstrow,1, dataLR-datafirstrow+1, dataLC);
//Logger.log(datasheetRange.getA1Notation());
// sort the data by date
datasheetRange.sort(6); // sort by Column F - VL date
var datasheetData = datasheetRange.getDisplayValues();
//Logger.log(datasheetData);
// get the user names as an array
var datanames = datasheetData.map(function(e){return e[2];});//[[e],[e],[e]]=>[e,e,e]
//Logger.log(datanames); // DEBUG
//Logger.log(datanames.length) // DEBUG
// create an array to hold any dates
var userdates = [];
// loop through the user names; test for equivalence to "username", and save VF date to an array
for (var i=0;i<datanames.length;i++){
//Logger.log("dataname = "+datanames[i])
if (datanames[i] === username){
// Logger.log("DEBUG: i= "+i+", user name = "+datanames[i]+", VL date = "+datasheetData[i][5]);
userdates.push('"' + datasheetData[i][5]+ '"'); // wrapped in quotes
}
else{
// Logger.log("DEBUG: i= "+i+" - no match");
}
}
// resort the data by Timestamp
datasheetRange.sort(1); // sort by Column A
if (userdates.length !=0){
Logger.log("There are "+userdates.length+" previous dates for this user.");//DEBUG
}
else{
Logger.log("There no previous dates for this user");//DEBUG
}
}
JavaScript.html
minDate
: дата начала3 недели с сегодняшнего дня: "+3W"
maxDate
: дата окончания 12 недель с сегодняшнего дня: "+12W"
beforeShowDay
: это параметр выбора даты для исключения определенных дат. $thisdate
определяет формат даты m / d / y, а затем inArray($thisDate, array)
: использует метод JQuery inArray для test для даты массива, равной календарной дате;если совпадения нет, возвращается -1. Таким образом, когда сопоставление установлено, функция возвращает «false» = 0, а дата «затенена / размыта» в календаре.
В следующем примере значения массива были измененытак что они в декабре (а не в ноябре тестовые данные).
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script src="//ajax.googleapis.com/ajax/libs/jqueryui/1.9.1/jquery-ui.min.js"></script>
<script>
var array = ["12/13/2019", "12/14/2019", "12/16/2019", "12/17/2019", "12/24/2019"];
$(function() {
$('#datepicker').datepicker({
minDate: "+3W",
maxDate: "+12W",
beforeShowDay: function (date) {
$thisDate = (date.getMonth() + 1) + "/" + date.getDate() + "/" + date.getFullYear();
if ($.inArray($thisDate, array) == -1) {
return [true, ""];
} else {
return [false, "", "Unavailable"];
}
}
});
});
</script>
Следующая задача - передать значения массива в сценарий.