Subir Archivos a Gdrive (Google Drive) a Través de Telegram con Google Apps Scripts

Subir Archivos a Gdrive (Google Drive) a Través de Telegram con Google Apps Scripts
Subir Archivos a Gdrive (Google Drive) a Través de Telegram con Google Apps Scripts

Aquí nos encontramos de nuevo con vosotros para seguir con nuestro ritmo normal y traeros un nuevo snippet que esperamos como siempre que os sea de gran utilidad (parezco un youtuber poniendo prácticamente la misma frase al inicio de cada artículo a modo de saludo). En el capítulo de hoy de SnippetsBoard, toca meter un automatismo nuevo. Vamos a ver una nueva forma de que podáis gestionar archivos en Google Drive, y lo vamos a compartir en dos versiones la full y la recortada. La versión full en concreto, la implementamos en su momento en una empresa como forma a coste 0 de gestionar las facturas y albaranes que los trabajadores de la empresa iban dejando a los clientes.

Bueno, una vez hecha la introducción comentaros que en este snippet vamos a conectar Telegram con Google Drive y Google Spreadsheets. La idea es que enviando archivos a un bot de telegram, estos archivos se suban a google drive, quedando de esta forma bien almacenados en Google Drive a la vez que registraremos la url con la que podemos acceder a ellos de forma directa en una Hoja de Cálculo de Google.

Una vez explicado esto, como siempre, os referimos a las lecturas recomendadas antes de poneros manos a la obra, para que no tengáis problemas a la hora de poner esto en funcionamiento:

Introducción al manejo de google apps script.

Registrar Conversaciones de Telegram en una Hoja de Cálculo de Google con Apps Script.

Envío de Mensajes Automáticos a Telegram Mediante Google Apps Script

Introducción al manejo de google apps script parte 2.

Snippet en versión recortada

var bottoken = '34475478:GJyyKHkhhHK--TOKEN-INVENTADO--EWDSHkbb';

var spreadsheeturl = 'https://docs.google.com/spreadsheets/d/estotambienesinventado-3467/edit#gid=0';
var sheetname = 'files';
var columnafiles = 'C';

var drivefoldername = 'pruebatelefileupload';

var webappurl = 'https://script.google.com/macros/s/appurlquemeheinventadoyo/exec';


var telegramurl = "https://api.telegram.org/bot" + bottoken;
var telegramdownloadurl = "https://api.telegram.org/file/bot" + bottoken;

var columnas = {'A': 0,
                'B': 1,
                'C': 2,
                'D': 3,
                'E': 4,
                'F': 5,
                'G': 6,
                'H': 7,
                'I': 8,
                'J': 9,
                'K': 10,
                'L': 11,
                'M': 12,
                'N': 13,
                'O': 14,
                'P': 15,
                'Q': 16,
                'R': 17,
                'S': 18,
                'T': 19,
                'U': 20,
                'V': 21,
                'W': 22,
                'X': 23,
                'Y': 24,
                'Z': 25,
                'a': 0,
                'b': 1,
                'c': 2,
                'd': 3,
                'e': 4,
                'f': 5,
                'g': 6,
                'h': 7,
                'i': 8,
                'j': 9,
                'k': 10,
                'l': 11,
                'm': 12,
                'n': 13,
                'o': 14,
                'p': 15,
                'q': 16,
                'r': 17,
                's': 18,
                't': 19,
                'u': 20,
                'v': 21,
                'w': 22,
                'x': 23,
                'y': 24,
                'z': 25
               };



var ss = SpreadsheetApp.openByUrl(spreadsheeturl);
var sh = ss.getSheetByName(sheetname);
var shlastrow = sh.getLastRow();
var shlastcolumn = sh.getLastColumn();

var columnafilesnumber = columnas[columnafiles];

function setWebhook(){
  var url = telegramurl + "/setWebhook?url=" + webappurl;
  var response = UrlFetchApp.fetch(url);
  Logger.log(response.getContentText());
}


