Como exportar a Excel (.xls) con Google Apps Script

Desgraciadamente, hay muchos usuarios que no usan Google Spreadsheets sino hojas de Excel ( XLS ). Estos usuarios te exigirán que los datos que les pases estén en formato XLS, no querrán un link a un google spreadsheet ni usar Google Apps Script y generalmente, no será fácil hacerles cambiar de opinión.

Para estas ocasiones nos puede resultar extremadamente útil poder exportar a formato XLS nuestras hojas de cálculo mediante Google Apps Script de una forma rápida y sencilla.

El código para poder realizar esta exportación se basa en el mismo principio que usamos para exportar PDF. Haremos una petición a un servicio de Google que nos permite exportar a diferentes formatos nuestras hojas de cálculo de Drive.

function Export()
{
     var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
     var exportUrl = 'https://docs.google.com/spreadsheets/d/' + spreadsheet.getId()
        + '/export?exportFormat=xlsx&format=xlsx';     // Para exportar a formato XLS
        //  + '/export?exportFormat=ods&format=ods';   // Para exportar a ODS
   
     //Hacemos la petición para pedir el fichero exportado
     var response = UrlFetchApp.fetch(exportUrl, {  muteHttpExceptions: true, headers: { Authorization: 'Bearer ' +  ScriptApp.getOAuthToken()  } } );
 
     //Creamos el fichero con el binario que nos devuelve la petición anterior
     var blob = response.getBlob();
     blob = blob.setName(spreadsheet.getName());
     var exportedFile = DriveApp.createFile(blob);
     SpreadsheetApp.getUi().alert(exportedFile.getUrl());
}

Como veréis tenéis el código para poder exportar a formato Excel(xls) y a formato OpenOffice (ods), con solo descomentar la linea que os interese tendréis suficiente.

La conversión puede tardar un rato, dado que el proceso interno de conversión puede ser bastante costoso, así que tranquilos si se demora un poco el proceso.

No vaciléis en hacerme llegar vuestras dudas

Nos vemos!

