Menu de restaurante con spreadsheet de google
Author: Jerome P.Buenos dias
A continuación les dejo un script nuevamente que permite realizar menus de restaurantes dinamicos a traves de la conexion con hojas de datos de google. Se muestra el resultado en el siguiente video. Este utiliza vue.js y axios. Esto tien la ventaja que para actualizar los menus no se tiene porque acceder al wsx5 sino al google drive
https://drive.google.com/file/d/1G94UScXz9WJGRysKf_ZI3-WmE_5WmBM1/view?usp=sharing
El script tiene dos partes:
HTLM/script y CSS
<!--Cargamos las bibliotecas -->
<link href="https://fonts.googleapis.com/css?family=Damion|Quicksand" rel="stylesheet">
<script type='text/javascript' src='https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.min.js'>
<script type='text/javascript' src='https://cdnjs.cloudflare.com/ajax/libs/axios/0.18.0/axios.min.js'>
<!--Zona donde se muestran los menus -->
<div id="app">
<section id="SeccionDesayunos" class="contenedor-desayunos" v-if="Datosmenu_I" :style="Estilomenu">
<div id="componente-desayuno" :style="Estilomenu">
<h1>Desayunos</h1>
<div class="desayunos-contenedor-tabla">
<table>
<tbody v-for="item in Datosmenu_I" :key="`specialmenu-${item.nombre}`">
<tr class="nombreyprecio ">
<td :style="dotStyle">
<span :style="Estilomenu">{{item.nombre}}</span>
</td>
<td :style="dotStyle">
<span :style="Estilomenu">${{item.precio}}</span>
</td>
</tr>
<tr class="descripcion">
<td colspan="2">{{item.descripcion}}</td> <!--Colspan 2 corresponde a agrupar las dos primeras filas en una sola celda -->
</tr>
</tbody>
</table>
<table>
<tbody v-for="item in Datosmenu_D" :key="`specialmenu-${item.nombre}`">
<tr class="nombreyprecio ">
<td :style="dotStyle">
<span :style="Estilomenu">{{item.nombre}}</span>
</td>
<td :style="dotStyle">
<span :style="Estilomenu">${{item.precio}}</span>
</td>
</tr>
<tr class="descripcion">
<td colspan="2">{{item.descripcion}}</td>
</tr>
</tbody>
</table>
</div>
</div>
</section>
</div>
<!--Script de conexion de datos con google spreadsheet a traves de vue.js -->
<script>
var app = new Vue({
el: '#app',
mounted() {
let vm = this
axios
.get(
'https://sheets.googleapis.com/v4/spreadsheets/1bV84JHhpIlt55_0e4TrJao3JAuvCN5r9L0x69e_BIbE/values/A2%3AC?key=AIzaSyD3bawKWreyAM_ReVJ3eBm2qC2v4qN9XHc'// Conexion a google spreadsheet donde 1bV84JHhpIlt55_0e4TrJao3JAuvCN5r9L0x69e_BIbE es la refrencia de la hoja que se obtiene de la direccion HTLM, A2%3AC es el rango de la celda A2 al final de AC, AIzaSyD3bawKWreyAM_ReVJ3eBm2qC2v4qN9XHc es la API key de google que se obtiene personalmente
)
.then(function (response) {
let desayunos = response.data.values
for (let indice = 0; indice < desayunos.length; indice++) {
const elemento = desayunos [indice]
let mitem = {
nombre: elemento[0],// Se atribuye la variable nombre al elemento de la columna 0 de la hoja
descripcion: elemento[1],// Se atribuye la variable descricpion al elemento de la columna 1 de la hoja
precio: elemento[2]// Se atribuye la variable precio al elemento de la columna 2 de la hoja
}
if (vm.isEven(indice)) {
vm.Datosmenu_I = vm.Datosmenu_I.concat(mitem)
} else {
vm.Datosmenu_D = vm.Datosmenu_D.concat(mitem)
}
}
console.log(response)
})
},
data: {
Datosmenu_I: [],// Datos que figuran en el lado izquierdo del menu
Datosmenu_D: [],// Datos que figuran en el lado derecho del menu
Estilomenu: {
background: 'White',// Color de fondo del menu
color: 'gray'// Color de las letras del menu
},
dotStyle: {
backgroundImage: 'radial-gradient(' + this.color + ' 1px, transparent 0px)'
}
},
computed: {},
methods: {
isEven: function (n) {
return n % 2 == 0
}
}
});
</script>
El CSS
body,
html {
margin: 0;
padding: 0;
background-color: #ffe6d1;
}
a{
text-decoration: none;
}
.contenedor-desayunos {
display: flex;
justify-content: center;
align-items: center;
text-align: center;
font-family: Quicksand, arial;
font-size: 16px;
font-weight: 600;
}
.contenedor-desayunos table {
width: 90%;
margin: 0px auto;
table-layout: fixed;
border-collapse: collapse;
}
#componente-desayuno {
width: 100%;
background-color: #fff;
margin: 0 auto;
}
.desayunos-contenedor-tabla {
max-width: 1500px;
margin: 40px auto;
}
h1 {
font-family: "Damion", cursive;
font-size: 50px;
font-weight: 100;
line-height: 25px;
}
.nombreyprecio td {
padding: 1em 0 0 0;
vertical-align: bottom;
background-image: radial-gradient(black 1px, transparent 0px);
background-size: 8px 8px;
background-repeat: repeat-x;
background-position: left bottom;
}
.nombreyprecio span {
background-color: #fff;
}
.nombreyprecio td:first-child {
text-align: left;
font-weight: 700;
font-size: 20px;
}
.nombreyprecio td:first-child span {
padding-right: 0.25em;
}
.nombreyprecio td:last-child {
text-align: right;
width: 3em;
font-size: 20px;
}
.descripcion td {
text-align: left;
padding: 8px 0px 15px 15px;
}
td:last-child span {
padding-left: 0.25em;
}
@media (min-width: 992px) {
.contenedor-desayunos table {
margin: 40px;
width: 45%;
}
.desayunos-contenedor-tabla {
display: flex;
margin: 0px auto;
}
}
Estimado... muchiiiiiisimas gracias!
Estos son aportes que valen oro, ya mismo me voy a guardar toda la explicacion por si sale algun cliente que lo requiera.
Muchisimas gracias por compartir esto tan valioso!!!!
Saludos colega!
Carlos A.
Author
gracias Carlos
Te mando un enlace que puede ayudarte a entender vue y axios por si quieres indagar un poco mas.
Usando Axios para consumir APIs — Vue.js (vuejs.org)
Estoy mejorando el anterior poste en el que se ve el portfolio y fichas tecnicas. Lo voy a intentar pasar a esta refrenica vue y axios que me parecen un poco mas simples de usar en los referente a filtros de busqueda.
En cuanto lo tenga lo paso.
Saludos
Nota: seria muy interesante que incomedia pudiera crear objetos que permitan estas conexiones y manipulaciones ya que resuelven un poco el tema de poder actualizar datos sin tener que pasar por wsx5 . Como sugerencias, se podria integrar objetos de:
Ofertas de empleo
Inmobiliaria en venta y renta
Catalogos tecnicos donde se muestran las fichas
Zona de miembros
hasta foro
A tituilo informativo es lo que vende awesometable.
Estimado, muchas gracias!! excelente aporte!!!! grandioso!!!!
Saludos
Rubens
Hola Jerome P.
Que buen contenido, lo mejor es ver usuarios compartiendo conocimiento, es la idea de este HelpCenter, llevaremos WebSite X5 a otro nivel, en definitiva deberíamos tener categoria de los mejores post.
Saludos
Jorge M.
Hola Jerome,
en primer lugar agradecerte el trabajo. Yo siempre he sido muy critico con Incomedia y sus "objetos" muchos de ellos sin mucha utilidad, cuando códigos como el tuyo son mucho más útiles.
Estoy probando tu código, pero tengo una duda, y es que, a la hora de generar el enlace de la hoja, ¿cómo consigues la URL sheets.googleapis.com?
Yo cree una cuenta en API junto con un proyecto para tener la key de API pero no logro generar una URL así, ya que la que genero es la de la hoja tipo https://docs.google.com/spreadsheets/
Un saludo
Author
Hola Antonio
Perdon por la demora en la contestacion anduve fuera.
Para poder usar la hoja lo unico que debes hacer es fijarte en la referencia que se muestra en la barra del explorador ta l como decias https://docs.google.com/spreadsheets/codigo que se debe extraer y extraer parte de ella asi como tener la API key que tambien deberas pegar manualmente
'https://sheets.googleapis.com/v4/spreadsheets/Pega la refrencia aqui/values/A2%3AC?key=pega aqui la API KEY'
En teoria debe poder acceder a la hoja. Hay optra formas de conectar si necesidad de la API KEY. Estoy terminando un codigo para empleo que en los proximos dias subire.
Saludos
Author
De todas formas te dejo un enlace donde se puede ver de forma mas visual.
Saludos
Leer archivo Google Sheets desde JS (Vuejs) | by Alejandro Oñate | Medium
Encontre el problema. Los dos primeros scripts no se cierran.
Andaba buscando algo así, poco a poco estoy tratando de traer tambien imagenes desde sheet (para los alergenos), si lo consigo lo comparto por aquí (html y php no controlo mucho, soy programador pero en Java, SQL, C#)
+1 colega! muchas graciassss!!!
Author
Gracias Antonio. te mando el codigo ya que es lo tengo hecho, lectura, busqueda y filtracion de datos de spreadsheet con imageners, vinvulos etc. No lo termine porque ando mejorando pero este fin de semana te lo adjunto por este medio.
Yo estoy peleandome con la hoja jaja, estoy intentando que en la fila 1 figuren las imágenes de cada alergeno, y en cada columna se marque con una x si está presente, después ya en el proyecto, con un condicional que compruebe si es "x" y si lo es que muestre la imagén de ese alergeno