Ir al contenido
Cifra y Letra

Convertir números a letras en Google Sheets

Convertir números a letras en Google Sheets te permite obtener el importe escrito en una celda. Copia la función o descarga el archivo; no hace falta instalar un complemento.

Descargar función para Google Sheets

Función para convertir números a letras en Google Sheets

La función recibe una celda numérica. Por ejemplo, si A1 contiene 1234.56, escribe =NUMLETRAS(A1) en B1.

El resultado es MIL DOSCIENTOS TREINTA Y CUATRO PESOS 56/100 M.N.

  1. Abre Extensiones y después Apps Script. Agrega un archivo de secuencia de comandos, pega la función y guarda. Conserva el código que ya tenga tu proyecto.
  2. Regresa a la hoja y escribe la fórmula. Puedes convertir una sola celda o un rango.
Apps Script
/**
 * NUMLETRAS para Google Sheets (Apps Script) y referencia del algoritmo que siguen la fórmula LAMBDA y el módulo VBA.
 * Devuelve el importe en pesos con el formato de cheques y facturas: «MIL DOSCIENTOS TREINTA Y CUATRO PESOS 56/100 M.N.».
 * Límite: importes de 0 a 999,999,999,999.99 (la precisión de una hoja de cálculo no alcanza más).
 *
 * Uso en Sheets: Extensiones › Apps Script, pegar este archivo y usar =NUMLETRAS(A1) o =NUMLETRAS(A1:A100) en la hoja.
 * @param {number|Array<Array<number>>} numero Importe o rango de importes.
 * @return {string|Array<Array<string>>} Cantidad con letra en pesos mexicanos.
 * @customfunction
 */
function NUMLETRAS(numero) {
  var esRango = Array.isArray(numero);
  if (esRango) {
    var filas = numero.length;
    var columnas = Array.isArray(numero[0]) ? numero[0].length : 0;
    if (filas > 10000 || columnas > 10000 || filas * columnas > 10000) {
      return 'Usa un rango de hasta 10000 celdas; evita columnas completas.';
    }
    if (!filas || !columnas || numero.some(function (fila) { return !Array.isArray(fila) || fila.length !== columnas; })) {
      return 'El rango debe ser una tabla rectangular de celdas.';
    }
  }
  var U = ['', 'UN', 'DOS', 'TRES', 'CUATRO', 'CINCO', 'SEIS', 'SIETE', 'OCHO', 'NUEVE', 'DIEZ', 'ONCE', 'DOCE',
    'TRECE', 'CATORCE', 'QUINCE', 'DIECISÉIS', 'DIECISIETE', 'DIECIOCHO', 'DIECINUEVE', 'VEINTE', 'VEINTIÚN',
    'VEINTIDÓS', 'VEINTITRÉS', 'VEINTICUATRO', 'VEINTICINCO', 'VEINTISÉIS', 'VEINTISIETE', 'VEINTIOCHO', 'VEINTINUEVE'];
  var D = ['', '', '', 'TREINTA', 'CUARENTA', 'CINCUENTA', 'SESENTA', 'SETENTA', 'OCHENTA', 'NOVENTA'];
  var C = ['', 'CIENTO', 'DOSCIENTOS', 'TRESCIENTOS', 'CUATROCIENTOS', 'QUINIENTOS', 'SEISCIENTOS', 'SETECIENTOS',
    'OCHOCIENTOS', 'NOVECIENTOS'];

  // 1 a 999, siempre delante de un sustantivo (pesos, mil, millones): un, veintiún, treinta y un.
  function tres(x) {
    if (x === 100) return 'CIEN';
    var h = Math.floor(x / 100);
    var r = x % 100;
    var resto = r < 30 ? U[r] : D[Math.floor(r / 10)] + (r % 10 > 0 ? ' Y ' + U[r % 10] : '');
    return (C[h] + ' ' + resto).trim();
  }

  // 1 a 999,999: «mil», no «un mil».
  function seis(x) {
    var miles = Math.floor(x / 1000);
    var resto = x % 1000;
    var parte = miles === 0 ? '' : miles === 1 ? 'MIL' : tres(miles) + ' MIL';
    return (parte + ' ' + (resto > 0 ? tres(resto) : '')).trim();
  }

  function convertirCelda(numero) {
    if (numero === '') return '';
    if (typeof numero !== 'number' || !isFinite(numero) || numero < 0 || numero >= 1e12) {
      return 'Escribe un importe de 0 a 999,999,999,999.99';
    }
    // Desplazar el decimal de la representación de entrada evita 1.005 * 100 = 100.499999...
    // También contempla la notación científica que usa Number.toString para valores pequeños.
    var partes = String(numero).split('e');
    var total = Math.round(Number(partes[0] + 'e' + (Number(partes[1] || 0) + 2)));
    if (total >= 1e14) return 'El redondeo supera el límite de 999,999,999,999.99';
    var entero = Math.floor(total / 100);
    var centavos = total % 100;
    var millones = Math.floor(entero / 1e6);
    var bajo = entero % 1e6;
    var texto;
    if (entero === 0) {
      texto = 'CERO';
    } else {
      var parteMillones = millones === 0 ? '' : millones === 1 ? 'UN MILLÓN' : seis(millones) + ' MILLONES';
      texto = (parteMillones + ' ' + (bajo > 0 ? seis(bajo) : '')).trim();
    }
    var moneda = entero === 1 ? 'PESO' : (millones > 0 && bajo === 0 ? 'DE PESOS' : 'PESOS');
    return texto + ' ' + moneda + ' ' + (centavos < 10 ? '0' : '') + centavos + '/100 M.N.';
  }
  return esRango ? numero.map(function (fila) { return fila.map(convertirCelda); }) : convertirCelda(numero);
}

