Este script fue realizado a partir de una necesidad un tanto particular. La idea es tener un documento que funcione como plantilla para crear otros documentos. Todo esto, embebido en otra web.
En esta demo, están todos los elementos a la vista (el documento, el nombre nuevo, el link), pero en el uso habitual esto no es necesario ni recomendable. La idea es que sólo un administrador pueda ver el documento plantilla.
Otro tema a tener en cuenta es que en esta demo se pide el nombre del documento a generar. Esto obviamente puede automatizarse y generar el nombre del documento a partir de un criterio preestablecido.
El objetivo de este script es trabajar con GDocs. Es un script muy simple, que al presionar el botón del Gadget
se llama al script publicado como servicio que muestra la siguiente pantalla:
Y al presionar el botón Crear, nos muestra la siguente pantalla con el link de el nuevo documento.
Esto es lo que el usuario ve, pero en realidad tenemos una sola pantalla, con dos paneles (uno de cada pantalla que ve el usuario). Lo que pasa es que ocultamos la segunda hasta el momento en que se llama a la funciónque crea el documento. Todo esto se describe en el siguiente código:
//Funcion que se ejecuta como servicio.
function doGet(e){
try{
var app = UiApp.createApplication().setTitle('Crear documento');
// Creo todos los contenedores
// Contenedor principal
var mainPanel = app.createVerticalPanel().setId('mainPanel');
// Contenedor de los elementos de la primer pantalla
var fstPanel = app.createVerticalPanel().setId('fstPanel');
// Contenedor de los elementos de la segunda pantalla
var sndPanel = app.createVerticalPanel().setId('sndPanel').setVisible(false);
// Agrego ambos contenedores al panel principal.
mainPanel.add(fstPanel).add(sndPanel);
// Creo la pantalla para generar el nuevo documento
var grid = app.createGrid(1, 3);
// Creo el botón de la primer pantalla
var button = app.createButton('crear');
// Estas son los elementos que le agregan funcionalidad al botón
var submitHandler = app.createServerClickHandler('submit');
button.addClickHandler(submitHandler);
submitHandler.addCallbackElement(grid);
// Termino de agregar el resto de los elementos en la tabla
grid.setWidget(0, 0, app.createLabel('Nombre:'));
grid.setWidget(0, 1, app.createTextBox().setName('docName').setId('docName'));
grid.setWidget(0, 2, button);
// Ahora agrego el título y la tabla con todos los elementos
fstPanel.add(app.createLabel('Ingrese el nombre para crear un nuevo documento...'));
fstPanel.add(grid);
//Creo los elementos de la segunda pantalla, donde se mostrará la URL del documento creado.
// Notar que seteo el ID de los elementos para poder accederlos desde la funcion submit()
var grid2 = app.createGrid(1, 2);
grid2.setWidget(0, 0, app.createLabel('URL:').setId('url'));
grid2.setWidget(0, 1, app.createTextBox().setId('status'));
sndPanel.add(grid2);
sndPanel.add(app.createLabel('Copiar y pegar esta dirección en el navegador.'));
app.add(mainPanel);
return app;
}catch (e){
MailApp.sendEmail('tu-correo@gmail.com', 'error', e);
}
}
Una vez que el usuario ingresar el nombre del nuevo documento y presiona el botón, se va a ejecutar la función submit. En esta función tomamos el nombre del nuevo documento, creamos una copia de la plantilla, escribimos la url del nuevo documento en la segunda pantalla, ocultamos la primer pantalla y mostramos la segunda pantalla. Todo esto que resumí en las lineas anteriores, está plasmado en el siguiente código:
function submit(e) {
var app = UiApp.getActiveApplication();
var response = UrlFetchApp.fetch(crearDoc(e.parameter.docName));
app.getElementById('status').setText(crearDoc(e.parameter.docName)).setVisible(true);
app.getElementById('fstPanel').setVisible(false);
app.getElementById('sndPanel').setVisible(true);
return app;
}
Ahora bien, creo que ya notaste que te engañé, ya que en esa función no se crea el documento, sino que se llama a la función crearDoc, que es quien finalmente crea el documento. Esta función necesita como parámetro el nombre, ese nombre lo tomamos de la pantalla, que viene en la variable e (notar que la manera de acceder al parámetro de la pantalla es a través del id en el formato e.parameter.docName.
La función crearDoc(nombreDelDocumento) es la siguiente:
function crearDoc(nombre) {
//Crea un documento a partir de la copia de otro y devuelve el URL del nuevo documento.
var folder = DocsList.getFolder("GoogleScripts/Documentos Generados");
var file = DocsList.getFileById("1NkoRvZdGcEsrMxyZDH6jz-xeC8C5qkvVGNomPIA");
var newFile = DocsList.copy(file, nombre);
newFile.addToFolder(folder);
return newFile.getUrl();
}
Lo primero que hacemos es obtener la carpeta donde vamos a guardar el documento, en este caso lo guardamos en la carpeta Documentos Generados que está dentro de la carpeta GoogleScripts.
Luego obtenemos el archivo modelo (la plantilla) por el ID del documento (esto lo podemos obtener de la url: ?key=0Asc5B6RPrg-_dG...).
Una vez que obtenemos el archivo, debemos hacer una copia del mismo. Para ello, utilizamos el archivo obtenido y le pasamos el nombre que se le va a asignar a la copia.
Lo unico que nos falta es organizar el archivo, utilizamos addToFolder para enviar el archivo a la carpeta previamente creada.
Y finalmente devolvemos la url del archivo creado.