25 comentarios:

  1. Hola, muchas gracias me funciona el scrip pero en mi caso necesito que remplace el archivo creado anterior mente.

    ResponderEliminar
    Respuestas
    1. Hola, Lo mejor que puedes hacer es borrar el fichero que anteriormente se ha creado. Te dejo el link que te explica como borrar ficheros y carpetas con Google Apps Script: https://www.tutorialesgoogleappscripts.com/2020/11/como-borrar-ficheros-y-carpetas-con-google-apps-script.html

      Eliminar
  2. Muchísimas gracias lo intentare a ver como me va.

    ResponderEliminar
  3. Buena tarde existe alguna forma que el archivo pase a .xlsm y la macro quede funcionando en excel.

    ResponderEliminar
    Respuestas
    1. No. Las macros de Excel funcionan con un lenguaje diferente a los script de Google Apps Script. No es compatible, ni se parecen, así que no, lo que pides no es factible. Ahora bien, la gran pregunta es... realmente necesitas una macro en Excel teniendo Google Apps Script? :D

      Eliminar
  4. Buenos días! Hay alguna forma de exportar a excel pero solamente una hoja especifica? Intente agregandole la siguiente línea:

    + '&gid=' + sheet.getSheetId()

    Siendo la variable "sheet" un spreadsheet.getActiveSheet(). Pero sin embargo sigue exportandome el archivo entero

    ResponderEliminar
    Respuestas
    1. Creo que si te miras este artículo te puede guiar en lo que quieres: https://www.tutorialesgoogleappscripts.com/2020/10/como-generar-un-pdf-de-hojas-seleccionadas-con-google-apps-script.html Si no te aclaras dímelo y le doy otro ojo.

      Eliminar
  5. Hola, un amigo y yo hemos creado una google sheet, que además de fórmulas y macros granadas, hemos picado código manualmente para automatizar tareas y cálculos.
    Necesitaríamos enviar esas sheets a varios miembros de un grupo para que editen celdas (sólo datos) pero evitando que puedan ver el código.
    No somos programadores sino autodidactas y no hemos visto información al respecto/ejemplos en la red.
    Es posible hacerlo? Gracias

    ResponderEliminar
    Respuestas
    1. Fácil no es, pero algo se puede hacer. En este artículo hablaba sobre el tema: https://www.tutorialesgoogleappscripts.com/2020/09/como-ocultar-codigo-google-script.html Espero q os sirva! Nos vemos!

      Eliminar
  6. Hola,
    En mi caso, es al revés... Me encuentro que me llegan archivos de Excel y yo quiero trabajar con Sheets, por lo que necesitaría una automatización que me permitiera recoger los datos del Excel y importarlos a un Sheet.
    Cómo puedo "llamar/copiar" una celda de un Excel ?

    ResponderEliminar
    Respuestas
    1. Exportar el Excel a un csv u otro formato y entonces importarlo a Spreadsheets, lo veo factible, pero atacar directamente a Excel desde Google Apps Script, hasta donde yo se, es imposible. Tal vez alguien haya conseguido algo, pero vamos , yo a ese nivel no he llegado.

      Eliminar
  7. Hola, pregunta: es posible especificar la carpeta destino en mi propia computadora? No me doy cuenta en dónde se setea esa info.
    Desde ya muchas gracias

    ResponderEliminar
    Respuestas
    1. No. Hasta donde yo se no es posible.
      El motivo es sencillo, desde GAS ( lenguaje de servidor) no tenemos acceso al PC. El código se ejecuta en el servidor no en nuestra computadora.
      Sorry!

      Eliminar
  8. Buenisimo tu informacion como siempre asiduo lector, como haria mediante app script para en vez de exportar pueda importar de un archivo excel a una hoja del google.. tu ayuda amigo
    Muchas Gracias

    ResponderEliminar
  9. Hola, muchas gracias por tu articulo, era justo lo que estaba buscando. Consulta, existe alguna opcion de especificar la carpeta de Drive donde se debería guardar el xls? Veo que lo deja en la raíz pero todo mi proyecto está en otra carpeta y me gustaría trabajar todo junto. Muchas gracias nuevamente, un abrazo.

    ResponderEliminar
    Respuestas
    1. gracias de antemano al creador de la funcion excelente era lo que necesitaba en cuanto a guardar el archivo excel creado en la carpeta q quieras . le hice una pequeña modificacion-----------------------
      var destination_id = ''; // colocar el id de la carpeta donde quieres guardar el archivo
      var destination = DriveApp.getFolderById(destination_id);


      destination.createFile(blob);

      Eliminar
  10. Lo primero gracias por la información, me sirven de mucho tus posts. Yo necesitaría que esa misma exportación se hiciese de manera automática por ejemplo cada 5 minutos, o bien que se pudiese hacer cada vez que rellenan un formulario que acaba en una hoja de cálculo de Google Sheets. ¿es posible hacerlo? ¿podrías indicarme cómo hacerlo?. Gracias de antemano

    ResponderEliminar
    Respuestas
    1. Creo que lo que necesitas lo tienes aquí: https://www.tutorialesgoogleappscripts.com/2020/09/como-crear-triggers-con-google-apps-script.html

      Buena suerte

      Eliminar
  11. Hola! Excelente contenido! Una consulta.. un usuario creo un sheet y me dio permisos de edicion. Hice el script como explicaste, pero cuando descarga el archivo, solo muestra informacion de que debo iniciar sesion, en vez de mostrar los datos del sheet. Que debo modificar para que aparezca la info en vez de ese mensaje?

    ResponderEliminar
  12. Hola yo tengo una duda con unos colegas hemos creado en sheets una tabla que esta completamente creada a puro html y manda a llamar unos datos, lo que necesito es descargar esta tabla en formato excel pero no encuentro la manera que lo haga

    ResponderEliminar
    Respuestas
    1. A ver si te entiendo, quieres descargar una tabla html en formato excel?

      Eliminar
    2. Dudo que pueda hacerse facilmente. La unica forma que conozco seria pasarlo todo a un google sheet y entonces aplicar el script de este tutorial.
      Pasar una tabla html a un excel así sin más, me parece un proyecto demasiado grande ni tan siquiera para plantearselo ( tal vez haya algo hecho pero me extrañaria )
      Siento no ser de más ayuda
      Suerte!

      Eliminar
  13. Hola a todos, me parece muy interesante y útil el artículo, sin embargo tengo una inquietud inversa.
    Tengo un excel de poco mas de 5000 registros y 30 columnas. Deseo llevar todos estos datos a mi google sheets de manera diaria. No sobreescribir el archivo sino llevar todos los datos .
    He visto algunos ejemplo que funcionan muy bien y que envían registro por registro, pero cuando son pocos los registros y columnas; sin embargo cuando ya son mas de 500 registros es lógico sea un proceso lento porque debe acceder al google drive tantas veces como registros existan.
    Se les ocurre alguna mejor idea de poder llevar todos los registros de excel a google sheets?

    A mi se me ocurre llevar en bloques o paquetes o Arrays. De esa manera podría llevar quizás 50 ó 100 o tal vez mas registros en una sola variable, lo que reduciría significativamente el acceso a google drive.
    Mi duda o problema es que no se como recibir ese parámetro en apps scripts, en vba excel se puede asignar rango de datos a una variable arrays, pero no se como recibirla en scripts.

    Por favor necesito de sus consejos, ayuda o asesoria de ser necesario.

    ResponderEliminar
    Respuestas
    1. Hola... no tengo muy claro como hacerlo pero yo lo intentaria mediante una web. Que el script sea una web que reciba una parametro y que ese parametro sea un json o algo parecido que te permita ponerle la info... No se, con muchos registros te dará problemas siempre en algún punto escojas la solución que escojas.
      Ya contarás como ha ido . has despertado mi curiosidad. :)

      Eliminar

Tal vez te interese