function doPost(e) {
  var data = JSON.stringify(e);
  
  var contents = e.postData.contents;
  var parsedcontents = JSON.parse(contents);
  
  if (parsedcontents.message.document){
    var archivoid = parsedcontents.message.document.file_id;
    var tipoarchivo = 'document';
  } else if (parsedcontents.message.photo){
    var archivoid = parsedcontents.message.photo[Number(parsedcontents.message.photo.length) - 1].file_id;
    var tipoarchivo = 'photo';
  }
  
  if (archivoid && tipoarchivo){
    var ladate = new Date();
    var filedata = JSON.parse(UrlFetchApp.fetch(telegramurl + '/getFile?file_id=' + archivoid));
    var filepath = filedata.result.file_path;
    
    var response = UrlFetchApp.fetch(telegramdownloadurl + '/' + filepath, {muteHttpExceptions: true, followRedirects: true});
    var fileblob = response.getBlob();
    
    var fileweno = DriveApp.createFile(fileblob);
    var folder = DriveApp.getFoldersByName(drivefoldername);
    if (folder.hasNext() === true){
      var folderwena = folder.next();
    } else {
      var folderwena = DriveApp.createFolder(drivefoldername);
    }
    
    Utilities.sleep(4000);
    
    var lacopia = fileweno.makeCopy(folderwena);
    
    var urldelacopia = lacopia.getUrl();
    
    fileweno.setTrashed(true);
    
    var therow = ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', ''];

    therow[columnafilesnumber] = urldelacopia;
    
    sh.appendRow(therow);
  }
}

Este primer snippet que os compartimos es la versión recortada, lo que hace básicamente es ir almacenando los archivos que vayáis subiendo a telegram en google drive a la vez que os dejará el enlace directo al mismo en la hoja de cálculo de turno. Los parámetros que tenéis que rellenar serán los siguientes:

  • bottoken: token del bot de telegram. En Envío de Mensajes Automáticos a Telegram Mediante Google Apps Script explicamos cómo se obtiene.
  • spreadsheeturl: url de la hoja de cálculo donde queremos que se anoten los enlaces a los archivos subidos en google drive.
  • sheetname: nombre de la hoja donde queremos que se anoten las url de los archivos subidos a Google Drive. 
  • columnafiles: letra de la columna en la que se van a anotar las url de los archivos subidos a google drive.
  • drivefoldername: nombre de la carpeta en la que deseamos que se guarden los archivos que nos envíen por telegram dentro de google drive.
  • webappurl: la url de la aplicación web que vamos a usar para recepcionar la información que nos envíe telegram. Encontraréis cómo generar esta aplicación web y obtener el enlace a poner aquí en la lectura recomendada Registrar Conversaciones de Telegram en una Hoja de Cálculo de Google con Apps Script.

Si queréis que esto se aplique a un grupo, lo único que debéis hacer es introducir el bot en un grupo y al igual que se explica en la lectura recomendada Registrar Conversaciones de Telegram en una Hoja de Cálculo de Google con Apps Script quitarle la privacidad para que pueda leer los mensajes que le lleguen de ese grupo.

Una vez que tengáis todo relleno, tenéis que ejecutar la función setWebhook para conectar la aplicación web que hemos creado con telegram, por si las moscas, actualizad la aplicación web a una nueva versión y listo.

Subir Archivos a Gdrive (Google Drive) a Través de Telegram con Google Apps Scripts: Enlaces en Hoja de Cálculo

Ahora vamos con la versión full. Comentar que esta versión solo tendrá sentido en el caso de que queráis conectar los archivos con información que ya tuvierais tabulada y que también hayáis pasado por telegram a través del bot, por lo que para concatenar varios como explicamos en la lectura recomendada el artículo que te he pasado a la vez que este donde se pone como crear varios proyectos a la vez y aplicarlos a la misma hoja de cálculo. Para explicar el funcionamiento, vamos a aplicarlo al ejemplo que hemos presentado al principio de este artículo. Imaginaos que tenéis una empresa con varios trabajadores, y los tenéis a todos en el mismo grupo de telegram, allí les compartís de manera automática los pedidos a través de un bot para que los vayan realizando. Estos trabajadores irán dejando facturas o albaranes en cada una de las visitas que realizan. Una vez que dejen los albaranes, si mandan una foto por telegram en respuesta al mensaje del pedido en cuestión que han realizado, esta foto se subirá automáticamente a Google Drive, y se anotará en la Hoja de Cálculo en la que tengáis registrados los pedidos al lado de su correspondiente pedido, por lo que diréctamente tendréis unidas las facturas con los pedidos. En resumen, un ahorro enorme de trabajo administrativo, de forma totalmente gratuita.

Snippet en versión completa

var bottoken = '34475478:GJyyKHkhhHK--TOKEN-INVENTADO--EWDSHkbb';

var spreadsheeturl = 'https://docs.google.com/spreadsheets/d/estotambienesinventado-3467/edit#gid=0';
var sheetname = 'messagesandfiles';
var columnamensajes = 'A';
var columnafiles = 'C';

var drivefoldername = 'pruebatelefileupload';


var webappurl = 'https://script.google.com/macros/s/appurlquemeheinventadoyo/exec';

var telegramurl = "https://api.telegram.org/bot" + bottoken;
var telegramdownloadurl = "https://api.telegram.org/file/bot" + bottoken;


