Datepicker: отключение дат в данных - PullRequest
0 голосов
/ 07 ноября 2019

У меня есть средство выбора даты, которое позволяет 3 недели с начала (начало) до 12 недель (конец). Я хотел бы добавить условие, что если дата в этом интервале уже была в данных (электронная таблица), она также будет отключена. См. Скрипт ниже:

 <script>

   var data = SpreadsheetApp
        .openById('Spreadsheet ID')
        .getSheetByName("VL Request")
        .getDataRange()
        .getValues();  
   var datefiled = [0];
   var userName = Session.getEffectiveUser().getUsername();


      $( function() {
      //enable next week onwards 
    var date = new Date();
    var weekday = date.getDay();
    var daysTillWeekOver = 21 - weekday;
    var enddayofweek = daysTillWeekOver + 5;
        $("#datepicker").datepicker({
      minDate:daysTillWeekOver,
      maxDate: "3M" + enddayofweek
      });
      } );
</script>

Я хочу добавить условие, что если пользователь подал на эту дату (datefiled), он будет отключен в DatePicker для этого пользователя, поэтому пользователь будет избегать подачи дубликата на этомдата.

1 Ответ

1 голос
/ 11 ноября 2019

Вы хотите ограничить средство выбора даты 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>

Следующая задача - передать значения массива в сценарий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...