API/Utiliser l'API depuis Google Sheets

Utiliser l'API depuis Google Sheets

Importe une ligne par livre — royalties, dépenses pub, bénéfice net — dans une feuille Google Sheets avec un court script Apps Script, sans jamais mettre ta clé d'API dans la feuille.

Ce script remplit un onglet nommé Books avec une ligne par livre sur les 30 derniers jours : titre, ASIN, format, marketplace, unités, royalties, dépenses pub, bénéfice net et TACOS.

1. Crée une clé

Réglages → API → Créer une clé. Nomme-la « Google Sheets » et copie-la. Comment marchent les clés : Authentification et clés d'API.

2. Range la clé dans les propriétés du script

  1. Dans ta feuille Google Sheets, ouvre Extensions → Apps Script.
  2. Clique sur Paramètres du projet (la roue dentée), puis sur Ajouter une propriété de script.
  3. Propriété : TRUEROYALTIES_API_KEY. Valeur : ta clé. Enregistre.

Ne colle jamais la clé dans une cellule : toute personne avec qui la feuille est partagée pourrait la lire. Ne la mets pas non plus dans l'URL — l'API refuse la requête.

3. Colle le script

Dans l'Éditeur, remplace le contenu de Code.gs par :

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. Lance-le

  1. Choisis importBooks dans la barre d'outils et clique sur Exécuter.
  2. La première fois, Google te demande d'autoriser le script à joindre un service externe et à modifier ta feuille. Accepte.
  3. Reviens à la feuille : l'onglet Books est rempli.

Pour qu'il se mette à jour tout seul, ouvre Déclencheurs (l'horloge), Ajouter un déclencheur, choisis importBooks et un déclenchement horaire, une fois par jour.

Changer ce que tu importes

Modifie la requête sur la ligne url :

Tu veuxAjoute ou change
Une autre périoderange=last_month, ou start_date=2026-01-01&end_date=2026-06-30
Toutes les ventes depuis le débutrange=all_time
Une autre devise&currency=EUR
Un autre ordre&sort=revenue (aussi ad_spend, units, title ; net_profit par défaut)

Bon à savoir :

  • Les livres sans activité sur la période sont listés aussi, avec des zéros, comme sur la page Livres.
  • Chaque page de 100 livres est une requête. Le script attend tout seul quand il atteint la limite de 60 requêtes par minute : un gros catalogue prend juste un peu plus de temps.
  • Le script ne vérifie pas meta.truncated. S'il vaut true, certaines lignes n'ont pas pu être lues : importe une période plus courte.