Resolución N° 5.616/2024. Más información

Crear Factura Electrónica de ARCA en Google Sheets

Paso a paso con Apps Script


Crear Factura Electrónica de ARCA en Google Sheets

Si es tu primera vez conectándote con la facturación electrónica de ARCA, te recomiendo leer esta guía básica sobre su funcionamiento general.

Conectar tu sistema con la facturación electrónica de ARCA

Conectar tu sistema con la facturación electrónica de ARCA

Guía paso a paso

El primer paso para crear una factura electrónica de ARCA es obtener el Código de Autorización Electrónico (CAE).

En este tutorial vamos a hacerlo desde Google Sheets usando Apps Script y el API de Afip SDK.

Requisitos previos

Para poder seguir esta guía, primero necesitarás:

Plantilla de Google Sheets

Podés descargar esta plantilla base para empezar más rápido:

Crear el script en Google Sheets

  1. Abrí tu hoja de Google Sheets.
  2. Andá a Extensiones → Apps Script.
  3. Creá un archivo (por ejemplo factura-arca.gs).

Configurar constantes

Pegá este bloque al inicio del archivo:

const ACCESS_TOKEN = 'TU_ACCESS_TOKEN';
const TAX_ID = 20409378472; // CUIT de desarrollo
const BASE_URL = 'https://app.afipsdk.com/api/v1';

Para usar los web services de ARCA se requiere certificado digital. En desarrollo podés usar el CUIT 20409378472 para integrar rápido.

Si preferís usar tu propio certificado en desarrollo, seguí esta guía: usar tu propio certificado para desarrollo.

Helpers para llamar a Afip SDK API

function afipRequest(path, payload) {
  const response = UrlFetchApp.fetch(`${BASE_URL}${path}`, {
    method: 'post',
    contentType: 'application/json',
    headers: {
      Authorization: `Bearer ${ACCESS_TOKEN}`,
    },
    payload: JSON.stringify(payload),
    muteHttpExceptions: true,
  });

  const data = JSON.parse(response.getContentText());

  if (response.getResponseCode() >= 400) {
    throw new Error(data?.error_message || data?.message || response.getContentText());
  }

  return data;
}

function getAfipAuth() {
  return afipRequest('/afip/auth', {
    environment: 'dev',
    tax_id: String(TAX_ID),
    wsid: 'wsfe',
  });
}

Obtener el número del último comprobante

Antes de crear la factura, necesitamos saber cuál es el último número de comprobante autorizado. Esto evita el error (10016) El número o fecha del comprobante no se corresponde con el próximo a autorizar.

function getNextVoucherNumber(auth) {
  const result = afipRequest('/afip/requests', {
    environment: 'dev',
    wsid: 'wsfe',
    method: 'FECompUltimoAutorizado',
    params: {
      Auth: {
        Token: auth.token,
        Sign: auth.sign,
        Cuit: TAX_ID,
      },
      PtoVta: 1,
      CbteTipo: 6, // Factura B
    },
  });

  const lastVoucher = Number(result?.FECompUltimoAutorizadoResult?.CbteNro || 0);
  return lastVoucher + 1;
}

Crear la factura desde Google Sheets

Vamos a crear una Factura B usando el número de comprobante obtenido en el paso anterior y tomando los importes desde la hoja.

En este ejemplo, tomamos los importes por fila (más natural para una planilla):

  • Fila 2 = comprobante a emitir
  • Columna C = Importe neto gravado
  • Columna D = Importe IVA
  • Columna F = CAE (resultado)
  • Columna G = Vencimiento del CAE (resultado)
  • Columna H = Número de comprobante (resultado)
function crearFacturaElectronicaARCA() {
  const auth = getAfipAuth();
  const nextVoucherNumber = getNextVoucherNumber(auth);

  const today = new Date();
  const cbteFch = Utilities.formatDate(today, 'GMT-3', 'yyyyMMdd');

  const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  const row = 2; // fila del comprobante
  const impNeto = Number(sheet.getRange(row, 3).getValue() || 0); // Columna C
  const impIVA = Number(sheet.getRange(row, 4).getValue() || 0);  // Columna D
  const impTotal = impNeto + impIVA;

  const result = afipRequest('/afip/requests', {
    environment: 'dev',
    wsid: 'wsfe',
    method: 'FECAESolicitar',
    params: {
      Auth: {
        Token: auth.token,
        Sign: auth.sign,
        Cuit: TAX_ID,
      },
      FeCAEReq: {
        FeCabReq: {
          CantReg: 1,
          PtoVta: 1,
          CbteTipo: 6,
        },
        FeDetReq: {
          FECAEDetRequest: {
            Concepto: 1,
            DocTipo: 99,
            DocNro: 0,
            CbteDesde: nextVoucherNumber,
            CbteHasta: nextVoucherNumber,
            CbteFch: Number(cbteFch),
            ImpTotal: impTotal,
            ImpTotConc: 0,
            ImpNeto: impNeto,
            ImpOpEx: 0,
            ImpIVA: impIVA,
            ImpTrib: 0,
            MonId: 'PES',
            MonCotiz: 1,
            CondicionIVAReceptorId: 5,
            Iva: {
              AlicIva: [
                {
                  Id: 5,
                  BaseImp: impNeto,
                  Importe: impIVA,
                },
              ],
            },
          },
        },
      },
    },
  });

  const detalleRaw = result?.FECAESolicitarResult?.FeDetResp?.FECAEDetResponse;
  const detalle = Array.isArray(detalleRaw) ? detalleRaw[0] : detalleRaw;
  const cae = detalle?.CAE;
  const caeVto = detalle?.CAEFchVto;

  Logger.log(`CAE: ${cae}`);
  Logger.log(`Vencimiento CAE: ${caeVto}`);

  // Guardar resultado en la misma fila del comprobante
  sheet.getRange(row, 6).setValue(cae || '');               // Columna F: CAE
  sheet.getRange(row, 7).setValue(caeVto || '');            // Columna G: Vencimiento CAE
  sheet.getRange(row, 8).setValue(nextVoucherNumber || ''); // Columna H: Número de comprobante
}

Ejecutá la función crearFacturaElectronicaARCA desde Apps Script y autorizá permisos cuando te lo pida.

Ejemplos de otros tipos de comprobantes

Problemas comunes

Si estás teniendo el error (10016) El número o fecha del comprobante no se corresponde con el próximo a autorizar, te recomiendo leer este artículo.

Error (10016) El numero o fecha del comprobante no se corresponde con el proximo a autorizar

Error (10016) El numero o fecha del comprobante no se corresponde con el proximo a autorizar

Pasos para resolver este error

Si estás teniendo el error (10242) El campo Condición IVA receptor es obligatorio. Consultar método FEParamGetCondicionIvaReceptor, te recomiendo leer este artículo.

Error (10242) El campo Condicion IVA receptor no es un valor valido/es obligatorio

Error (10242) El campo Condicion IVA receptor no es un valor valido/es obligatorio

Pasos para resolver este error

Luego, lo único que queda es pasar a modo producción. Podés seguir la guía para pasar a producción con Afip SDK.


Ante cualquier duda o pregunta, podés resolverla rápidamente en la Comunidad Afip SDK.

Conéctate a ARCA hoy mismo

Evitá la complejidad de ARCA. Con Afip SDK integrás tu sistema en minutos y te enfocás en hacer crecer tu negocio.