Die API aus Google Sheets nutzen
Importiere eine Zeile pro Buch — Tantiemen, Werbeausgaben, Nettogewinn — mit einem kurzen Apps Script in eine Google-Tabelle, ohne deinen API-Schlüssel in die Tabelle zu schreiben.
Dieses Skript füllt ein Tabellenblatt namens Books mit einer Zeile pro Buch für die letzten 30 Tage: Titel, ASIN, Format, Marktplatz, Einheiten, Tantiemen, Werbeausgaben, Nettogewinn und TACOS.
1. Schlüssel erstellen
Einstellungen → API → Schlüssel erstellen. Nenn ihn „Google Sheets“ und kopiere ihn. Wie Schlüssel funktionieren: Authentifizierung und API-Schlüssel.
2. Schlüssel in den Skripteigenschaften speichern
- Öffne in deiner Google-Tabelle Erweiterungen → Apps Script.
- Klick auf Projekteinstellungen (das Zahnrad) und dann auf Skripteigenschaft hinzufügen.
- Eigenschaft:
TRUEROYALTIES_API_KEY. Wert: dein Schlüssel. Speichern.
Füg den Schlüssel nie in eine Zelle ein: Jeder, mit dem die Tabelle geteilt ist, könnte ihn lesen. Und nie in die URL — die API lehnt die Anfrage ab.
3. Skript einfügen
Ersetze im Editor den Inhalt von Code.gs durch:
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. Ausführen
- Wähl
importBooksin der Symbolleiste und klick auf Ausführen. - Beim ersten Mal fragt Google, ob das Skript einen externen Dienst erreichen und deine Tabelle bearbeiten darf. Stimm zu.
- Zurück in der Tabelle ist das Blatt Books gefüllt.
Damit es sich von selbst aktualisiert, öffne Trigger (die Uhr), Trigger
hinzufügen, wähl importBooks und einen zeitgesteuerten Trigger, einmal pro Tag.
Ändern, was du importierst
Bearbeite die Abfrage in der Zeile url:
| Du willst | Ergänze oder ändere |
|---|---|
| Einen anderen Zeitraum | range=last_month, oder start_date=2026-01-01&end_date=2026-06-30 |
| Alle Verkäufe seit Beginn | range=all_time |
| Eine andere Währung | ¤cy=EUR |
| Eine andere Sortierung | &sort=revenue (auch ad_spend, units, title; Standard net_profit) |
Gut zu wissen:
- Bücher ohne Aktivität im Zeitraum stehen auch in der Liste, mit Nullen, wie auf der Seite Bücher.
- Jede Seite mit 100 Büchern ist eine Anfrage. Das Skript wartet selbst, wenn es das Limit von 60 Anfragen pro Minute erreicht: Ein großer Katalog dauert einfach etwas länger.
- Das Skript prüft
meta.truncatednicht. Ist estrue, konnten manche Zeilen nicht gelesen werden: Importiere einen kürzeren Zeitraum.