Esta entrada trata de cómo conectar la API de Strava con Google Sheets y crear una visualización en Google Data Studio.

Strava es una aplicación increíblemente buena para que los atletas hagan un seguimiento de sus entrenamientos. Lo uso para rastrear mi carrera, ciclismo y senderismo, y mirar los datos a lo largo del tiempo.
Todo este proyecto nació de una frustración con la aplicación Strava.
Aunque es genial para recoger datos, tiene algunas limitaciones en la forma en que me muestra esos datos. El registro de entrenamiento muestra todas mis carreras y paseos en bicicleta, pero nada más. Sin embargo, también hago muchas caminatas (especialmente cuando me estoy cuidando de una lesión por correr) y para mí, todo es lo mismo. Quiero ver todas mis actividades en el mismo registro de entrenamiento.
Por eso he creado este panel de actividades en Google Data Studio. Muestra todas mis actividades, independientemente del tipo, en una sola vista.
Conectando el API de Strava con Google Sheets
Para conectarse a la API de Strava con Google Sheets, sigue estos pasos:
Configura tu Google Sheet
- Abre una nueva hoja de Google (pro-tip: escribe sheet.new en la ventana de tu navegador!)
- Escriba una fila de encabezamiento en su Google Sheet: «ID», «Nombre», «Tipo», «Distancia (m)» en las celdas A1, B1, C1 y D1 respectivamente
- Abrir el Editor de Guiones (Herramientas > Editor de Guiones)
- Dale un nombre al proyecto de guión, por ejemplo, Integración de Hojas de Estrava
- Crear un segundo archivo de guión (Archivo > Nuevo > Archivo de guión) y llamarlo oauth.gs
- Añade la librería OAuth 2.0 Apps Script a tu proyecto (Recursos > Bibliotecas…)
- Introduce este código de identificación en la casilla «Añadir una biblioteca»: 1B7FSrk5Zi6L1rSxxTDgDEUsPzlukDsi4KGuTMorsTQHhGBzBkMun4iDF
- Seleccione la versión más reciente de la biblioteca en el menú desplegable (versión 34 actualmente – septiembre de 2019) y pulse «Guardar».
Añade el código
Si eres nuevo en el API y en Apps Script, consulta mi Tutorial del API para principiantes con Google Sheets y Apps Script.
En tu archivo oauth.gs, añade este código:
En tu archivo oauth.gs, añade este código:
ar CLIENT_ID = ''; var CLIENT_SECRET = ''; // configure the service function getStravaService() { return OAuth2.createService('Strava') .setAuthorizationBaseUrl('https://www.strava.com/oauth/authorize') .setTokenUrl('https://www.strava.com/oauth/token') .setClientId(CLIENT_ID) .setClientSecret(CLIENT_SECRET) .setCallbackFunction('authCallback') .setPropertyStore(PropertiesService.getUserProperties()) .setScope('activity:read_all'); } // handle the callback function authCallback(request) { var stravaService = getStravaService(); var isAuthorized = stravaService.handleCallback(request); if (isAuthorized) { return HtmlService.createHtmlOutput('Success! You can close this tab.'); } else { return HtmlService.createHtmlOutput('Denied. You can close this tab'); } }
En tu archivo code.gs, añade este código:
// custom menu function onOpen() { var ui = SpreadsheetApp.getUi(); ui.createMenu('Strava App') .addItem('Get data', 'getStravaActivityData') .addToUi(); } // Get athlete activity data function getStravaActivityData() { // get the sheet var ss = SpreadsheetApp.getActiveSpreadsheet(); var sheet = ss.getSheetByName('Sheet1'); // call the Strava API to retrieve data var data = callStravaAPI(); // empty array to hold activity data var stravaData = []; // loop over activity data and add to stravaData array for Sheet data.forEach(function(activity) { var arr = []; arr.push( activity.id, activity.name, activity.type, activity.distance ); stravaData.push(arr); }); // paste the values into the Sheet sheet.getRange(sheet.getLastRow() + 1, 1, stravaData.length, stravaData[0].length).setValues(stravaData); } // call the Strava API function callStravaAPI() { // set up the service var service = getStravaService(); if (service.hasAccess()) { Logger.log('App has access.'); var endpoint = 'https://www.strava.com/api/v3/athlete/activities'; var params = '?after=1546300800&per_page=200'; var headers = { Authorization: 'Bearer ' + service.getAccessToken() }; var options = { headers: headers, method : 'GET', muteHttpExceptions: true }; var response = JSON.parse(UrlFetchApp.fetch(endpoint + params, options)); return response; } else { Logger.log("App has no access yet."); // open this url to gain authorization from github var authorizationUrl = service.getAuthorizationUrl(); Logger.log("Open the following URL and re-run the script: %s", authorizationUrl); } }
Nota sobre la variable de los parámetros
Echa un vistazo a la variable de los parámetros:
var params = '?after=1546300800&per_page=200'
El parámetro » after» significa que mi código sólo devolverá las actividades de Strava después de la fecha que yo dé. El formato de la fecha es tiempo de época y la fecha que he usado aquí es el 1/1/2019, es decir, sólo devuelvo las actividades de este año.
La otra parte de la variable params es la variable ‘per_page’, que he establecido en 200. Este es el número máximo de registros que la API devolverá en un lote.
Para obtener más de 200, hay que añadir el parámetro ‘page’ y establecerlo en 2,3,4 etc. para obtener las actividades restantes, por ejemplo.
var params = '?after=1546300800&per_page=200&page=2'
Eventualmente querrás hacerlo de forma programada con un bucle while (sigue haciendo un bucle mientras la API devuelve datos y para cuando vuelve con las manos vacías).
Nota sobre el análisis sintáctico de los datos
La secuencia de comandos anterior analiza la respuesta de la API y agrega 4 valores a la matriz que va a Google Sheet, a saber: ID, nombre, tipo y distancia.
Sin embargo, puedes añadir fácilmente más campos.
Mira la documentación de Strava para ver qué campos se devuelven y selecciona los que quieras. Por ejemplo, añades la ganancia total de elevación así:
activity.total_elevation_gain
Si añades campos adicionales a la matriz, no olvides cambiar el tamaño del intervalo en el que estás pegando los datos en tu Google Sheet.
Las dimensiones de la matriz y del rango deben coincidir.
Configure su aplicación Strava API
Necesitas crear tu aplicación en la plataforma Strava, para que tu Google Sheet pueda conectarse a ella.
Ingresa a Strava y ve a Configuración > Mi Aplicación API o escribe en https://www.strava.com/settings/api
Esto te llevará a la página de configuración de la aplicación API.
Dale un nombre a tu aplicación e introduce un sitio web y una descripción. Puedes poner lo que quieras aquí, ya que es sólo para mostrar.
La clave para desbloquear la API de Strava, que me costó mucho encontrar, es establecer el «Dominio de devolución de llamada de autorización» como
script.google.com
(Consejo para este artículo de Elif T. Kuş, que fue el único lugar donde encontré esto.)
Autoriza tu aplicación
Ejecuta la función onOpen desde el editor de scripts y autoriza los alcances que necesita la aplicación (servicio externo y aplicación de hoja de cálculo):

