Enviar imágenes y texto a Telegram desde GoogleSheet
Tags: google, telegram
Published: 2021-10-28 04:40:05

---
title: Enviar imágenes y texto a Telegram desde GoogleSheet
published: true
date: 2021-10-24 00:00:00 UTC
tags: google,telegram
canonical_url: https://jorge.aguilera.soy/blog/2021/googlesheet-telegram2.html
---

<dl>
<dt>INFO</dt>
<dd>
<p>Un lector ha pedido si sería posible modificar el script para enviar primero la imagen
y luego el texto, así que he aprovechado para crear otro post y engordar el blog.</p>
</dd>
</dl>

Este post es simplemente otra forma de enviar mensajes a Telegram desde GoogleSheet parecido al del post [googlesheet-telegram.html](googlesheet-telegram.html), así que básicamente copiare el codigo nuevo sin muchas explicaciones

Como este post se basa exactamente en el post comentado los requisitos son los mismos así como la preparación y entorno de ejecución. Simplemente vamos a usar otra disposición de las celdas y en lugar de enviar a muchos grupos vamos a suponer que queremos mandar a uno sólo

## Hoja Excel

El script se va a basar en la disposición de celdas reflejadas en la imagen siguiente:

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

Como puedes ver la idea ahora es poner en filas los mensajes que queremos enviar y asociar una imagen a cada uno (así mismo fíjate que podemos formatear el texto con negritas, subrayados, etc usando un subset de Markdown)

La "clave" para que el script se ejecute correctamente es la primera columna "Estado" donde el script irá mirando si queremos enviar esa fila. **Aquellas filas que estado sea `enviar` serán enviadas al grupo**

Así mismo, a modo de control, el script usará esta columna para indicar si ha podido enviar el mensaje y cuando lo ha hecho y de esta forma facilitar el poder ejecutar el script sin repetir mensajes

**El script sólo leerá las primeras 100 filas** , así que de vez en cuando haz limpieza de estas borrando/moviendo las que ya no te interesen

## Script

El script es muy parecido al anterior así que simplemente comentar:

- 

ahora recorremos filas de un rango (A5:C100)

- 

enviamos un primer mensaje a Telegram llamando al endpoint `/sendPhoto`

- 

enviamos un segundo mensaje con el texto a modo de explicación de la foto

```
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 bootToken = sheet.getRange(1,3).getValue()
  const group = sheet.getRange(2,3).getValue()

  const rows = sheet.getRange(5,1,100,3).getValues()
  for( var r=0; r<rows.length; r++){
    const row = rows[r];
    if( row[0].toString().toLowerCase() !== "enviar"){
      continue;
    }

    var payload = {
      'chat_id':group,
      'photo': row[1],
      '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+'/sendPhoto';
    const respImage = UrlFetchApp.fetch(url, options);
    Logger.log(options.payload)
    Logger.log(respImage)
    if( respImage.getResponseCode() != 200 ){
      sheet.getRange(5+r,1).setValue(respImage.getResponseCode()==200?"Enviado "+new Date():respImage.getContentText())
      return;
    }

    payload.text = row[2];
    options.payload = JSON.stringify(payload);

    var url = 'https://api.telegram.org/bot'+bootToken+'/sendMessage';
    const respMessage = UrlFetchApp.fetch(url, options);
    Logger.log(options.payload)
    Logger.log(respMessage)
    sheet.getRange(5+r,1).setValue(respImage.getResponseCode()==200?"Enviado "+new Date():respImage.getContentText())
  }
}
```

Y ya estaría. Cada vez que pulsemos el botón "Enviar", el script se ejecutará (si seguiste los pasos del post anterior) recorriendo las filas y enviando aquellas que estén marcadas como "enviar"