Не уверен, почему сравнение между датой и массивом не находит совпадения

#javascript #jquery #html #google-apps-script

#javascript #jquery #HTML #google-apps-script

Вопрос:

У меня есть следующий HTML-код:

 <html lang="en">
<head>
  <meta charset="utf-8">
  <title>jQuery UI Datepicker - Default functionality</title>
  <link rel="stylesheet" href="//code.jquery.com/ui/1.11.0/themes/smoothness/jquery-ui.css">
  <script src="//code.jquery.com/jquery-1.10.2.js"></script>
  <script src="//code.jquery.com/ui/1.11.0/jquery-ui.js"></script>
  <link rel="stylesheet" href="/resources/demos/style.css">
  <style>
        .dp-highlight .ui-state-default {
            background: #484;
            color: #FFF;
        }
    </style>
    <script type='text/javascript'>
        var gigDates;
    </script>

    <script>
        window.onload = getGigDates();
        function getGigDates(){
            google.script.run.withSuccessHandler(retDates).getDates(date);
        }

        function retDates(gigDatesTwo){
            console.log("Returning the dates needed:  "  gigDatesTwo)
            gigDates = gigDatesTwo;
        }

        $(function() {
            $( "#datepicker" ).datepicker({
                onSelect: function(date) {updDate(date);},
                selectWeek: true,
                inline: true,
                startDate: '01/01/2000',
                firstDay: 1,
                beforeShowDay : available,
            });
        });


        function available(date) {
            console.log("From the Spread sheet:  "  gigDates);
            var dmy = (date.getMonth() 1)   "/"   date.getDate()   "/"   date.getFullYear();
            console.log(dmy ' : ' ($.inArray(dmy, gigDates)));
            if ($.inArray(dmy, gigDates) != -1) {
                return [true, "","Available"];
            } else {
                return [false,"","unAvailable"];
            }
        }

        function updDate(date){
            google.script.run.withSuccessHandler(myReturnFunction).updDate(date);
        }

        function myReturnFunction(whatGotReturned){
            document.getElementById("demo").innerHTML = whatGotReturned;
        }

    </script>
</head>
<body>
    <p>Date: <input type="text" id="datepicker" onchange="updDate()"></p>
    <p id="demo"></p>
    <input type="button" value="Close" onclick="google.script.host.close()" />
</body>
  

Функция getGigDates возвращает следующее:

[«5/12/2014″,»6/14/2014″,»6/6/2014″,»6/13/2014″,»6/17/2014″,»5/30/2014″,»6/3/2014″,»6/4/2014″,»6/18/2014″,»6/18/2014″,»6/20/2014″,»6/25/2014″,»6/19/2014″,»6/13/2014″,»6/27/2014″,»7/4/2014″,»7/1/2014″,»7/6/2014»,]

Но когда функция «доступно» сравнивает dmy с gigDates для 7/4/2014, она возвращает значение -1.

Редактировать: Вот часть вывода консоли для одной записи:

Из таблицы распространения: [«5/12/2014″,»6/14/2014″,»6/6/2014″,»6/13/2014″,»6/17/2014″,»5/30/2014″,»6/3/2014″,»6/4/2014″,»6/18/2014″,»6/18/2014″,»6/20/2014″,»6/25/2014″,»6/19/2014″,»6/13/2014″,»6/27/2014″,»7/4/2014″,»7/1/2014″,»7/6/2014»,] 6/14/2014 : -1

У меня неправильно отформатирована какая-либо из переменных dmy или gigDates?

Loren

редактировать скрипт Google:

 function getDates(){
 var ss = SpreadsheetApp.openById("0AnDrS3YbyWoLdC15aktnMTluUkQ3dWhNTFlyQXBPOFE");
  var list = ss.getSheetByName('Form Responses 1');
  var values = list.getRange(1,5,ss.getLastRow(),5).getValues();

  var gigDates;

  gigDates= "[";
  for (var i in values){
    if (values[i][0]!=""){
      if (values[i][0] != "Gig Date"){
        var ssDate = Utilities.formatDate(values[i][0], "GMT", "M/d/yyyy");
      gigDates = gigDates   '"' ssDate '"' ",";
      }
    }
  }
gigDates = gigDates   "]";
 Logger.log(gigDates);
  return gigDates;
}
  

Комментарии:

1. dmy, я полагаю, означает день, месяц, год, и все ваши выходные даты указаны в mdy, месяц, день, год.

2. @TylerH да, но две даты были отформатированы так, чтобы соответствовать друг другу. Я добавлю фрагмент вывода консоли выше.

3. Они действительно «выглядят» одинаково в консоли, но одного ли они типа? ваша функция gs возвращает массив строк в кавычках или просто массив строк? вы присоединились к нему ? не могли бы вы также показать функцию gs, пожалуйста?

4. @Sergeinsas Это мое подозрение, но у меня нет опыта, чтобы действительно сказать. Смотрите редактирование выше.

5. Не уверен, почему вы думали, что это должно быть.

Ответ №1:

Ваш код должен возвращать объект массива вместо строки. Ваш код должен выглядеть следующим образом:

 function getDates(){
 var ss = SpreadsheetApp.openById("0AnDrS3YbyWoLdC15aktnMTluUkQ3dWhNTFlyQXBPOFE");
  var list = ss.getSheetByName('Form Responses 1');
  var values = list.getRange(1,5,ss.getLastRow(),5).getValues();

  var gigDates = [];


  for (var i in values){
    if (values[i][0]!=""){
      if (values[i][0] != "Gig Date"){
        var ssDate = Utilities.formatDate(values[i][0], "GMT", "M/d/yyyy");
      gigDates.push(ssDate);
      }
    }
  }

 Logger.log(gigDates);
  return gigDates;
}
  

Другим вариантом может быть синтаксический анализ возвращаемой строки с помощью regex ( [0-9]{1,2}/[0-9]{1,2}/[0-9]{4} ), таким образом, ваша availible функция может выглядеть следующим образом:

     function available(date) {
        console.log("From the Spread sheet:  "  gigDates);
        var dmy = (date.getMonth() 1)   "/"   date.getDate()   "/"   date.getFullYear();
        console.log(dmy ' : ' ($.inArray(dmy, gigDates.match(/[0-9]{1,2}/[0-9]{1,2}/[0-9]{4}/gmi))));
        if ($.inArray(dmy, gigDates) != -1) {
            return [true, "","Available"];
        } else {
            return [false,"","unAvailable"];
        }
    }
  

Тем не менее, я рекомендую исправление getDates как более правильный способ.