Google Apps Script
Google Apps Script
@JJArizaV
@impactotecno
https://www.youtube.com/user/jjdroneariza
https://www.youtube.com/watch?v=15zSL5infoc
Gmail
Calendario
Drive
Gtalk
Sites
Dashboard
https://script.google.com/dashboard
Descubrir errores
Reutilizar atributos CSS
Modificar la apariencia de elementos
Reutilizar selectores CSS
Ejemplo prctico:
Vamos a cambiar el logo de Google en www.google.es al logo de
nuestra empresa
Terminologa
Funciones
Funciones anonimas
myWidth();
Estndares de codificacin
Sangra
La unidad de sangra es de cuatro espacios. El uso de
pestaas debe ser evitada porque todava no hay un
estndar para el tamao de los tabuladores. El uso de
espacios puede producir un tamao de archivo ms grande,
pero el tamao no es significativo sobre las redes locales, y
la diferencia se elimina por minificacin.
Estndares de codificacin
Longitud de la lnea
Evite lneas de ms de 80 caracteres. Cuando una
instruccin no cabe en una sola lnea, puede ser necesario
para separarla.
Coloque el espacio en blanco despus de un operador,
idealmente despus de una coma. Un espacio en blanco
despus de un operador disminuye la probabilidad de que
un error al reutilizar el script.
Estndares de codificacin
Comentarios
Sea generoso con sus comentarios. Es conveniente dejar la
informacin que ser leda posteriormente por personas
(posiblemente usted) que se necesitan para comprender lo que ha
hecho. Los comentarios deben estar bien escritos y ser claros, al igual
que el cdigo que estn anotando. Una punto de humor ocasional
puede ser apreciado. Las frustraciones y resentimientos no.
Es importante que los comentarios se mantegan al da. Comentarios
errneos pueden hacer que los programas an ms difcil de leer y
entender.
Haga comentarios significativos. Concntrese en lo que no es
inmediatamente visible.
Estndares de codificacin
Declaraciones de variables
Todas las variables deben ser declaradas antes de utilizar.
JavaScript no requiere esto, pero esto hace que el programa
sea ms fcil de leer y hace que sea ms fcil detectar las
variables no declaradas que pueden convertirse en
variables globales implcitas.
Se prefiere que cada variable se le dar su propia lnea y
comentario. Ellos deben ser listadas en orden alfabtico.
Estndares de codificacin
Declaraciones de funcin
Todas las funciones deben ser declaradas antes de ser utilizado.
Funciones internas deben seguir la declaracin var. Esto ayuda a
aclarar qu variables se incluyen en su mbito de aplicacin.
No debe haber ningn espacio entre el nombre de una funcin y
el parntesis izquierdo de su lista de parmetros. Debe haber un
espacio entre el parntesis derecho y la llave izquierda que
empieza de que el cuerpo de la instruccin. El propio cuerpo
debe separarse con cuatro espacios. La llave de cierre est
alineada con la lnea que contiene el principio de la declaracin
de la funcin.
Estndares de codificacin
Nombres
Los nombres deben formarse a partir maysculas y minsculas
(A .. Z, a .. z), los 10 dgitos (0 .. 9) y _ (guin bajo). Evite el uso
de caracteres internacionales, ya que no pueden leer bien o
entender en todas partes. No utilice $ (signo de dlar) o \ (barra
invertida) en los nombres.
No utilice _ (subrayado) como el primer carcter de un nombre.
A veces se usa para indicar la privacidad, pero en realidad no
ofrecen privacidad..
La mayora de las variables y funciones deben empezar con una
letra minscula, se recomienda usar camelCase
<html>
<body>
<h3> Hola mundo JS </h3>
<script language=javascript>
alert (Math.random ());
</script>
</body>
</html>
function Person(gender) {
this.gender = gender;
alert('Person instantiated');
}
var person1 = new Person('Hombre');
var person2 = new Person('Mujer');
alert ('person1 is a' + person1.gender);
{
"menu": {
"id": "file",
"value": "File",
"popup": {
"menuitem": [ {"value": "New", "onclick": "CreateNewDoc()"},
{"value": "Open", "onclick": "OpenDoc()"},
{"value": "Close", "onclick": "CloseDoc()"}
]
}
}
}
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
</head>
<body>
<section id="tests">
<h1>Tutorial JSON (JavaScript Object Notation)</h1>
<div id="content" >
</div>
</section>
<script type="text/javascript">
var objetos = {"Personas":[
{"nombre":Jose","edad":23},
{"nombre":Julian","edad":17}
]};
document.getElementById('content').innerHTML =
objetos.Personas[1].nombre ;
/*Declarar un objeto JSON con una funcion en un atributo
notese el uso de "this" que hace referencia a el objeto en s, es decir a
persona*/
var persona = {"name":Otra persona","edad":23,
"avisar":function(){alert("Hola soy
"+this.name);}
};
persona.avisar();
</script>
</body>
</html>
MailApp:
https://developers.google.com/apps-script/reference/mail/mailapp
Los mails se envan a nombre de quien hizo el script
Hay un lmite diario de envos de mails impuesto por Google
Mtodos:
getRemainingDailyQuota()
sendEmail(message)
sendEmail(recipient, subject, body)
sendEmail(recipient, subject, body, options)
sendEmail(to, replyTo, subject, body)
UiApp
Crea interfaces de usuario para su uso dentro de Google
Apps o como servicios independientes.
Mtodos
createApplication()
getActiveApplication()
getUserAgent()
Textbox
Label
Buttons
Check box
Radio buttons
Text Area
Texto
Button
function createAndSendDocument() {
//Crear un nuevo Documento de Nombre Hola Mundo de AppScript
var doc = DocumentApp.create('Hola Mundo de AppScript');
//Obtenemos el Body del Documento y agregamos un Parrafo
doc.getBody().appendParagraph('Este Documento fue creado a Partir de AppScript');
//URL del Documento Generado
var url = doc.getUrl();
//Obtenemos nuestro Correo Electronico
var email = Session.getActiveUser().getEmail();
//El asunto es el nombre del Documento
var subject = doc.getName();
//El cuerpo del correo max 20kb indica la URL de nuestro documento
var body = 'Link con tu Documento: ' + url;
//Enviamos el correo (:
GmailApp.sendEmail(email, subject, body);
}
function doGet() {
var app = UiApp.createApplication().setTitle('Change Box');
var horizontalPanel = app.createHorizontalPanel().setId('horizontalPanel');
app.add(horizontalPanel);
horizontalPanel.add(app.createTextBox().setId('textBox1')
.setName('textBox1').setWidth('25px')
.addKeyUpHandler(app.createServerKeyHandler('changeBox')
.addCallbackElement(horizontalPanel)));
horizontalPanel.add(app.createLabel(' + '));
horizontalPanel.add(app.createTextBox().setId('textBox2')
.setName('textBox2').setWidth('25px')
.addKeyUpHandler(app.createServerKeyHandler('changeBox')
.addCallbackElement(horizontalPanel)));
horizontalPanel.add(app.createLabel(' = '));
horizontalPanel.add(app.createTextBox().setId('textBox3')
.setName('textBox3').setWidth('25px'));
return app;
}
function changeBox(e){
var app = UiApp.createApplication();
if(e.parameter.textBox1 !='' && e.parameter.textBox2 !=''){
// && e.parameter.keyCode == 13
var tb3 = parseInt(e.parameter.textBox1) + parseInt(e.parameter.textBox2);
app.getElementById('textBox3').setValue(tb3.toString());
}
return app;
}
function htmlServiceTest() {
// obtenemos la instancia de la app Documents
var ui = DocumentApp.getUi();
// cargamos el template de nombre 'sideBar' y
aadimos detalles
var html =
HtmlService.createTemplateFromFile('sideBar').eva
luate()
.setTitle('Sidebar Example').setWidth(300)
.setSandboxMode(HtmlService.SandboxMode.NATIVE);
// presentamos el archivo
ui.showSidebar(html);
}
Crear un panel:
var panel = app.createVerticalPanel();
Aadir widgets:
var textBox = app.createTextBox();
textBox.setName('myTextBox').setId('myTextBox');
var button = app.createButton('Submit');
Aadir al panel:
panel.add(textBox);
panel.add(button);
Ensamblar
app.add(panel);
var doc = SpreadsheetApp.getActive();
doc.show(app); // mostrar la app
Cerrar la aplicacin
return app.close();
A probar!!!
function doGet(){
// Leer la data de un spreadsheet
var SS = SpreadsheetApp.openById('SpreadsheetID');
var sheet = SS.getSheets()[0];
var data = sheet.getRange('A1:G7').getValues();
// construir tabla
var dataTable = Charts.newDataTable();
//Aadir tipos de dolumnas
dataTable.addColumn(Charts.ColumnType.STRING,
data[0][0]);
for(var i=1; i<data[0].length-1; i++){
dataTable.addColumn(Charts.ColumnType.NUMBER,
data[0][i]);
}
// Aadir filas
for(var j=1; j<data.length; j++){
dataTable.addRow(data[j]);
}
// Crear y construir grfico
var chart = Charts.newPieChart()
.setDataTable(dataTable)
.setTitle("Sales by store")
.build();
//Crear aplicacin y aadir el grfico
var app =
UiApp.createApplication().setTitle("Grfico");
app.add(chart)
return app;
}
function doGet(e) {
var app = UiApp.createApplication().setTitle("Upload archivo");
var form =
app.createFormPanel().setId('frm').setEncoding('multipart/form-data');
var formContent = app.createVerticalPanel();
form.add(formContent);
formContent.add(app.createFileUpload().setName('thefile'));
formContent.add(app.createSubmitButton('Submit'));
app.add(form);
return app;
}
function doPost(e) {
// Objeto blob del input file
var fileBlob = e.parameter.thefile;
var doc = DocsList.createFile(fileBlob);
var app = UiApp.getActiveApplication();
var label = app.createLabel('Archivo cargado');
app.add(label);
return app;
}
function geocode_Addresses() {
var sheet =
SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet4");
var locationInfo = sheet.getRange("A2").getValues();
var geoResults, lat, lng;
for (var i = 0; i < locationInfo.length; i++) {
geoResults = Maps.newGeocoder().geocode(locationInfo[i]);
// obtener latitud and longitud
lat = geoResults.results[0].geometry.location.lat;
lng = geoResults.results[0].geometry.location.lng;
sheet.getRange(i+1, 2, 1, 1).setValue(lat + "," + lng);
Utilities.sleep(1000);
// aade un delay para prevenir
restriccin de google: Service Invoked Too Many Times
}
}
Paso 1
Paso 2
Paso 3
Paso 3
Paso 4
Paso 5
Paso 6
function onFormSubmit(e) {
var
var
var
var
tiempoRegistro = e.values[0];
nombre = e.values[1];
apellido = e.values[2];
correo = e.values[4];
var docId =
DocsList.getFileById(DOCUMENT_ID).makeCopy().getId();
var doc = DocumentApp.openById(docId);
doc.setName("Exito al Registrarte "+nombre);
var body = doc.getActiveSection();
body.replaceText("%nombre%", nombre);
body.replaceText("%apellido%", apellido);
doc.saveAndClose();
//Una pausa para el servidor, de no ser as se
satura y manda error
Utilities.sleep(3000);
GmailApp.sendEmail(correo, "Hola! "+nombre+" y
Gracias por Registrarte", "Los datos del evento
estan aqui:" +doc.getUrl());
Paso 7
var ahora;
var tolerancia= 5; // tiempo en minutos
function enviarEmail() {
ahora = new Date();
var doc = SpreadsheetApp.getActiveSpreadsheet();
var sheetParam = doc.getSheetByName("Form Responses
1");
var params = sheetParam.getRange(2, 1,
sheetParam.getLastRow()-1, 5);
var data = params.getValues();
for (i in data){
var row = data[i];
if (isHoraEnvio(row[0])){
MailApp.sendEmail(row[4],"Helooo!!", row[1]+" "+row[2]+" ...wrote");
}
}
}
function isHoraEnvio(date){
var desde = new Date(ahora);
var hasta = new Date(ahora);
desde.setMinutes(ahora.getMinutes() - tolerancia);
hasta.setMinutes(ahora.getMinutes() + tolerancia);
return date>desde && date<hasta;
function isHoraEnvio(date){
var desde = new Date(ahora);
var hasta = new Date(ahora);
desde.setMinutes(ahora.getMinutes() - tolerancia);
hasta.setMinutes(ahora.getMinutes() + tolerancia);
}
function introduccion() {
// solicitar informacin al usuario
var searchTerm = Browser.inputBox(Introduzca un valor:");
}
function fetchInstagram() {
var TAG_NAME = 'follome';
var CLIENT_ID = 'a104222e6d2447c68c4b5ec378bfb7b6';
var url =
'https://api.instagram.com/v1/tags/'+TAG_NAME+'/media/recent?client_id='+CLIENT_ID;
var count = 0;
while(url && count < 5){
count++;
var response = UrlFetchApp.fetch(url).getContentText();
var responseObj = JSON.parse(response);
var photoData = responseObj.data;
for(var i in photoData){
var imageUrl = photoData[i].images.standard_resolution.url;
fetchImageToDrive_(imageUrl);
}
url = responseObj.pagination.next_url;
}
function fetchImageToDrive_(imageUrl){
var imageBlob = UrlFetchApp.fetch(imageUrl).getBlob();
var image = DriveApp.createFile(imageBlob);
return image.getUrl();
}
Veamos un ejemplo
function addTableInDocument() {
// Cabeceras de la tabla Backgroud color, text bold, white
var headerStyle = {};
headerStyle[DocumentApp.Attribute.BACKGROUND_COLOR] = '#336600';
headerStyle[DocumentApp.Attribute.BOLD] = true;
headerStyle[DocumentApp.Attribute.FOREGROUND_COLOR] = '#FFFFFF';
// Estilo para filas noramles
var cellStyle = {};
cellStyle[DocumentApp.Attribute.BOLD] = false;
cellStyle[DocumentApp.Attribute.FOREGROUND_COLOR] = '#000000';
// configuracin de espaciados
var paraStyle = {};
paraStyle[DocumentApp.Attribute.SPACING_AFTER] = 0;
paraStyle[DocumentApp.Attribute.LINE_SPACING] = 1;
}
}
doc.saveAndClose();
function doGet() {
var app = UiApp.createApplication();
var panel= app.createVerticalPanel();
//Obtener contactos
var contacts = ContactsApp.getContacts();
//Creacin de grid para los datos
var grid = app.createGrid(contacts.length+1,4)
.setStyleAttribute('border', '1px solid black')
.setBorderWidth(1);
//Creacin de fila header
grid.setWidget(0, 0, app.createLabel('Nombre'))
.setWidget(0, 1, app.createLabel('Email'))
.setWidget(0, 2, app.createLabel('Tlf.'))
.setWidget(0, 3, app.createLabel('Direccion'));
Operadores de bsqueda
Operador
Definicin
Ejemplos
from:
from:ana
Significado: mensajes
enviados por Ana
to:
to:david
Significado: mensajes
que t u otros
usuarios habis
enviado a David
subject:
subject:cena
Significado: mensajes
cuyo asunto incluye la
palabra "cena"
Operadores de bsqueda
OR
(guin)
label:
has:attachment
list:
filename:
Ejemplo: filename:deberesfsica.txt
Sirve para buscar Significado: mensajes que llevan
un archivo
adjunto el archivo "deberesfsica.txt"
adjunto por su
Ejemplo: label:trabajo filename:pdf
nombre o por su Significado: mensajes con la etiqueta
tipo.
"trabajo" que llevan adjunto un archivo
en formato PDF
Ejemplo: list:[email protected]
Significado: mensajes enviados o
recibidos a travs de esta lista y que
incluyen [email protected] en sus
cabeceras
""
(comillas)
()
in:anywhere
in:inbox
in:trash
in:spam
cc:
bcc:
after:
before:
older:
newer:
Ejemplo: after:2004/04/16
before:2004/04/18
Sirven para buscar los mensajes
Significado: mensajes enviados
enviados en un intervalo de
entre el 16 y el 18 de abril de
tiempo definido entre "older" o
2004*
"after" (despus de) y "before" o
*Ms concretamente: los
"newer" (antes de),
mensajes enviados despus de
siempre con el formato de fecha
las 12:00 a.m. (o 00:00) del 16
aaaa/mm/dd.
de abril de 2004 y antes del 18
de abril de 2004.
Ejemplo: cc:david
Significado: los mensajes que
incluyen a David en el campo
"Cc"
older_than
newer_than
Permiten buscar
mensajes con respecto
a la fecha de hoy, a
saber: enviados hace
ms de ("older") o en
los ltimos ("newer") X
d, m o y (das, meses o
aos,
respectivamente).
+ (smbolo ms)
Ejemplo: +unicornio
Significado: los
Sirve para localizar
mensajes que
nicamente las
contienen la palabra
coincidencias exactas
unicornio (pero ni
con el trmino buscado
unicornios ni
unciornio)
Ejemplo:
newer_than:2d
Significado: encuentra
los mensajes enviados
en los dos ltimos das
size:
Ejemplo: size:1000000
Significado: todos los
mensajes de ms de 1 MB
(1.000.000 bytes)
larger:
smaller:
Ejemplo: larger:10M
Significado: todos los
mensajes de 10.000.000
bytes o ms de tamao
Bsqueda en mails:
Crear un Spreadsheet con:
Columnas: Fecha, Remitente, Mensaje, Enlace
Columna F3: nombre de alguna etiqueta
Columna F4: criterio de bsqueda
Bsqueda en mails:
Limpiar resultados previos
sheet.getRange(2, 1, sheet.getMaxRows() - 1, 4).clearContent();
Bsqueda en mails:
Recorrer listado de threads:
Browser.msgBox("threads encontrados: "+threads.length);
for (var i = 0; i < threads.length; i++) {
Obtener thread
var messages = threads[i].getMessages();
Buscar el criterio
if (msg.search(pattern) !== -1) {
Bsqueda en mails:
Si hay coincidencias:
Imprimir mensaje
sheet.getRange(row,3).setValue(messages[m].getSubject());
Pasar al siguiente
row++;
Bsqueda en mails:
Validar cierre de llaves
Probar script!!
Calendar
Representa un calendario perteneciente a un usuario o alguno al
que est suscrito
function doGet() {
var app = UiApp.createApplication().setTitle('Gestion de
eventos');
// panel para elementos
var panel = app.createVerticalPanel().setId('panel');
// objetos del formulario
var eventDateLabel = app.createLabel('Fecha de Evento:');
var evenDate = app.createDateBox().setId('eventDate');
var eventTitleLabel = app.createLabel('Titulo:');
var eventTitle =
app.createTextBox().setName('eventTitle').setId('eventTitle
');
var eventDeatilLabel = app.createLabel('Detalles:');
var eventDetail = app.createTextArea()
.setSize('200',
'100').setId('eventDetail').setName('eventDetail');
var btn = app.createButton('createEvents');
return app;
}
function createEvents(e){
var app = UiApp.getActiveApplication();
try{
// obtener entradas del evento
var eventDate = e.parameter.eventDate;
var eventTitle = e.parameter.eventTitle;
var eventDetails = e.parameter.eventDetail;
// obtener el calendario
var cal = CalendarApp.getCalendarsByName('Jose Julian
Ariza')[0];
var eventStartTime = eventDate;
//la fecha fin se aade sumando una hora
var eventEndTime = new
Date(eventDate.valueOf()+60*60*1000);
//Create the events
cal.createEvent(eventTitle, eventStartTime,eventEndTime
,{description:eventDetails});
<div>
<form id="email_subscribe">
<input type="email" name="email" id="email" placeholder="Enter your
email">
<input type="submit" value="Subscribe">
</form>
<span id="thank_you" hidden="true">Thank you!</span>
</div>
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js">
</script>
<script>
$( document ).ready(function() {
$( "#email_subscribe" ).submit(function() {
$( "#thank_you" ).show();
});
});
</script>
function geocode_Addresses() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var locationInfo = sheet.getRange(1, 1, sheet.getLastRow(), 1).getValues();
var geoResults, lat, lng;