Convertir un rango de celdas

Escribe =NUMLETRAS(A1:A100) en una celda vacía. La función devuelve una fila por cada celda del rango y deja vacías las filas sin importe.

También puedes usar un bloque como =NUMLETRAS(A1:B10). Deja libre un espacio del mismo tamaño para los resultados.

Una celda inválida muestra su aviso en el lugar correspondiente. Los demás importes del rango se convierten por separado.

No uses columnas completas como A:A. Elige un rango de hasta 10000 celdas.

Qué devuelve

Admite números de 0 a 999,999,999,999.99 y redondea al centavo. No convierte importes negativos, texto entre comillas ni valores lógicos. Una celda vacía devuelve un resultado vacío.

Los importes guardados como texto no se convierten automáticamente. Revisa la configuración regional y convierte la celda a un valor numérico antes de usar NUMLETRAS.

Las fechas, los valores VERDADERO o FALSO y los mensajes de error no son importes. Reciben un aviso en su propia celda.

Un porcentaje llega como su valor decimal: 10 % se convierte como 0.1, es decir, diez centavos.

Una hoja de cálculo puede cambiar una cifra larga antes de que la función la reciba. Revisa el valor almacenado; no uses esta función para conservar cadenas de 18 dígitos.

Deja libre el espacio de salida

Si aparece #REF!, revisa que ninguna celda del resultado contenga datos ni esté combinada. La función no sobrescribe esas celdas.

Si la fórmula está dentro del mismo rango que convierte, mueve la fórmula fuera de ese rango para evitar una referencia circular.

Si la fórmula muestra un error

Al cambiar una celda del rango, Sheets vuelve a calcular la fórmula. Si acabas de actualizar el código, vuelve a escribir la fórmula para ejecutar la versión nueva.

Prueba un importe pequeño y otro con centavos antes de copiar resultados a un documento.

Las celdas con un error de origen muestran el mensaje de entrada inválida de la función. Revisa primero la celda de origen.

El 5 de octubre de 2026 comprobamos en Google Sheets las conversiones individuales, los rangos, los vacíos, el recálculo y el límite de 10000 celdas.

Fuente de instalación y recálculo: funciones personalizadas de Google Sheets.