Bots de conversa de Telegram amb Google Apps Script

Bots de conversa Exemples Dades pràctiques   Recursos CITCEA
Google Apps Script Projectes Interacció   Inici

HerreBot

HerreBot permet realitzar reserves a un restaurant mitjançant botons o comandes. A més, es poden eliminar les reserves, en cas que sigui necessari, i revisar les ja fetes per comprovar que s'ha fet tot correctament. També es pot demanar rebre un correu amb les dades per tenir una confirmació extra. Addicionalment, es pot veure la carta del restaurant i existeix l'opció per emportar, per poder fer encàrrecs i anar-los a recollir.

El restaurant rep automàticament les dades que s'introdueixen a Telegram a un arxiu de Google Sheets, on és genera un full en blanc per cada dia nou que es fa una reserva. També, per facilitar el treball, l'ordre dels fulls s'ordena automàticament (independentment de quan es generi el full), d'igual manera que ho fan les reserves en els fulls, segons l'hora.

El programa de l'script és el següent:

const token = "^^12747090:AAG_C6qXG187AMqh6hh8j0m_pbwBEwaLehk";
const IdHoja = "^^izBAGJ2gD3evqniUgyp23zG0b-FGH9UM_QA94fTyxo";
const IdAppScript = "^^fycbxWbx4vVFFqkM7lSsO3boC6NMozCAnbW-xvUXkiW8Btz7BJobkKT_2X3SBm0KIOU7uYuA";
const nombreRestaurante = "DON KAMARÓN";
const webAppUrl = "https://script.google.com/macros/s/" + IdAppScript + "/exec";
const telegramUrl = "https://api.telegram.org/bot" + token;
const botones_principales = {
  "inline_keyboard": [
    [{
      "text": "Reservar",
      "callback_data": "RESERVAR"
    }],
    [{
      "text": "Cancelar reserva",
      "callback_data": "ELIMINAR"
    }],
    [{
      "text": "Ver reservas",
      "callback_data": "RESERVAS"
    }]
  ]
};
const si_no = {
  "inline_keyboard": [
    [{
      "text": "Sí",
      "callback_data": "SI"
    },
    {
      "text": "No",
      "callback_data": "NO"
    }]
  ]
};
const responder = {
  "force_reply": true
};
function setWebhook() {
  var url = telegramUrl + "/setWebhook?url=" + webAppUrl;
  UrlFetchApp.fetch(url);
}
function sendMessage(chatId, text, keyboard) {
  if (keyboard){
    var data = {
      method: "post",
      payload: {
        method: "sendMessage",
        chat_id: String(chatId),
        text: text,
        parse_mode: "HTML",
        reply_markup: JSON.stringify(keyboard)
      }
    }
  } else{
    var data = {
      method: "post",
      payload: {
        method: "sendMessage",
        chat_id: String(chatId),
        text: text,
        parse_mode: "markdown"
      }
    };
  }
  UrlFetchApp.fetch(telegramUrl + '/', data);
}
function responderCallback(chat_id, text) {
  var url = telegramUrl + "/answerCallbackQuery?callback_query_id=" + chat_id + "&text=" + text;
  UrlFetchApp.fetch(url);
}
Date.prototype.addDays = function (days) {
  var fecha = new Date(this.valueOf());
  fecha.setDate(fecha.getDate() + days);
  return fecha;
}
function parseDate(dia_reserva_text) {
  var gg = dia_reserva_text.split("/");
  return new Date(gg[2], gg[1] - 1, gg[0]);
}
function HoraDelTexto(numbers) {
  var horaH = 00;
  var horaM = '00'; //string to not crop 00 
  if (!isNaN(numbers[1])) {
    horaH = numbers[1];
  }
  if (!isNaN(numbers[2])) {
    horaM = numbers[2];
  }
  return horaH + ':' + horaM;
}
const DATE_OPTIONS = { weekday: 'long', month: 'long', day: 'numeric' };
const ZONA_HORARIA = "Europe/Amsterdam";
const IDIOMA = "es-ES";
function BotonesDias(action, now) {
  return {
    "inline_keyboard": [
      [{
        "text": now.toLocaleDateString(IDIOMA, DATE_OPTIONS),
        "callback_data": action + "_" + now.toLocaleDateString(IDIOMA, { timeZone: ZONA_HORARIA })
      }],
      [{
        "text": now.addDays(1).toLocaleDateString(IDIOMA, DATE_OPTIONS),
        "callback_data": action + "_" + now.addDays(1).toLocaleDateString(IDIOMA, { timeZone: ZONA_HORARIA })
      }],
      [{
        "text": now.addDays(2).toLocaleDateString(IDIOMA, DATE_OPTIONS),
        "callback_data": action + "_" + now.addDays(2).toLocaleDateString(IDIOMA, { timeZone: ZONA_HORARIA })
      }],
      [{
        "text": now.addDays(3).toLocaleDateString(IDIOMA, DATE_OPTIONS),
        "callback_data": action + "_" + now.addDays(3).toLocaleDateString(IDIOMA, { timeZone: ZONA_HORARIA })
      }],
      [{
        "text": now.addDays(4).toLocaleDateString(IDIOMA, DATE_OPTIONS),
        "callback_data": action + "_" + now.addDays(4).toLocaleDateString(IDIOMA, { timeZone: ZONA_HORARIA })
      }],
      [{
        "text": now.addDays(5).toLocaleDateString(IDIOMA, DATE_OPTIONS),
        "callback_data": action + "_" + now.addDays(5).toLocaleDateString(IDIOMA, { timeZone: ZONA_HORARIA })
      }],
      [{
        "text": now.addDays(6).toLocaleDateString(IDIOMA, DATE_OPTIONS),
        "callback_data": action + "_" + now.addDays(6).toLocaleDateString(IDIOMA, { timeZone: ZONA_HORARIA })
      }]
    ]
  };
}
function BotonesHoras(action) {
  return {
    "inline_keyboard": [
      [{
        "text": "20:00",
        "callback_data": action + "_20:00"
      },
      {
        "text": "20:30",
        "callback_data": action + "_20:30"
      }],
      [{
        "text": "21:00",
        "callback_data": action + "_21:00"
      },
      {
        "text": "21:30",
        "callback_data": action + "_21:30"
      }],
      [{
        "text": "22:00",
        "callback_data": action + "_22:00"
      },
      {
        "text": "22:30",
        "callback_data": action + "_22:30"
      }],
    ]
  };
}
function BotonesLugar(action) {
  return {
    "inline_keyboard": [
      [{
        "text": "En el establecimiento",
        "callback_data": action + "_" + "ESTABLECIMIENTO"
      },
      {
        "text": "Para llevar",
        "callback_data": action + "_" + "LLEVAR"
      }]
    ]
  };
}
function createSheet(diaReserva) {
  var hoja = SpreadsheetApp.openById(IdHoja);
  hoja.insertSheet().setName(diaReserva);
  var sheet = hoja.getSheetByName(diaReserva);
  sheet.appendRow(["Reserva hecha por", "Día", "Hora", "Nombre de la reserva",
    "Comensales/ Pedido", "Para llevar", "Número total de comensales", ,
    "recibido_a_las", "texto_plano","user_id", "borrado_por"]);
  var Rojo = sheet.getRange("A1:F1");
  Rojo.setFontSize(12);
  Rojo.setBackground("#ed5353");
  Rojo.setFontWeight("bold");
  Rojo.setWrap(true);
  Rojo.setHorizontalAlignment("center");
  var Verde = sheet.getRange("G1:H1");
  Verde.setBackground("#8beb7c");
  Verde.setFontWeight("bold");
  Verde.setWrap(true);
  Verde.setFontSize(12);
  Verde.setHorizontalAlignment("left");
  var Gris = sheet.getRange("I1:M1");
  Gris.setFontColor("grey");
  Gris.setFontStyle("italic");
  var Total = sheet.getRange("H1");
  Total.setFormula("=SUM(E2:E1000)");
  Total.setFontSize(12);
  Total.setFontWeight("bold");
  Total.setBackground("#8beb7c");
}
function hacerReserva(user, diaReserva, hora, nombreReserva, reserva_numComensales, parallevar_text, text, chat_id) {
  var now = new Date();
  var sheet = SpreadsheetApp.openById(IdHoja).getSheetByName(diaReserva);
  if (sheet == null) {
    createSheet(diaReserva);
    sheet = SpreadsheetApp.openById(IdHoja).getSheetByName(diaReserva);
  }
  sheet.appendRow([user, diaReserva, hora, nombreReserva, reserva_numComensales, parallevar_text, , , now, text,chat_id]);
  sheet.getRange(sheet.getLastRow(), 5).setHorizontalAlignment("center");
  sheet.getRange(sheet.getLastRow(), 5).setFontLine("none");
  sheet.getRange(sheet.getLastRow(), 9, sheet.getLastRow(), 12).setFontColor("grey");
  sheet.getRange(sheet.getLastRow(), 9, sheet.getLastRow(), 12).setFontStyle("italic");
  sortSheets()
}
function borrarReserva(user, diaReserva, nombreReserva, chat_id) {
  var sheet = SpreadsheetApp.openById(IdHoja).getSheetByName(diaReserva);
  var rango = sheet.getRange(2, 4, sheet.getLastRow() , 8);
  var coincidencias = rango.createTextFinder(chat_id).matchEntireCell(true).findAll();
  var result = coincidencias.map(r => (r.getRow()));
  var c = 0;
  var borrado_por;
  var cancelado;
  var tachar;
  var rowindex;
  for (let i = 0; i < result.length; i++) {
    rowindex = result[i];
    var nombre_rango = sheet.getRange(rowindex, 4);
    var nombre = nombre_rango.getValue();
    if ( nombre == nombreReserva && nombre_rango.getFontLine() != "line-through"){
      c += 1
    }
  }
  if (c == 0){
    return "No hay reservas con este nombre para la fecha seleccionada."
  }

  for (let i = 0; i < result.length; i++) {
    rowindex = result[i];
    nombre_rango = sheet.getRange(rowindex, 4);
    nombre = nombre_rango.getValue()
    tachar = sheet.getRange(rowindex, 1, 1, 5);
    borrado_por = sheet.getRange(rowindex, 12);
    if ( c == 1 && nombre == nombreReserva && nombre_rango.getFontLine() != "line-through") {
      borrado_por.setValue(user);
      borrado_por.setFontColor("grey");
      borrado_por.setFontStyle("italic");
      tachar.setFontLine("line-through");
      cancelado = sheet.getRange(rowindex, 5);
      cancelado.setValue("cancelado");
      return "Has cancealdo la reserva a nombre de " + nombreReserva + " del " + diaReserva;
    }
  }
  return "He encontrado varias reservas con el mismo nombre. Para poder cancelar la reserva de forma correcta ponte en contacto con nosotros llamando al 503-760-4018.";
}
function test(){
  var hora = "20:12";
  var horas = hora.substring(0,2);
  var minutos = hora.substring(3,6);
  Logger.log(horas > 23 || minutos > 59 || horas <= 0 || minutos <= 0 || horas.length != 2 || minutos.length != 2);
}
function hacerhorabien(valores_google_sheets, parallevar){
  var info = "";
  var reservas = "";
  valores_google_sheets.forEach(row => {
    row[0] = row[0].toString();
    row[0] = row[0].substring(16,21);
    b = row[0].split(":");
    if (Number(b[1]) + 25 >= 60){
      b[0] = (Number(b[0]) + 1).toString();
      b[1] = "00";
      if (b[0] == Number(24)){
        b[0] = "00"
      }
    } else{
      b[1] = (Number(b[1]) + 25).toString();
    }
    if (parallevar == false){
      info = "-  A las " + b[0] + ":" + b[1] + " a nombre de " + row[1] + " para " + row[2] + ".";
      reservas += info + "\r\n";
    } else if (parallevar == true){
      row[2] = 
      info = "-  A las " + b[0] + ":" + b[1] + " a nombre de " + row[1] + " para llevar " + row[2] + ".";
      reservas += info + "\r\n";
    } else{
      if (row[3] == ""){
        info = "-  A las " + b[0] + ":" + b[1] + " a nombre de " + row[1] + " para " + row[2] + ".";
      } else{
        info = "-  A las " + b[0] + ":" + b[1] + " a nombre de " + row[1] + " para llevar " + row[2] + ".";
      }
      reservas += info + "\n";
    }
  });
  return reservas
}
function verReservas(diaReserva, parallevar, chat_id) {
  var sheet = SpreadsheetApp.openById(IdHoja).getSheetByName(diaReserva);
  if (!sheet)
    return null;
  var rows = sheet.getRange(2, 3, sheet.getLastRow() - 1, 10).getValues();
  var newRows = null;
  if (parallevar == true) {
    newRows = rows.filter(function (row) { return row[3] == "PARA LLEVAR" && row[2] != "cancelado" && row[8] == chat_id});
  } else if (parallevar == false) {
    newRows = rows.filter(function (row) { return row[3] == "" && row[2] != "cancelado" && row[8] == chat_id});
  } else if (parallevar == null){
   newRows = rows.filter(function (row) { return row[2] != "cancelado" && row[8] == chat_id});
  }
  reservas = hacerhorabien(newRows, parallevar);
  return reservas;
}
function Callback(contents) {
  var chat_id = contents.callback_query.from.id;
  var query_id = contents.callback_query.id;
  var user = contents.callback_query.message.chat.first_name;
  var text = contents.callback_query.data;
  var comandos = text.split("_");
  var numComandos = comandos.length;
  var comando_principal = comandos[0];
  var respuesta = null;
  if (comando_principal == "RESERVAS" && numComandos == 1) {
    respuesta = "Selecciona la opción para ver tus reservas.";
    responderCallback(query_id, "");
    return sendMessage(chat_id, respuesta, BotonesLugar(text));
  } else if (comando_principal == "RESERVAS" && numComandos == 2) {
    var botones_siguientes_dias = BotonesDias(text, new Date());
    respuesta = "Selecciona la fecha  ";
    responderCallback(query_id, "");
    return sendMessage(chat_id, respuesta, botones_siguientes_dias);
  } else if (comando_principal == "RESERVAS" && numComandos == 3) {
    var lugar = comandos[1];
    var parallevar = false;
    var sitio = "en el establecimiento";
    if (lugar == "LLEVAR") {
      parallevar = true;
      sitio = "para llevar";
    }
    var diaReserva = comandos[2];
    var reservas = verReservas(diaReserva, parallevar,chat_id);
    respuesta = "No hay reservas para la fecha seleccionada " + sitio;
    if (reservas) {
      respuesta = "Aquí están las reservas registradas " + sitio + " para: " + diaReserva + "\r\n";
      respuesta += reservas;
    }
    responderCallback(query_id, "Día seleccionado ");
    sendMessage(chat_id, respuesta, null);
    return sendMessage(chat_id, "¿Quieres realizar una nueva operación?", si_no);
  } else if (comando_principal == "RESERVAR" && numComandos == 1) {
    respuesta = "Selecciona cómo quieres realizar tu reserva.";
    responderCallback(query_id, "");
    return sendMessage(chat_id, respuesta, BotonesLugar(text));
  } else if (comando_principal == "RESERVAR" && numComandos == 2) {
    var lugar = comandos[1];
    var sitio = "en el establecimiento";
    if (lugar == "LLEVAR")
      sitio = "para llevar";
    var botones_siguientes_dias = BotonesDias(text, new Date());
    respuesta = "Selecciona la fecha para reservar " + sitio;
    responderCallback(query_id, "");
    return sendMessage(chat_id, respuesta, botones_siguientes_dias);
  } else if (comando_principal == "RESERVAR" && numComandos == 3) {
    var diaReserva = comandos[2];
    var lugar = comandos[1];
    var sitio = "en el establecimiento";
    if (lugar == "LLEVAR")
      sitio = "para llevar";
    var botones_horas = BotonesHoras(text);
    respuesta = "Selecciona la hora para reservar " + sitio + " el día " + diaReserva;
    responderCallback(query_id, "Día seleccionado ");
    return sendMessage(chat_id, respuesta, botones_horas);
  } else if (comando_principal == "RESERVAR" && numComandos == 4) {
    respuesta = "¡Vale " + user + "! " + "Escribe a nombre de quién es la reserva y ";
    var lugar = comandos[1];
    var fecha = comandos[2];
    var hora = comandos[3];
    if (lugar == "LLEVAR") {
      respuesta += "qué quieres para llevar el día: " + fecha + " a las " + hora;
    } else {
      respuesta += "el número de comensales para el día: " + fecha + " a las " + hora;
    }
    responderCallback(query_id, "Hora seleccionada ");
    return sendMessage(chat_id, respuesta, responder);
  } else if (comando_principal == "ELIMINAR" && numComandos == 1) {
    var botones_siguientes_dias = BotonesDias(text, new Date());
    respuesta = "Selecciona el día que quieras eliminar una reserva.";
    responderCallback(query_id, "");
    return sendMessage(chat_id, respuesta, botones_siguientes_dias);
  } else if (comando_principal == "ELIMINAR" && numComandos == 2) {
    var diaReserva = comandos[1];
    var parallevar = null;
    var reserva = verReservas(diaReserva, parallevar, chat_id);
    respuesta = "No hay reservas para la fecha seleccionada.";
    if (reserva) {
      respuesta = "¡Vale " + user + "! ";
      respuesta += "Escribe el nombre de la reserva que quieres eliminar del : " + diaReserva + " \n";
      respuesta += reserva;
    }
    responderCallback(query_id, "Día seleccionado ");
    return sendMessage(chat_id, respuesta, responder);
  } else if (comando_principal == "SI") {
    respuesta = "¡Hola " + user + "!\nElige que quieres hacer presionando uno de los botones que aparecen a ";
    respuesta = respuesta + "continuación. Si quieres realizar una reserva de forma manual, escribe ";
    respuesta = respuesta + "/ayuda para saber qué pasos seguir.\nSi quieres consultar nuestra carta ";
    respuesta = respuesta + "para realizar un pedido para llevar, escribe /carta.";
    responderCallback(query_id, "");
    return sendMessage(chat_id, respuesta, botones_principales);
  } else if (comando_principal == "NO"){
    responderCallback(query_id, "");
  }
}
function leerTexto(chat_id, user, text, fecha, hora) {
  var respuesta = "";
  var text = text.toUpperCase();
  var parallevar = false;
  var sitio = "en el establecimiento";
  var max = 100;
  if (text.includes("PARA LLEVAR")) {
    parallevar = true;
    sitio = "para llevar";
    text = text.replace("PARA LLEVAR", "");
    text = text.trim();
  }
  if (text == "/CARTA"){
    enlace_carta = "https://donkamaron.com/menu.html"
    sendMessage(chat_id, enlace_carta);
    return sendMessage(chat_id, "¿Quieres realizar una nueva operación?", si_no);
  }
  if (text.includes("EMAIL")) {
    respuesta = "Si quieres añadir un comentario (alergias, sillas para bebés, etc.), ";
    respuesta = respuesta + "llámanos al 503-760-4018.\n¿Quieres realizar otra operación?";
    text = text.substr("EMAIL".length);
    text = text.trim()
    var text_split = text.split(" ");
    var mail = text_split[0];
    var nombreReserva = text_split[1];
    var comensales_pedido = text.substring(mail.length + nombreReserva.length + 2);
    if (mail != "NULL"){
      respuesta = "Te hemos enviado un correo con la información de tu reserva. ¿Quieres realizar otra operación?";
      var titulo = "Reserva realizada con éxito"
      if (parallevar == true){
        var cuerpo = "Has realizado una reserva en " + nombreRestaurante + "." +  "\nLa reserva es el día ";
        cuerpo = cuerpo + fecha + " a las " + hora + " a nombre de " + nombreReserva + " para llevar: ";
        cuerpo = cuerpo + comensales_pedido + ". \nSi quieres cancelar la reserva hazlo mediante nuestro bot de Telegram. \n";
        cuerpo = cuerpo + "Para cualquier otra consulta llámanos al 503-760-4018.\nSi quieres añadir un ";
        cuerpo = cuerpo + "comentario (alergias, sillas para bebés, etc.), hazlo respondiendo a este correo.";
      }else{
        var cuerpo = "Has realizado una reserva en " + nombreRestaurante + "." +  "\nLa reserva es el día ";
        cuerpo = cuerpo + fecha + " a las " + hora + " a nombre de " + nombreReserva + " para " + comensales_pedido;
        cuerpo = cuerpo + ". \nSi quieres cancelar la reserva hazlo mediante nuestro bot de Telegram.\n";
        cuerpo = cuerpo + "Si quieres añadir un comentario (alergias, sillas para bebés, etc.), llámanos al 503-760-4018."
      }
      if (!text.includes("@")){
        return sendMessage(chat_id, "No has introducido el correo correctamente. ¿Quieres realizar otra operación?", si_no);
      }
      GmailApp.sendEmail(mail.toLowerCase(),titulo,cuerpo);
    }
    return sendMessage(chat_id, respuesta, si_no);
  }
  if (text == "/START") {
    respuesta = "¡Hola " + user + "! \n" + "Elige que quieres hacer presionando uno de los botones que aparecen ";
	respuesta = respuesta + "a continuación. Si quieres realizar una reserva de forma manual, escribe ";
	respuesta = respuesta + "/ayuda para saber qué pasos seguir.";
    return sendMessage(chat_id, respuesta, botones_principales);
  } else if (text == "/AYUDA") {
    respuesta = "¡Hola " + user + "! \nIMPORTANTE:\n Solo tienes que cambiar lo que hay en cursiva.\n ";
    respuesta += "Escribe la hora con el formato *hh:mm*, por ejemplo 21:00.\n ";
    respuesta += "Escribe la fecha con el formato *dd/mm/yyyy*, por ejemplo 23/09/2022.  \n \n";
    respuesta += "Si quieres realizar la reserva de forma manual escribe: \n-  En el establecimiento: ";
    respuesta += "'_Nombre_ _Comensales_ _Hora_ _Fecha_'. \n-  Para llevar: '_Nombre_ _Pedido_ _Hora_ _Fecha_ Para llevar'. \n \n";
    respuesta += "Si quieres conocer tus reservas registradas escribe: \n-  ";
    respuesta += "En el establecimiento: 'Reservas _Fecha_'.  \n-  Para llevar: 'Reservas _Fecha_ Para llevar'. \n \n"
    respuesta += "Si quieres cancelar una reserva:  \n-  Escribe 'Eliminar _Nombre_ _Fecha_'."    
    sendMessage(chat_id, respuesta, null);
    return sendMessage(chat_id, "¿Quieres realizar una nueva operación?", si_no);
  }
  if (!fecha) {
    if (text.includes("/")){
      var text_split = text.split(" ")
      for (let i = 0; i < text_split.length; i++) {
        if (text_split[i].includes("/")) {
          a = text_split[i];
        }
      }
      text = text.substring(0, text.length - a.length - 1)
      var div = a.split("/")
      if (div.length != 3 || div[0] > 31 || div[0] < 1 || div[1] < 1 || div[2] > 2050 || div[2] < 2022 || div[0].length != 2 || div[1].length != 2 || div[2].length != 4){
        return sendMessage(chat_id, "Fecha incorrecta.");
      }
      fecha = new Date(div[2],div[1]-1,div[0]) ;
    } else{
      return sendMessage(chat_id, "No has introducido los datos correctamente. Escribe /ayuda para saber cómo hacerlo o utiliza los botones para introducirlos de una manera más sencilla.", botones_principales);
    }
  }
  var diaReserva = fecha.toLocaleDateString(IDIOMA, { timeZone: ZONA_HORARIA });
  var sheet = SpreadsheetApp.openById(IdHoja).getSheetByName(diaReserva);
  var _20_00 = 0;
  var _20_30 = 0;
  var _21_00 = 0;
  var _21_30 = 0;
  var _22_00 = 0;
  var _22_30 = 0;
  if (sheet) {
    var rows = sheet.getRange(2, 3, sheet.getLastRow() - 1, 3).getValues();
    var newRows = rows.filter(function (row) {return row[2] != "cancelado"})
    newRows.forEach(row => {
      row[0] = row[0].toString();
      row[0] = row[0].substring(16,21);
      b = row[0].split(":");
      if (Number(b[1]) + 25 >= 60){
        b[0] = (Number(b[0]) + 1).toString();
        b[1] = "00";
        if (b[0] == Number(24)){
          b[0] = "00"
        }
      } else{
        b[1] = (Number(b[1]) + 25).toString();
      }
      if(b[0] + ":" + b[1] == "20:00"){
        _20_00 += row[2];
      } else if(b[0] + ":" + b[1] == "20:30"){
        _20_30 += row[2];
      } else if(b[0] + ":" + b[1] == "21:00"){
        _21_00 += row[2];
      } else if(b[0] + ":" + b[1] == "21:30"){
        _21_30 += row[2];
      } else if(b[0] + ":" + b[1] == "22:00"){
        _22_00 += row[2];
      } else if(b[0] + ":" + b[1] == "22:30"){
        _22_30 += row[2];
      }
    });
  }
  if (text.startsWith("RESERVAS")) {
    var text_split = text.split(" ")
    var reservas = verReservas(diaReserva, parallevar, chat_id);
    if (text_split.length != 1){
      return sendMessage(chat_id, "No has introducido los datos correctamente. Escribe /ayuda para saber cómo hacerlo o utiliza los botones para ver las reservas de una manera más sencilla.", botones_principales);
    } else{
      if (!reservas) {
        respuesta = "No hay reservas para la fecha seleccionada " + sitio + ".";
      }
      else {
        respuesta = "¡Hola " + user + "! Aquí están las reservas registradas del " + diaReserva + ": " + "\r\n";
        respuesta += reservas;
      }
    }
  } else if (text.startsWith("ELIMINAR")) {
    text = text.substr("ELIMINAR".length + 1);
    var text_split = text.split(" ");
    respuesta = "No hay reservas para la fecha seleccionada.";
    if (text_split.length != 1 || text == ""){
      return sendMessage(chat_id, "No has introducido los datos correctamente. Escribe /ayuda para saber cómo hacerlo o utiliza los botones para cancelar una reserva de una manera más sencilla.", botones_principales);
    }
    var reservas = verReservas(diaReserva, null, chat_id);
    if (reservas){
      var nombreReserva = text;
      respuesta = borrarReserva(user, diaReserva, nombreReserva, chat_id);
    }
  } else {
    var text_split = text.split(" ");
    var nombreReserva = text_split[0];
    var comensales_pedido = text.substring(nombreReserva.length + 1);
    if (!hora) {
      for (let i = 0; i < text_split.length; i++) {
        if (text_split[i].includes(":")) {
          hora = text_split[i];
        }
      }
      if (!hora){
        return sendMessage(chat_id, "No has introducido la hora correctamente. Escribe /ayuda para saber cómo hacerlo o utiliza los botones para reservar de una manera más sencilla.", botones_principales);
      }
      var horas = hora.substring(0,2);
      var minutos = hora.substring(3,6);
  
      if (horas > 23 || minutos > 59 || horas.length != 2 || minutos.length != 2){
        respuesta = "Hora incorrecta. Las horas de reserva son:\n20:00  20:30  21:00  21:30  22:00  22:30"
        return sendMessage(chat_id, respuesta, null);
      }
      if ( horas > 22 || horas < 20 || (minutos != 30 && minutos != 00)){
        respuesta = "Las horas de reserva son:\n20:00  20:30  21:00  21:30  22:00  22:30"
        return sendMessage(chat_id, respuesta, null);
      }
      comensales_pedido = comensales_pedido.substring(0, comensales_pedido.length - hora.length - 1);
    }
    if (parallevar) {
      respuesta = "Por último, escribe tu correo electrónico para que te enviemos la confirmación ";
      respuesta = respuesta + "de la reserva del día: " + diaReserva + " a las " + hora + " a nombre de " + nombreReserva;
      respuesta = respuesta + " para llevar: " + comensales_pedido + ". Si no quieres recibir el correo, escribe 'null'.";
      hacerReserva(user, diaReserva, hora, nombreReserva, comensales_pedido, "PARA LLEVAR", text, chat_id);
    } else {
      respuesta = "Por último, escribe tu correo electrónico para que te enviemos la confirmación ";
      respuesta = respuesta + "de la reserva del día: " + diaReserva + " a las " + hora + " a nombre de ";
      respuesta = respuesta + nombreReserva + " para " + comensales_pedido + ". Si no quieres recibir el correo, escribe 'null'.";
      if(isNaN(Number(comensales_pedido))){
        respuesta = "Número de comensales incorrecto."
        return sendMessage(chat_id, respuesta, null);
      }
      var dif = 0;
      if(hora){
        var horas = hora.substring(0,2);
        var minutos = hora.substring(3,6);
      }
      if(horas + ":" + minutos == "20:00"){
        dif = max - _20_00;
        if(Number(_20_00) + Number(comensales_pedido) > max){
          respuesta = "La capacidad del restaurante no permite más reservas a esta hora.";
          if (dif != 0){
            respuesta = "La capacidad del restaurante no permite más reservas a esta hora. ";
            respuesta = respuesta + "El máximo de comensales posibles sería " + dif + ".";
          }
          return sendMessage(chat_id, respuesta, null);
        }
      } else if(horas + ":" + minutos == "20:30"){
        dif = max - _20_30;
        if(Number(_20_30) + Number(comensales_pedido) > max){
          respuesta = "La capacidad del restaurante no permite más reservas a esta hora.";
          if (dif != 0){
            respuesta = "La capacidad del restaurante no permite más reservas a esta hora. ";
            respuesta = respuesta + "El máximo de comensales posibles sería " + dif + ".";
          }
          return sendMessage(chat_id, respuesta, null);
        }
      } else if(horas + ":" + minutos == "21:00"){
        dif = max - _21_00;
        if(Number(_21_00) + Number(comensales_pedido) > max){
          respuesta = "La capacidad del restaurante no permite más reservas a esta hora.";
          if (dif != 0){
            respuesta = "La capacidad del restaurante no permite más reservas a esta hora. ";
            respuesta = respuesta + "El máximo de comensales posibles sería " + dif + ".";
          }
          return sendMessage(chat_id, respuesta, null);
        }
      } else if(horas + ":" + minutos == "21:30"){
        dif = max - _21_30;
        if(Number(_21_30) + Number(comensales_pedido) > max){
          respuesta = "La capacidad del restaurante no permite más reservas a esta hora.";
          if (dif != 0){
            respuesta = "La capacidad del restaurante no permite más reservas a esta hora. ";
            respuesta = respuesta + "El máximo de comensales posibles sería " + dif + ".";
          }
          return sendMessage(chat_id, respuesta, null);
        }
      } else if(horas + ":" + minutos == "22:00"){
        dif = max - _22_00;
        if(Number(_22_00) + Number(comensales_pedido) > max){
          respuesta = "La capacidad del restaurante no permite más reservas a esta hora.";
          if (dif != 0){
            respuesta = "La capacidad del restaurante no permite más reservas a esta hora. ";
            respuesta = respuesta + "El máximo de comensales posibles sería " + dif + ".";
          }
          return sendMessage(chat_id, respuesta, null);
        }
      } else if(horas + ":" + minutos == "22:30"){
        dif = max - _22_30;
        if(Number(_22_30) + Number(comensales_pedido) > max){
          respuesta = "La capacidad del restaurante no permite más reservas a esta hora.";
          if (dif != 0){
            respuesta = "La capacidad del restaurante no permite más reservas a esta hora. ";
            respuesta = respuesta + "El máximo de comensales posibles sería " + dif + ".";
          }
          return sendMessage(chat_id, respuesta, null);
        }
      }
      hacerReserva(user, diaReserva, hora, nombreReserva, comensales_pedido, "", text, chat_id);
    }
    return sendMessage(chat_id, respuesta, responder);
  }
  sendMessage(chat_id, respuesta, null);
  return sendMessage(chat_id, "¿Quieres realizar una nueva operación?", si_no);
}
function leerRespuesta(chat_id, user, texto_respuesta, text) {
  if (texto_respuesta.toUpperCase().includes("ELIMINAR".trim())) {
    text = "ELIMINAR " + text;
  }
  if (texto_respuesta.toUpperCase().includes("PARA LLEVAR")) {
    text = "PARA LLEVAR" + text;
  }
  var dia_reserva_text = texto_respuesta.substring(texto_respuesta.indexOf(":") + 2);
  var hora = null;
  if (dia_reserva_text.includes(" ")) {
    var dia_hora = dia_reserva_text.split(" ");
    var fecha = dia_hora[0];
    hora = dia_hora[3];
    if (dia_reserva_text.length > 5){
    nombreReserva = dia_hora[7];
    }
  }
  if (texto_respuesta.toUpperCase().includes("ELECTRÓNICO")) {
    text = "EMAIL" + text + " " + nombreReserva;
    if (texto_respuesta.toUpperCase().includes("PARA LLEVAR")) {
      texto_respuesta = dia_reserva_text.substring(49 + nombreReserva.length);
      pedido = texto_respuesta.substring(0, texto_respuesta.indexOf("."));
      text = text + " " + pedido;
    } else{
      texto_respuesta = dia_reserva_text.substring(41 + nombreReserva.length);
      numeroPersonas = texto_respuesta.substring(0, texto_respuesta.indexOf("."));
      text = text + " " + numeroPersonas;
    }
  } else{
    fecha = parseDate(fecha);
  }
  leerTexto(chat_id, user, text, fecha, hora);
}
function doPost(e) {
  var contents = JSON.parse(e.postData.contents);
  if (contents.callback_query) {
    Callback(contents);
  } else if (contents.message) {
    var chat_id = contents.message.from.id;
    var user = contents.message.chat.first_name;
    if (contents.message.reply_to_message) {
      var texto_respuesta = contents.message.reply_to_message.text;
      var text = contents.message.text;
      leerRespuesta(chat_id, user, texto_respuesta, text);
    } else if (contents.message.text) {
      leerTexto(chat_id, user, contents.message.text, null, null);
    }
  }
}
function sortSheets () {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheets = ss.getSheets();
  var obj = sheets.map(function(s) {
    var sheetName = s.getSheetName();
    var ar = sheetName.split("/");
    var fecha = new Date(ar[2], ar[1], ar[0]).getTime();
    return {sheet: s, converted: fecha};
  });
  obj.sort(function(a, b) {return a.converted > b.converted ? 1 : -1});
  obj.forEach(function(s, i) {
    ss.setActiveSheet(s.sheet);
    ss.moveActiveSheet(i + 1);
  });
  for (var i = 0; i < sheets.length; i++) {
    var spreadsheet = sheets[i]
    var range = spreadsheet.getRange(2,1,spreadsheet.getLastRow() - 1,13);
    range.sort([3,5]);
  }
}
function deletesSheet(){
  var dias_guardar = 98; //Dias que queremos guardar
  var ss = SpreadsheetApp.getActive();
  var MILLIS_PER_DAY = 1000 * 60 * 60 * 24;
  var today = new Date();
  var deleteWeek = Utilities.formatDate(new Date(today.getTime() - (dias_guardar * MILLIS_PER_DAY)), "GMT+1", "dd/MM/yyyy");
  var div = deleteWeek.split("/");
  var dia = div[0];
  var mes = div[1];
  var year = div[2];
  if(dia[0] == "0"){
    dia = dia[1];
  }
  if(mes[0] == "0"){
    mes = mes[1];
  }
  var sheet = ss.getSheetByName(dia + "/" + mes + "/" + year);
  ss.deleteSheet(sheet);
}

 

 

 

 

 

 

 

 

 

 

Llicència de Creative Commons
Aquesta obra d'Oriol Boix està llicenciada sota una llicència no importada Reconeixement-NoComercial-SenseObraDerivada 3.0.