Usar la API desde Google Sheets
Importa una línea por libro — regalías, gasto en anuncios, beneficio neto — a una hoja de Google Sheets con un breve Apps Script, sin poner nunca tu clave de API en la hoja.
Este script rellena una pestaña llamada Books con una línea por libro de los últimos 30 días: título, ASIN, formato, marketplace, unidades, regalías, gasto en anuncios, beneficio neto y TACOS.
1. Crea una clave
Ajustes → API → Crear una clave. Llámala «Google Sheets» y cópiala. Cómo funcionan las claves: Autenticación y claves de API.
2. Guarda la clave en las propiedades del script
- En tu hoja de Google Sheets, abre Extensiones → Apps Script.
- Haz clic en Configuración del proyecto (el engranaje) y después en Añadir propiedad de secuencia de comandos.
- Propiedad:
TRUEROYALTIES_API_KEY. Valor: tu clave. Guarda.
Nunca pegues la clave en una celda: cualquier persona con quien compartas la hoja podría leerla. Tampoco la pongas en la URL: la API rechaza la petición.
3. Pega el script
En el Editor, sustituye el contenido de Code.gs por:
const API_URL = "https://author.trueroyalties.com/api/v1/reports/books";
function importBooks() {
const key = PropertiesService.getScriptProperties().getProperty(
"TRUEROYALTIES_API_KEY",
);
if (!key) {
throw new Error("Add TRUEROYALTIES_API_KEY in Project Settings.");
}
const rows = [];
let cursor = null;
let currency = "";
while (true) {
let url = API_URL + "?range=last_30_days&limit=100";
if (cursor) url += "&cursor=" + encodeURIComponent(cursor);
const response = UrlFetchApp.fetch(url, {
headers: { Authorization: "Bearer " + key },
muteHttpExceptions: true,
});
const status = response.getResponseCode();
// Limit reached: wait as long as the API asks, then retry the same page.
if (status === 429) {
const headers = response.getHeaders();
const wait = Number(headers["Retry-After"] || headers["retry-after"] || 1);
Utilities.sleep(wait * 1000);
continue;
}
const body = JSON.parse(response.getContentText());
if (status !== 200) {
throw new Error(body.code + ": " + body.detail + " (" + body.request_id + ")");
}
currency = body.currency;
for (const line of body.data) {
rows.push([
line.book.title,
line.book.asin,
line.book.format,
line.book.marketplace,
line.units,
line.revenue,
line.ad_spend,
line.net_profit,
line.tacos === null ? "" : line.tacos,
]);
}
if (!body.has_more) break;
cursor = body.next_cursor;
}
const spreadsheet = SpreadsheetApp.getActive();
const sheet =
spreadsheet.getSheetByName("Books") || spreadsheet.insertSheet("Books");
sheet.clearContents();
sheet.getRange(1, 1, 1, 9).setValues([[
"Title", "ASIN", "Format", "Marketplace", "Units",
"Royalties (" + currency + ")", "Ad spend", "Net profit", "TACOS",
]]);
if (rows.length > 0) {
sheet.getRange(2, 1, rows.length, 9).setValues(rows);
}
}4. Ejecútalo
- Elige
importBooksen la barra de herramientas y haz clic en Ejecutar. - La primera vez, Google te pide que permitas al script conectarse a un servicio externo y editar tu hoja. Acepta.
- Vuelve a la hoja: la pestaña Books está rellenada.
Para que se actualice sola, abre Activadores (el reloj), Añadir activador,
elige importBooks y un activador por tiempo, una vez al día.
Cambiar lo que importas
Edita la consulta en la línea url:
| Quieres | Añade o cambia |
|---|---|
| Otro periodo | range=last_month, o start_date=2026-01-01&end_date=2026-06-30 |
| Todas las ventas desde el principio | range=all_time |
| Otra moneda | ¤cy=EUR |
| Otro orden | &sort=revenue (también ad_spend, units, title; net_profit por defecto) |
Conviene saber:
- Los libros sin actividad en el periodo también aparecen, con ceros, como en la página Libros.
- Cada página de 100 libros es una petición. El script espera solo cuando llega al límite de 60 peticiones por minuto: un catálogo grande simplemente tarda un poco más.
- El script no comprueba
meta.truncated. Si estrue, algunas filas no se pudieron leer: importa un periodo más corto.