> ## Documentation Index
> Fetch the complete documentation index at: https://www.twicecommerce.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Jak připojit Tabulky Google k TWICE Commerce

> Načtěte knihy výnosů a plateb do Tabulky Google krátkým skriptem Apps Script a obnovujte je podle časovače. Tatáž tabulka zásobuje i Tableau a Looker Studio.

![Karta Export u reportu s koncovými body REST API](https://mintcdn.com/twicecommerce/Ab7tx7ih94KQsi0k/images/reports-export.webp?fit=max\&auto=format\&n=Ab7tx7ih94KQsi0k\&q=85\&s=5b8746adc8bb592f174ae9f8130924e2)

Reporty > Přehled prodejů > Export

> **[Otevřít v TWICE Admin](https://admin.twicecommerce.com/reports)**
>
> reports

Přidejte do Tabulky Google skript, který načte knihy výnosů a plateb do dvou karet, a spouštějte ho podle časovače. Použijte Apps Script, protože funkce `IMPORTDATA` neumí poslat hlavičku s klíčem API.

## Předpoklady

> [!WARNING]
>
> **Vyžadovaný přístup:** klíč API pro TWICE Commerce s oblastí **Reporty** na úrovni **Čtení** a bez dalších oblastí. Každý, kdo tabulku může upravovat, otevře skript a klíč si přečte. Právo na úpravy proto dejte jen lidem, kterým byste dali i samotný klíč, a ostatním sdílejte kopie nebo dashboardy pouze ke čtení. Viz [Klíče API](https://www.twicecommerce.com/docs/cs/concepts/integrations/api-keys.md).

> [!NOTE]
>
> **Než začnete:**
>
> * **Koncové body knih a formát souboru** z návodu [Přetáhněte svá data do nástroje BI](https://www.twicecommerce.com/docs/cs/guides/reports/pull-report-data.md).
> * **Váš kód měny** a první datum, od kterého chcete historii.
> * **Kontrola velikosti.** Do Tabulky Google se vejde 10 milionů buněk a jeden řádek knihy zabere asi 30 buněk, takže se do tabulky vejde přibližně 300 000 řádků knihy přes obě karty.
>
> Názvy v Tabulkách Google a Apps Scriptu jsou v tomto návodu uvedeny tak, jak se zobrazují v anglickém rozhraní.

## Postup

**1. Otevřete editor skriptů**

Vytvořte Tabulku Google a potom zvolte **Extensions → Apps Script**.

**2. Uložte klíč jako vlastnost skriptu**

Otevřete **Project Settings** (ikona ozubeného kola), zvolte **Add script property**, nastavte **Property** na `TWICE_API_KEY` a **Value** na klíč a uložte.

**3. Vložte skript**

Otevřete **Editor**, nahraďte obsah souboru `Code.gs` skriptem níže a hodnoty `CURRENCY` a `FROM_DATE` změňte na své. Uložte.

**4. Spusťte skript jednou**

V nabídce funkcí vyberte `refreshTwiceLedgers` a zvolte **Run**. Schvalte oprávnění, o která Google požádá: skript čte tabulku a volá externí adresu URL.

**5. Naplánujte spouštění**

Otevřete **Triggers** (ikona hodin) a zvolte **Add Trigger**. Vyberte `refreshTwiceLedgers`, nastavte zdroj události na **Time-driven**, vyberte **Day timer** a hodinu a uložte.

Použijte tento skript:

```javascript Code.gs theme={null}
const BASE_URL = 'https://server.twicecommerce.com/internal/reporting/';
const CURRENCY = 'EUR';
const FROM_DATE = '2025-01-01';

function refreshTwiceLedgers() {
  const to = Utilities.formatDate(new Date(), Session.getScriptTimeZone(), 'yyyy-MM-dd');
  loadLedger_('revenue', 'Revenue', to);
  loadLedger_('payments', 'Payments', to);
}

function loadLedger_(ledger, sheetName, to) {
  const key = PropertiesService.getScriptProperties().getProperty('TWICE_API_KEY');
  const url = BASE_URL + ledger + '/export?from=' + FROM_DATE + '&to=' + to + '&currency=' + CURRENCY;
  const response = UrlFetchApp.fetch(url, {
    headers: { 'X-API-KEY': key },
    muteHttpExceptions: true,
  });
  if (response.getResponseCode() !== 200) {
    throw new Error(ledger + ' export failed with ' + response.getResponseCode() + ': ' +
      response.getContentText().slice(0, 200));
  }

  const text = response.getContentText('UTF-8').replace(/^﻿/, '');
  const parsed = Utilities.parseCsv(text, ';');
  const width = parsed[0].length;
  // A truncated export ends in a one-cell notice row. Keep only full rows.
  const rows = parsed.filter((row) => row.length === width);
  if (rows.length < parsed.length) {
    throw new Error(ledger + ' export was truncated. Move FROM_DATE later or split the period.');
  }

  // Write numbers as numbers, so the sheet's locale cannot misread 202.42.
  // Codes with a leading zero stay text.
  const values = rows.map((row, i) =>
    i === 0 ? row : row.map((cell) => (/^-?(0|[1-9]\d*)(\.\d+)?$/.test(cell) ? Number(cell) : cell)),
  );

  const spreadsheet = SpreadsheetApp.getActive();
  const sheet = spreadsheet.getSheetByName(sheetName) || spreadsheet.insertSheet(sheetName);
  sheet.clearContents();
  sheet.getRange(1, 1, values.length, width).setValues(values);
}
```

Skript při každém běhu obě karty přepíše, takže vždy drží celé období od `FROM_DATE` do dneška. Vzorce, kontingenční tabulky a grafy mířte na karty, nikdy na pevný rozsah, protože počet řádků roste.

## Jak poznám, že to fungovalo?

* Tabulka má kartu `Revenue` a kartu `Payments` a každá začíná řádkem záhlaví.
* Kontingenční tabulka na kartě `Revenue`, která sčítá `Amount_Total` s filtrem `Started_In_Period` = `Yes`, odpovídá reportu **Report výnosů** v administraci za stejné období a ve stejné měně.
* Sekce **Executions** v editoru Apps Scriptu uvádí dokončený běh spuštěný časovačem.

## Řešení potíží a časté chyby

> **Běh selže s chybou "export failed with 401"**
>
> Vlastnost skriptu chybí, nebo drží starý klíč. Zkontrolujte `TWICE_API_KEY` pod volbou **Project Settings** a to, že klíč v TWICE Commerce stále existuje pod **Nastavení → Integrace & API**.

> **Běh selže s chybou "export was truncated"**
>
> Období drží více než 100 000 řádků. Posuňte `FROM_DATE` později, nebo načtěte jednu kartu na rok tím, že funkci `loadLedger_` zavoláte pro každý rok s vlastními daty a vlastním názvem listu.

> **Běh selže s chybou "Exceeded maximum execution time"**
>
> Jeden běh smí trvat šest minut. Načtěte knihu výnosů a knihu plateb ze dvou funkcí na dvou časovačích s hodinovým odstupem.

> **Datumy nebo částky se zobrazují jako text**
>
> Na kartě byl před načtením nastavený vzorec nebo formát. Vymažte formátování karty a nechte skript hodnoty zapsat znovu.

Google popisuje volání, která skript používá, v článcích [UrlFetchApp](https://developers.google.com/apps-script/reference/url-fetch/url-fetch-app), [Properties service](https://developers.google.com/apps-script/guides/properties) a [Installable triggers](https://developers.google.com/apps-script/guides/triggers/installable).

## Související články

> **[Přetáhněte svá data do nástroje BI](https://www.twicecommerce.com/docs/cs/guides/reports/pull-report-data.md)**
>
> Koncové body, formát souboru a limity volání.

> **[Připojte Looker Studio](https://www.twicecommerce.com/docs/cs/guides/reports/connect-looker-studio.md)**
>
> Postavte dashboardy nad touto tabulkou.

> **[Připojte Tableau](https://www.twicecommerce.com/docs/cs/guides/reports/connect-tableau.md)**
>
> Nasměrujte Tableau na tuto tabulku.

> **[Finanční reporty](https://www.twicecommerce.com/docs/cs/concepts/reports/finance-reports.md)**
>
> Každý sloupec knihy a jak se každé číslo odvozuje.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.