Importar datos de una hoja de cálculo de Google Drive a otra con IMPORTRANGE()

En los últimos tiempos casi todos los artículos técnicos están siendo de ofimática y, más en concreto, de Google Drive. Y esta nueva entrega sigue por ahí: ¿podemos importar datos de una hoja de cálculo a otra en Google Drive? Pues sí, podemos.

La función IMPORTRANGE() se encarga de ello, recibiendo dos parámetros (dos cadenas de texto, por tanto se les envían siempre entre comillas dobles): el primer parámetro será la URL de la hoja de cálculo donde está el origen de los datos, el segundo será una cadena donde especificamos la hoja y el rango de celdas a recoger. La sintaxis es tal que así:

=IMPORTRANGE("UrlDeLaHojaDeCálculo";"NombreDeLaHoja!CeldaInicio:CeldaFin")

Os voy a dejar un ejemplo más o menos real. Tengo una hoja de cálculo donde voy guardando los discos que añadiré a la próxima revisión de los 1100 discos esenciales (cuando crezca hasta 1250, dentro de unos meses). Ahora voy a importar de esa tabla las dos primeras columnas de las 20 primeras filas. Lo haría así:

=IMPORTRANGE("https://docs.google.com/spreadsheets/d/1QqGx-f4jC3ZHi1jkSa9eY9_vY-OiClXJ1nKTDwleVpfh3I/";"Hoja 1!A1:B20")

Otro dato importante: por seguridad la primera vez que importemos los datos se nos solicitará conceder permisos explícitamente sobre la hoja de origen. Una vez concedidos, la hoja de cálculo de destino podrá extraer datos de cualquier parte de la hoja de origen hasta que el permiso se revoque también de forma explícita.

Anuncios

La función SPARKLINE() en la hoja de cálculo de Google Drive: insertar gráficas en una celda

Si bien la hoja de cálculo de Google Drive, al igual que Excel o que LibreOffice Calc, nos aporta una serie de cómodas herramientas para la creación de gráficos también disponemos de una función que nos permite crear un gráfico dentro de una celda. Dicha fución se llama SPARKLINE().

Ejemplo con los cuatro tipos de gráficos disponibles.

Esta función recibe como primer parámetro el rango de celdas del que queremos recoger los valores. Opcionalmente puede recibir un array de valores como parámetros opcionales. Estas opciones serían pares de valores, irían encerradas entre llaves, separadas del rango por un punto y coma. La separación entre pares se marcaría con un punto y coma, y dentro de cada par con el carácter de la barra \. Debajo te dejo un ejemplo porque explicado así es un lío:

=SPARKLINE(C1:C25,{"charttype"\"bar";"max"\50;"empty"\"zero"})

El parámetro “charttype” indicaría el tipo de gráfico y puede tener los siguientes valores:

  • line: es el valor por defecto, el que tomasi no se especifica ninguno, genera un gráfico de líneas.
  • bar: genera un gráfico de barras apiladas.
  • column: genera un gráfico de columnas
  • winloss: es un gráfico de barras pero que solo representa si el valor es positivo o negativo.

En la imagen de arriba podéis ver cómo se visualizarían los cuatro. Para cada tipo de gráficos tienes después una serie de opciones, que puedes consultar en la documentación oficial de Google.

Crear tablas dinámicas (pivot tables) en la hoja de cálculo de Google Drive

Las tablas dinámicas en un software de hojas de cálculo nos permiten ver relaciones entre datos o delimitar grandes conjuntos de datos. Vamos a ver un ejemplo: yo en mi Google Drive tengo una tabla donde guardo los datos de la lista de discos del artículo de Mis 1001 discos indispensables, donde añado algunos datos extra que son los que utilizo para elaborar las gráficas. Voy a generar una tabla dinámica muy simple, que me va a sacar cuántos discos de cada década hay por cada país.

Veamos los pasos a seguir:

Datos de origen
  • Primero seleccionamos las celdas con los datos de origen. Lo recomendable es poner un encabezado a las columnas para trabajar de forma más clara.
  • En el menú superior hacemos click en Datos -> Tabla dinámica.
  • En el panel derecho (el de la imagen) hacemos click en Añadir junto a Filas seleccionamos el valor que queramos tener, repetimos la opreación con Columnas.
  • En el panel lateral hacemos click en Añadir junto a Valores y escogemos el valor que queremos ver en las columnas, junto a las opciones sobre como queremos que se traten dichos datos.
