Generar una tabla de contenidos en una hdc de Google con una función personalizada

Esta chorradilla de script surgió anoche en el transcurso de una conversación de Discord. Son un puñado de líneas Apps Script (que se quedan en 3 si se eliminan los comentarios y la gestión de parámetros),  lo que demuestra una vez más lo potente que es este entorno de desarrollo, también en las cosas pequeñas.

https://app-us-east-1.t-cdn.net/5d33fc2e157ae2536b9e9d88/posts/6118c6837f342e6a1f2d1115/5589_ezgif.com-gif-maker.gif

Solo tienes que copiar y pegar esto en el editor de código de tu hoja de cálculo para que la función TOC() esté disponible.

/**
 * Builds a TOC in the spreadsheet.
 * @param {true} includeId Include sheet ID
 * @param {true} includeUrl Include link to sheet
 * @return List of [Sheet name, Sheet ID, Sheet URL]
 * @customfunction
 */
function TOC(includeId, includeUrl) {

  const ss = SpreadsheetApp.getActive();
  const baseUrl = ss.getUrl();
  const toc = [];
  ss.getSheets().forEach(sheet => {
    const rowResult = [];
    rowResult.push(sheet.getName());
    if (includeId) rowResult.push(sheet.getSheetId());
    if (includeUrl) rowResult.push(baseUrl + '#gid=' + sheet.getSheetId());
    toc.push(rowResult);
  });
  return toc;

}

Por ejemplo:

=TOC()

para generar una tabla de contenidos con el nombre de cada hoja o

=TOC(VERDADERO;VERDADERO)

para que la tabla de contenidos muestre también IDs e intra enlaces a cada hoja.

Lamentablemente, la tabla generada no se actualiza automáticamente al añadir hojas, hay que forzar un recálculo general "potente" (las funciones personalizadas usan una caché interna durilla) de algún otro modo (por ejemplo insertando y eliminando una fila o columna situada por encima / a la izquierda de la celda donde está la fórmula, haciendo depender la fórmula de una casilla de verificación, etc.).

PS: Por cierto, la conversación era con Tyler Robertson, un tío que hace con las hojas de cálculo cosas que no le he visto hacer absolutamente a nadie (¡y sin código!). Si estás en estas cosas tienes que seguir su trabajo.