Enviar mensajes a grupos de Telegram desde GoogleSheet
Tags: google, telegram, javascript
Published: 2021-02-27 22:07:17

---
title: Enviar mensajes a grupos de Telegram desde GoogleSheet
published: true
date: 2021-01-18 00:00:00 UTC
tags: Google, Telegram, JavaScript
canonical_url: https://jorge.aguilera.soy/blog/2021/googlesheet-telegram.html
---

Enviar mensajes a un grupo de Telegram es realmente fácil pues con una simple llamada HTTP puedes enviarlos. En este post vamos a utilizar la capacidad de GoogleSheet de ejecutar scripts para hacer esta llamada a una serie de grupos de Telegram con un simple click.

## Preparación

Vamos a necesitar:

- Una hoja de cálculo de GoogleSheet

- El token de un bot de Telegram que obtendremos desde @BotFather

- Los IDs de los grupos a los que queremos enviar el mensaje y en los que el admin de cada grupo habrá dado permisos para ello al bot

### Bot de Telegram

Crear un bot de Telegram es realmente fácil y no lleva más de un minuto y unos pocos clicks (obviamente necesitas tener una cuenta de Telegram). Bien sea desde la aplicación del móvil, la versión web o la versión de escritorio (sí, Telegram tiene 3 formas de usarlo) buscaremos en los contactos a @BotFather

 ![botfather](https://jorge.aguilera.soy/images/2021/telegramgoogle/botfather.png)

Una vez empecemos el diálogo con BotFather seleccionaremos /newbot y seguiremos los pasos que nos va guiando el bot

 ![newbot](https://jorge.aguilera.soy/images/2021/telegramgoogle/newbot.png)

Al final del proceso tendremos nuestro bot listo y podremos consultar su API token (siempre puedes consultarlo así que no necesitas guardarlo pero allá donde lo vayas a usar ten cuidado de no compartirlo o versionarlo en algún repo donde pueda acceder gente que no quieras que lo vean)

 ![token](https://jorge.aguilera.soy/images/2021/telegramgoogle/token.png)

## Grupos de telegram

Una vez que tengas el bot creado el admin del grupo al que quieres enviar mensajes le tiene que añadir como admin para que pueda escribir en el grupo.

Así mismo tienes que saber el ID del grupo. Si es público es simplemente su nombre (con la arroba) pero si es un grupo privado tienes que "adivinar" su id. La forma más fácil de buscarlo es con el cliente web ([https://web.telegram.org](https://web.telegram.org)) fijándote en la url una vez que seleccionas el grupo:

 ![groupid](https://jorge.aguilera.soy/images/2021/telegramgoogle/groupid.png)

El id del grupo privado es "-100" más la parte subrayada de la imagen (a mí no me mires, es cosa de Telegram)

## Sheet

Con todo ello vamos a preparar en una hoja de GoogleSheet una serie de celdas para que nos sea cómodo poder especificar:

- el token

- el titulo

- el mensaje

- una imagen (opcional)

- una lista de grupos

- una lista de celdas donde ir poniendo si el envío ha sido correcto o no.

El diseño que he hecho corresponde al de la imagen siguiente y el código adjunto será en base a estas posiciones:

 ![sheet](https://jorge.aguilera.soy/images/2021/telegramgoogle/sheet.png)

- A1: un dibujo de un boton y que tiene asociado el script `sendTelegrams` cuando se le pincha (usar el boton derecho sobre la imagen)

- B2: el Token

- B3: el titulo

- B4: una url a una imagen en internet

- B5-N: recorreremos todas las celdas y las concatenaremos para hacer le mensaje

- C3-N: una lista de ids de grupos privados o públicos

Desde Herramientas seleccionaremos "Editor de secuencias de comandos" y en el editor que nos aparece sustituieremos lo que nos crea por defecto por el siguiente código:

```
var ui = SpreadsheetApp.getUi();
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getActiveSheet();
var rangeData = sheet.getDataRange();
var lastColumn = rangeData.getLastColumn();
var lastRow = rangeData.getLastRow();

function sendTelegrams() {

  const title = sheet.getRange(3,2).getValue()
  const image = sheet.getRange(4,2).getValue()
  let message = sheet.getRange(5,2,10,1).getValues().join('\n')
  const bootToken = sheet.getRange(1,3).getValue()
  if( image != ""){
    message+="\n[​​​​​​​​​​​]("+image+")"
  }
  const groups = sheet.getRange(3,3,100,1).getValues()
  for( var g=0; g<groups.length; g++){
    if(!groups[g][0]){
      continue
    }
    var payload = {
      'chat_id':groups[g][0],
      'text': title+'\n'+message,
      'parse_mode':'MarkdownV2',
      'disable_web_page_preview':false
    }
    var options = {
      'method' : 'post',
      'contentType': 'application/json',
      'payload': JSON.stringify(payload),
      'muteHttpExceptions':true
    };
    var url = 'https://api.telegram.org/bot'+bootToken+'/sendMessage';
    const resp = UrlFetchApp.fetch(url, options);
    sheet.getRange(3+g,4).setValue(resp.getResponseCode()==200)
  }
}
```

El script es realmente simple:

- accedemos a los objetos de GoogleSheet

- leemos los valores de las celdas de interés

- concatenamos todas las celdas de mensajes con retornos de carro (\n)

- si queremos ḿandar una imagen la incluimos en formato markdown

- recorremos el rango destinado a los ids de grupo y para cada uno construimos un payload según lo quiere Telegram y un options según lo quiere Google

- enviamos el mensaje con `UrlFetchApp` y vamos escribiendo si ha ido bien o mal

- chimpun

<dl>
<dt>NOTE</dt>
<dd>
<p>Como ves para no complicar el ejemplo he optado por usar MarkdownV2 aunque también
se puede usar HTML (en realidad un subconjunto del mismo) simplemente cambiando <code>parse_mode</code>
a <code>html</code></p>
</dd>
</dl>

Guardamos el script y volvemos a la hoja de cálculo donde podemos añadir un dibujo (Insertar/Dibujo) de un botón por ejemplo y con el botón derecho sobre él asignarle que ejecute la función:

 ![boton1](https://jorge.aguilera.soy/images/2021/telegramgoogle/boton1.png)

 ![boton2](https://jorge.aguilera.soy/images/2021/telegramgoogle/boton2.png)

## Escribir mensajes

Por último simplemente nos resta redactar nuestro mensaje usando formato markdown

La idea es que puedas escribir de forma cómoda usando las celdas de Google de tal forma que no hace falta que lo escribas todo en una única celda, sino aprovechar que, si le das al enter, Google te lleva a la celda inferior. El scritp concatenará todas estas celdas en una cadena con retornos de carro. De esta forma, si dejas una celda en blanco podrás formatear mejor los mensajes

<dl>
<dt>NOTE</dt>
<dd>
<p>He puesto un límite de 100 celdas, más que suficientes para un mensaje</p>
</dd>
</dl>

Una vez que tengas preparado el mensaje puedes, por ejemplo, quitar (o mover) todos los ids salvo uno de pruebas y pulsar el botón para que se ejecute el script. Si todo ha ido bien y el mensaje es de tu gusto, puedes volver a poner en las celdas de los ids los mismos y volver a pulsar el botón.

Para cada grupo indicado el script escribirá un TRUE o FALSE si ha podido enviar el mensaje en ese canal o no