Resultado final

En cualquier momento puedes desplegar el menú de la derecha para agregar o quitar campos y valores. Para ver los detalles de una celda basta también con hacer doble click sobre ella, esto abrirá una visualización detalla de los valores que contiene.

Escribir un fichero Excel desde Python

Hace ya unos años, cuando hablábamos mucho de PHP por aquí (mi vida laboral me llevó a tener que centrarme en el SQL y el javascript principalmente) vimos cómo importar y exportar ficheros de Excel con PHP. Pero ¿cómo podemos escribir un fichero de Excel usando Python?

Hay muchas librerías para realizar esta tarea, yo en mi caso he elegido XslxWriter, que podéis descargar desde este enlace. También es muy popular xlrd/xlwt, aunque creo que solo permite exportar en formato xls, pero tiene la parte positiva de permitir importar datos.

Veamos entonces paso a paso, con ejemplos de código, cómo escribir un fichero simple xlsx con Python. Los primeros pasos en nuestro código serán importar la librería, crear un nuevo libro de trabajo y crear una nueva hoja. Lo haríamos así:

import xlsxwriter

libro = xlsxwriter.Workbook('Presupuesto1.xlsx')
hoja = libro.add_worksheet()

El constructor Workbook() nos permite crear un nuevo objeto que representaría un libro de Excel. Es importante destacar que XlsxWriter no nos permite modificar ni leer ficheros de Excel, solo podemos crearlos.

La función add_worksheet() del objeto Workbook nos permite crear nuevas hojas en nuestro libro. Si invocamos esta función sin parámetros creará las hojas con un nombre numerado de forma consecutiva (Sheet1, Sheet2, Sheet3…) pero si le pasamos una cadena esta será el nombre de la hoja.

Ahora, para continuar con el ejemplo, vamos a escribir los datos que queremos mostrar en nuestra hoja de cálculo.

# El presupuesto que pintaremos en la hoja de cálculo
presupuesto = (
    ['Equipos',     4000],
    ['Cable',        100],
    ['Armario',      200],
    ['Switch',        99],
    ['AP',            50],
    ['Router',       150],
    ['Mano de Obra', 350],
)

Ok, tenemos los datos a pintar. Tenemos la librería importada y los objetos creados. ¿Qué nos queda? Unos simples pasos: primero nos posicionamos al inicio del documento, después iteramos sobre la colección de datos pintando cada columna con el método write(), que recibirá la fila, la columna y el valor. Finalmente añadiremos una fila con los totales, calculados ya con una fórmula de sumatorio, y cerraremos el objeto Workbook().

# Nos posicionamos en la primera columna de la primera fila
row = 0
col = 0

# Iteramos los datos para ir pintando fila a fila
for concepto, precio in (presupuesto):
    hoja.write(row, col,     concepto)
    hoja.write(row, col + 1, precio)
    row += 1

#Pintamos la fila de totales
hoja.write(row, 0, 'Total:')
hoja.write(row, 1, '=SUM(B1:B7)')

#Cerramos el libro
libro.close()


Exportar estadísticas a Excel desde Basketball Reference

La web Basketball Reference ofrece una buena cantidad de estadísticas relativas a la NBA, tanto a nivel de jugador como de equipos. Incluye estadísticas clásicas, avanzadas, de tiro o de uso. Incluso podemos ver las estadísticas clásicas de un jugador partido a partido y además el sistema dispone de un comparador de jugadores o de un buscador para estadísticas concretas seleccionando los parámetros que queremos pasarle (tipo “Jugadores que han hecho una temporada promediando más de 25 puntos, 10 rebotes y un 40% en triples“). Aquí os dejo unos ejemplos:

Olajuwon estadística

Estadísticas tiro Durant

Carter partidos 2001

Pero si sois tan freaks que no os basta con eso (yo me declaro culpable) desde esta web podéis exportar los datos para trabajar con ellos en una hoja de cálculo de Excel o de LibreOffice Calc. Tenéis dos opciones: exportar directamente como libro de Excel, que en principio es experimental pero a mi no me ha dado problema sacando a Word 2010  o a Word 2007, o convertir en CSV consiguiendo así un formato exportable a diversas aplicaciones.

Bird en CSV

