API/De API gebruiken vanuit Google Sheets

De API gebruiken vanuit Google Sheets

Importeer één regel per boek — royalty's, advertentie-uitgaven, nettowinst — in een Google Sheet met een kort Apps Script, zonder je API-sleutel ooit in de sheet te zetten.

Dit script vult een tabblad met de naam Books met één regel per boek voor de laatste 30 dagen: titel, ASIN, formaat, marketplace, eenheden, royalty's, advertentie-uitgaven, nettowinst en TACOS.

1. Maak een sleutel aan

Instellingen → API → Sleutel aanmaken. Noem hem "Google Sheets" en kopieer hem. Hoe sleutels werken: Authenticatie en API-sleutels.

2. Bewaar de sleutel in de scripteigenschappen

  1. Open in je Google Sheet Extensies → Apps Script.
  2. Klik op Projectinstellingen (het tandwiel) en daarna op Scripteigenschap toevoegen.
  3. Eigenschap: TRUEROYALTIES_API_KEY. Waarde: je sleutel. Opslaan.

Plak de sleutel nooit in een cel: iedereen met wie de sheet gedeeld is, zou hem kunnen lezen. En nooit in de URL: de API weigert het verzoek.

3. Plak het script

Vervang in de Editor de inhoud van Code.gs door:

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. Voer het uit

  1. Kies importBooks in de werkbalk en klik op Uitvoeren.
  2. De eerste keer vraagt Google toestemming om een externe dienst te bereiken en je sheet te bewerken. Sta dat toe.
  3. Ga terug naar de sheet: het tabblad Books is gevuld.

Om het vanzelf te laten verversen, open je Triggers (de klok), Trigger toevoegen, kies je importBooks en een tijdgestuurde trigger, één keer per dag.

Wijzigen wat je importeert

Pas de query aan in de regel url:

Je wiltVoeg toe of wijzig
Een andere perioderange=last_month, of start_date=2026-01-01&end_date=2026-06-30
Alle verkopen vanaf het beginrange=all_time
Een andere valuta&currency=EUR
Een andere volgorde&sort=revenue (ook ad_spend, units, title; standaard net_profit)

Goed om te weten:

  • Boeken zonder activiteit in de periode staan er ook in, met nullen, zoals op de pagina Boeken.
  • Elke pagina van 100 boeken is één verzoek. Het script wacht vanzelf als het de limiet van 60 verzoeken per minuut bereikt: een grote catalogus duurt gewoon iets langer.
  • Het script controleert meta.truncated niet. Is die true, dan konden sommige rijen niet gelezen worden: importeer een kortere periode.