Si tu proceso no se ve así, y ves una señal de advertencia, entonces no te preocupes. Haz clic en la opción Avanzado y autorízalo en su lugar (consulta cómo hacerlo en esta Guía para principiantes de Google Apps Script).
Vuelve a tu Google Sheet y verás una nueva opción de menú personalizada «Strava App».
Haz clic en ella y selecciona el menú desplegable «Obtener datos».
No pasará nada en tu Google Sheet la primera vez que se ejecute.
Vuelve al editor de secuencias de comandos y abre los registros (Ver > Registros). Verás la URL de autorización que debes copiar y pegar en una nueva pestaña del navegador.
Esto te pedirá que autorices la aplicación Strava:
¡Boom! Ahora has autentificado tu solicitud.
Para otro ejemplo de OAuth, echa un vistazo a la integración de GitHub a Apps Script que muestra estos pasos para otra aplicación.
Recuperar los datos de Strava!
¡Ahora, la pièce de résistance!
Ejecuta la función «Obtener datos» de nuevo y esta vez, algo hermoso sucederá.
Filas y filas de datos de Strava aparecerán en tu Google Sheet!

El código se conecta al punto final del atleta/actividades para recuperar datos sobre todas sus actividades.
En su configuración actual, que se muestra en el GIF de arriba, el código analiza los datos devueltos por la API y pega 4 valores en su hoja de Google: ID, Nombre, Tipo y Distancia.
(La distancia se mide en metros.)
Por supuesto, puede extraer cualquiera o todos los campos devueltos por la API.
En el panel de control del estudio de datos he utilizado algunos de los datos de tiempo para determinar en qué día de la semana y en qué semana del año se produjo la actividad. También he mirado los campos que miden cuánto tiempo duró la actividad.
Configurar un disparador para llamar a la API automáticamente
Una vez que haya establecido la conexión básica anterior, probablemente querrá configurar un disparador para llamar a la API una vez al día para obtener datos frescos.
Querrás filtrar los datos antiguos para evitar terminar con entradas duplicadas. Puedes usar un bucle de filtrado para comparar los nuevos datos con los valores que tienes en tu hoja de cálculo y descartar los que ya tienes.
Creación de un panel en Google Data Studio
Google Data Studio es una herramienta increíble para crear cuadros de mando visualmente impresionantes.
Me motivó a construir mi propio registro de entrenamiento que mostraba todas mis actividades, sin importar el tipo.
Primero, creé algunos campos calculados en Apps Script para calcular el día de la semana y el número de la semana. Añadí estos cuatro campos a mi archivo code.gs:
(new Date(activity.start_date_local)).getDay(), // sunday - saturday: 0 - 6 parseInt(Utilities.formatDate(new Date(activity.start_date_local), SpreadsheetApp.getActiveSpreadsheet().getSpreadsheetTimeZone(), "w")), // week number (new Date(activity.start_date_local)).getMonth() + 1, // add 1 to make months 1 - 12 (new Date(activity.start_date_local)).getYear() // get year
Y convertí la distancia en metros en una distancia en millas con esta modificación en mi archivo Apps Script code.gs:
(activity.distance * 0.000621371).toFixed(2), // distance in miles
A partir de ahí, sólo tienes que crear un nuevo tablero en Data Studio y conectarlo a tu Google Sheet.
El gráfico de registro de actividad es un gráfico de burbujas con el día de la semana en el eje x y el número de la semana en el eje y, ambos configurados como promedio (por lo que cada uno aparece por separado). El tamaño de la burbuja es la Distancia y la dimensión se establece en el Nombre.

