#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
как более правильный способ.