Para exportar basta con que os situéis con el ratón sobre el desplegable que pone Share & more y desde ahí seleccionáis una de las dos opciones que están marcadas en la captura de abajo: Get as Excel Workbook, para que os lo saque como un excel, o Get Table as CSV (For Excel):

Exportar

PHPExcel: Exportar e importar archivos ods, xls y xlsx

En PHP tenemos una clase que nos da utilidades para trabajar con hojas de cálculo, PHPExcel. Ya habíamos hablado antes sobre cómo trabajar con PHP y archivos CSV, pero con esta librería podemos trabajar directamente con archivos de hoja de cálculo. Nos permite generar documentos xls, xlsx, ods, pdf… formatear las celdas, aplicar fórmulas, validar datos… e importar hojas de cálculo.

Si descargáis el proyecto desde GitHub os econtraréis con un montón de ejemplos sobre cómo llevar a cabo distintas acciones, aquí vamos a recoger sólo uno, el más básico de creación de un archivo, traduciendo al castellano los comentarios:

error_reporting(E_ALL);
ini_set('display_errors', TRUE);
ini_set('display_startup_errors', TRUE);
date_default_timezone_set('Europe/London');

define('EOL',(PHP_SAPI == 'cli') ? PHP_EOL : '<br />');

/** Cargamos la librería PHPExcel */
require_once '../Build/PHPExcel.phar';


// Creamos un objeto PHPExcel
echo date('H:i:s') , " Create new PHPExcel object" , EOL;
$objPHPExcel = new PHPExcel();

// Definimos las propiedades del documento
echo date('H:i:s') , " Set document properties" , EOL;
$objPHPExcel->getProperties()->setCreator("Creador")
->setLastModifiedBy("Creador")
->setTitle("PHPExcel Test Document")
->setSubject("PHPExcel Test Document")
->setDescription("Documento de Excel creado por clases PHP.")
->setKeywords("office PHPExcel php")
->setCategory("Resultado de la prueba");


// Añadimos datos
echo date('H:i:s') , " Add some data" , EOL;
$objPHPExcel->setActiveSheetIndex(0)
->setCellValue('A1', 'Hello')
->setCellValue('B2', 'world!')
->setCellValue('C1', 'Hello')
->setCellValue('D2', 'world!');

// Comprobamos que la codificación UTF-8 vaya bien
$objPHPExcel->setActiveSheetIndex(0)
->setCellValue('A4', 'Miscellaneous glyphs')
->setCellValue('A5', 'éàèùâêîôûëïüÿäöüç');

// Renombrar la hoja de trabajo
echo date('H:i:s') , " Rename worksheet" , EOL;
$objPHPExcel->getActiveSheet()->setTitle('Simple');


// Definimos la hoja de cálculo activa
$objPHPExcel->setActiveSheetIndex(0);


// Escribimos el resultado en una hoja de Excel 2007 (xlsx)
echo date('H:i:s') , " Write to Excel2007 format" , EOL;
$callStartTime = microtime(true);

$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
$objWriter->save(str_replace('.php', '.xlsx', __FILE__));
$callEndTime = microtime(true);
$callTime = $callEndTime - $callStartTime;

echo date('H:i:s') , " File written to " , str_replace('.php', '.xlsx', pathinfo(__FILE__, PATHINFO_BASENAME)) , EOL;
echo 'Call time to write Workbook was ' , sprintf('%.4f',$callTime) , " seconds" , EOL;

// Ahora salvamos los datos en Excel clásico
echo date('H:i:s') , " Write to Excel5 format" , EOL;
$callStartTime = microtime(true);

$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
$objWriter->save(str_replace('.php', '.xls', __FILE__));
$callEndTime = microtime(true);
$callTime = $callEndTime - $callStartTime;

echo date('H:i:s') , " File written to " , str_replace('.php', '.xls', pathinfo(__FILE__, PATHINFO_BASENAME)) , EOL;
echo 'Call time to write Workbook was ' , sprintf('%.4f',$callTime) , " seconds" , EOL;

// Imprimimos en pantalla que se ha finalizado el trabajo.
echo date('H:i:s') , " Done writing files" , EOL;
echo 'Files have been created in ' , getcwd() , EOL;

Como ya he dicho antes, la documentación incluye un montón de ejemplos, casi 40, así que podréis sacar de ahí mucha ayuda. Con esta librería podrás complacer a los clientes que exigen sacar los resultados de las consultas directamente a hojas de cálculo, por ejemplo.