A continuación, añadí un filtro de año para poder ver cada año por separado (tengo datos hasta el 2014 en el conjunto de datos).
Para completar el tablero de mandos, añadí un logo de Strava y un tema naranja.

(Nota: También hay un conector de código abierto de la API de Strava para Data Studio, así que podrías usarlo para crear visualizaciones de Strava y no tener que escribir el código tú mismo).
Próximos pasos para la API de Strava con Google Sheets
Todo este proyecto fue concebido como una forma de explorar la API de Strava con Google Sheets. Estoy feliz de ponerlo a funcionar y compartirlo aquí.
Sin embargo, seré el primero en admitir que este proyecto es todavía un poco tosco.
Pero estoy emocionado de tener mis datos de Strava en un Google Sheet ahora. Hay muchas otras historias y tendencias interesantes que quiero explorar cuando tenga tiempo.
Definitivamente hay espacio para mejorar con el código de Apps Script. Además de los mencionados anteriormente, y con un poco más de tiempo, yo hornearía la conexión OAuth en la interfaz de la parte frontal de Google Sheet (usando una barra lateral), en lugar de necesitar tomar la URL de los registros en su editor de script.
Y el panel de control de Data Studio fue creado apresuradamente para resolver el problema de no ver todos los datos de mi actividad en un solo lugar. Una vez más, hay mucho más trabajo que podría hacer aquí para mejorarlo.
