Amigo invisible con GoogleSheet
Tags: google, sheet
Published: 2022-03-06 17:28:19

---
title: Amigo invisible con GoogleSheet
published: true
date: 2021-11-07 00:00:00 UTC
tags: google,sheet
canonical_url: https://jorge.aguilera.soy/blog/2021/googlesheet-amigo-invisible.html
---

Siguiendo los post sobre GoogleSheet en este vamos a usarlo para enviar correos electrónicos a usuarios creando una hoja de cálculo para el amigo invisible

Todos los años en nuestra familia nos hacemos el amigo invisible. Ya sabes, nos reunimos, escribimos el nombre de cada uno en un papelito, los juntamos todos y vamos repartiendolos en secreto. Si a alguien le toca así mismo tiene que decirlo y volvemos a empezar.

En este post vamos a hacer un script simple que lo haga por nosotros y envie un correo a cada uno con un mensaje indicando quién le ha tocado (con un poco más de trabajo podríamos hacer que cada uno pudiera incluso una lista de cosas que le gustaría que le regalaran, etc)

## Preparación

Para el sorteo vamos a necesitar los nombres y correos electrónicos de cada participante, los cuales los pondremos en filas en el rango A2:B20, poniendo en la columna A los nombres y en la B los correos

Como los otros script, simplemente necesitaremos una hoja de Google y acceder al editor de secuencias de comandos. Reemplazaremos el código que nos propone por este otro:

```
function shuffleArray(array) {
    for (var i = array.length - 1; i > 0; i--) {
        var j = Math.floor(Math.random() * (i + 1));
        var temp = array[i];
        array[i] = array[j];
        array[j] = temp;
    }
}

function equalList(a, b){
  for(var i=0; i<a.length; i++){
    if( a[i]===b[i])
      return true;
  }
  return false;
}

const subject = "Tu amigo invisible"

function repartir() {
  const sheet = SpreadsheetApp.getActiveSheet()
  const range = sheet.getRange(2,1,20,3).getValues()
  const friends = [];
  let availables = []
  for( var r = 0; r < range.length; r++){
    if( !range[r][0] )
      continue;
    friends.push( range[r][0])
    availables.push( range[r][0])
  }
  for( var retry=0; retry<10; retry++){
    shuffleArray(availables)
    Logger.log(availables)
    if( equalList(friends, availables) == false)
      break
  }
  for( var r=0; r<availables.length; r++){
    range[r][2] = availables[r];
    const message = `Hola ${range[r][0]} \n En el sorteo del amigo invisible te ha tocado: ${range[r][2]}`
    MailApp.sendEmail(range[r][1], subject, message);
  }

}
```

Básicamente vamos a tener dos funciones de apoyo (una para randomizar una lista de nombres y otra para comparar dos listas y si algun elemento se encuentra repetido en la misma posición marcarlas como "iguales")

La lógica principal reside en la funcion repartir, que simplemente leerá la hoja de Google, randomizará la lista de participantes y comprobará que ninguno se ha tocado así mismo (si así fuera, randomizamos de nuevo)

Una vez asignados iremos enviando un correo a cada uno de los participantes indicandoles quién le ha tocado como amigo invisible.

<dl>
<dt>INFO</dt>
<dd>
<p>Lógicamente, el usuario que ejecute el script podrá saber a quién le ha tocado cada uno simplemente mirando
la bandeja de salida, así que pídete tú ser quien lo organizará este año</p>
</dd>
</dl>

Simplemente falta añadir un botón o disparador de la función al estilo de los otros post sobre GoogleSheet y ejecutarlo para que cada miembro de la lista reciba su correo