var columnas = {'A': 0,
                'B': 1,
                'C': 2,
                'D': 3,
                'E': 4,
                'F': 5,
                'G': 6,
                'H': 7,
                'I': 8,
                'J': 9,
                'K': 10,
                'L': 11,
                'M': 12,
                'N': 13,
                'O': 14,
                'P': 15,
                'Q': 16,
                'R': 17,
                'S': 18,
                'T': 19,
                'U': 20,
                'V': 21,
                'W': 22,
                'X': 23,
                'Y': 24,
                'Z': 25,
                'a': 0,
                'b': 1,
                'c': 2,
                'd': 3,
                'e': 4,
                'f': 5,
                'g': 6,
                'h': 7,
                'i': 8,
                'j': 9,
                'k': 10,
                'l': 11,
                'm': 12,
                'n': 13,
                'o': 14,
                'p': 15,
                'q': 16,
                'r': 17,
                's': 18,
                't': 19,
                'u': 20,
                'v': 21,
                'w': 22,
                'x': 23,
                'y': 24,
                'z': 25
               };



var ss = SpreadsheetApp.openByUrl(spreadsheeturl);
var sh = ss.getSheetByName(sheetname);
var shlastrow = sh.getLastRow();
var shlastcolumn = sh.getLastColumn();
var shdatarange = sh.getRange(1, 1, shlastrow, shlastcolumn);
var shdata = shdatarange.getValues();

var columnamensajesnumber = columnas[columnamensajes];
var columnafilesnumber = columnas[columnafiles];


function setWebhook(){
  var url = telegramurl + "/setWebhook?url=" + webappurl;
  var response = UrlFetchApp.fetch(url);
  Logger.log(response.getContentText());
}


function doPost(e) {
  var data = JSON.stringify(e);

  var contents = e.postData.contents;
  var parsedcontents = JSON.parse(contents);
  var eltext = parsedcontents.message.reply_to_message.text;
  
  if (parsedcontents.message.document){
    var archivoid = parsedcontents.message.document.file_id;
    var tipoarchivo = 'document';
  } else if (parsedcontents.message.photo){
    var archivoid = parsedcontents.message.photo[Number(parsedcontents.message.photo.length) - 1].file_id;
    var tipoarchivo = 'photo';
  }
  
  if (archivoid && tipoarchivo){
    var ladate = new Date();
    var filedata = JSON.parse(UrlFetchApp.fetch(telegramurl + '/getFile?file_id=' + archivoid));
    var filepath = filedata.result.file_path;
    
    var response = UrlFetchApp.fetch(telegramdownloadurl + '/' + filepath, {muteHttpExceptions: true, followRedirects: true});
    var fileblob = response.getBlob();
    
    var fileweno = DriveApp.createFile(fileblob);
    var folder = DriveApp.getFoldersByName(drivefoldername);
    if (folder.hasNext() === true){
      var folderwena = folder.next();
    } else {
      var folderwena = DriveApp.createFolder(drivefoldername);
    }
    Utilities.sleep(4000);
    
    var lacopia = fileweno.makeCopy(folderwena);
    
    var urldelacopia = lacopia.getUrl();
    
    fileweno.setTrashed(true);
    
    for (var i in shdata){
      if (shdata[i][columnamensajesnumber] == eltext){
        sh.getRange(Number(i) + 1, columnafilesnumber + 1).setValue(urldelacopia);
      }
    }
    
  }
}

Los parámetros a cumplimentar son los mismos que en el caso anterior añadiendo solo este:

  • columnamensajes: letra de la columna en la que se encontrarán los mensajes que habéis enviado por telegram a los que hay que responder.

La forma de ponerlo en funcionamiento es la misma que en el caso anterior.

Una vez hecho esto, veréis cómo se asocian en la Hoja de Cálculo los documentos que subís a los mensajes a los cuales estáis respondiendo adjuntando los archivos.

Subir Archivos a Gdrive (Google Drive) a Través de Telegram con Google Apps Scripts

Ahora un poco a modo de ejemplo, os mostramos aquí una captura de una de las carpetas de nuestro Google Drive que hemos utilizado para subir imágenes a través de Telegram usando esta técnica.

Subir Archivos a Gdrive (Google Drive) a Través de Telegram con Google Apps Scripts: Muestra de Gdrive

Lo de las facturas mencionado en la parte superior es una mera idea. Ahora os toca a vosotros darle vueltas a la cabeza y sacarle usos realmente potenciales a esta idea.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Introducción a Google Apps Script Parte 2
A continuación:

Introducción a Google Apps Script Parte 2

Introducción a Google Apps Script Parte 2