> ## 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.

# Miten yhdistät Google Sheetsin TWICE Commerceen

> Lataa liikevaihtopääkirja ja maksupääkirja Google Sheets -taulukkoon lyhyellä Apps Script -skriptillä ja päivitä ne ajastetusti. Sama taulukko syöttää myös Tableaun ja Looker Studion.

<Frame caption="Raportit > Myyntinäkymä > Vie">
  <img src="https://mintcdn.com/twicecommerce/Ab7tx7ih94KQsi0k/images/reports-export.webp?fit=max&auto=format&n=Ab7tx7ih94KQsi0k&q=85&s=5b8746adc8bb592f174ae9f8130924e2" alt="Raportin Vie-välilehti ja sen REST API -päätepisteet" width="1920" height="1080" data-path="images/reports-export.webp" />
</Frame>

<Card title="Avaa TWICE Adminissa" icon="external-link" href="https://admin.twicecommerce.com/reports" horizontal>
  reports
</Card>

Lisää Google Sheets -taulukkoon skripti, joka hakee liikevaihtopääkirjan ja maksupääkirjan kahdelle välilehdelle, ja aja se ajastetusti. Käytä Apps Scriptiä, koska `IMPORTDATA` ei pysty lähettämään API-avaimen otsaketta.

## Edellytykset

<Warning>
  **Vaadittu käyttöoikeus:** TWICE Commercen API-avain. Sillä on omistajatason oikeudet, ja kuka tahansa, jolla on taulukon muokkausoikeus, voi avata skriptin ja lukea avaimen. Anna muokkausoikeus vain niille, joille antaisit avaimen, ja jaa muille vain luku -kopioita tai koontinäyttöjä. Katso [API-avaimet](/docs/fi/concepts/integrations/api-keys).
</Warning>

<Info>
  **Ennen kuin aloitat:**

  * **Pääkirjojen päätepisteet ja tiedostomuoto** oppaasta [Tuo datasi BI-työkaluun](/docs/fi/guides/reports/pull-report-data).
  * **Valuuttakoodisi** ja ensimmäinen päivä, josta haluat historiaa.
  * **Koon tarkistus.** Google Sheets -taulukkoon mahtuu 10 miljoonaa solua, ja pääkirjan rivi on noin 30 solua, joten taulukkoon mahtuu noin 300 000 pääkirjariviä molemmat välilehdet yhteensä.

  Google Sheetsin ja Apps Scriptin valikkojen ja painikkeiden nimet ovat tässä oppaassa englanninkielisen käyttöliittymän mukaiset.
</Info>

## Vaiheittainen ohje

<Steps>
  <Step title="Avaa skriptieditori">
    Luo Google Sheets -taulukko ja valitse **Extensions → Apps Script**.
  </Step>

  <Step title="Tallenna avain skriptin ominaisuudeksi">
    Avaa **Project Settings** (rataskuvake), valitse **Add script property**, aseta **Property**-kenttään `TWICE_API_KEY` ja **Value**-kenttään avain, ja tallenna.
  </Step>

  <Step title="Liitä skripti">
    Avaa **Editor**, korvaa tiedoston `Code.gs` sisältö alla olevalla skriptillä ja vaihda `CURRENCY` ja `FROM_DATE` omiksi arvoiksesi. Tallenna.
  </Step>

  <Step title="Aja skripti kerran">
    Valitse funktiovalikosta `refreshTwiceLedgers` ja valitse **Run**. Hyväksy Googlen pyytämät oikeudet: skripti lukee taulukkoa ja kutsuu ulkoista URL-osoitetta.
  </Step>

  <Step title="Ajasta skripti">
    Avaa **Triggers** (kellokuvake) ja valitse **Add Trigger**. Valitse `refreshTwiceLedgers`, aseta tapahtumalähteeksi **Time-driven**, valitse **Day timer** ja kellonaika, ja tallenna.
  </Step>
</Steps>

Käytä tätä skriptiä:

<CodeGroup>
  ```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);
  }
  ```
</CodeGroup>

Skripti korvaa kummankin välilehden jokaisella ajolla, joten välilehdillä on aina koko jakso päivästä `FROM_DATE` tähän päivään. Kohdista kaavat, pivot-taulukot ja kaaviot välilehtiin, älä kiinteään alueeseen, koska rivimäärä kasvaa.

## Mistä tiedän, että se onnistui?

* Taulukossa on välilehdet `Revenue` ja `Payments`, ja kumpikin alkaa otsikkorivillä.
* `Revenue`-välilehden pivot-taulukko, joka summaa sarakkeen `Amount_Total` suodatettuna ehdolla `Started_In_Period` = `Yes`, täsmää hallintapaneelin **Liikevaihtoraportti**-raporttiin samalta jaksolta ja samassa valuutassa.
* Apps Script -editorin **Executions**-näkymässä on käynnistimen (trigger) aloittama valmis ajo.

## Vianetsintä ja yleiset sudenkuopat

<AccordionGroup>
  <Accordion title="Ajo epäonnistuu virheellä &#x22;export failed with 401&#x22;">
    Skriptin ominaisuus puuttuu tai siinä on vanha avain. Tarkista `TWICE_API_KEY` kohdasta **Project Settings**, ja että avain on yhä olemassa TWICE Commercessa kohdassa **Asetukset → Integraatiot ja API**.
  </Accordion>

  <Accordion title="Ajo epäonnistuu virheellä &#x22;export was truncated&#x22;">
    Jaksolla on yli 100 000 riviä. Siirrä `FROM_DATE` myöhemmäksi, tai lataa yksi välilehti vuotta kohden kutsumalla `loadLedger_` kerran kutakin vuotta varten sen omilla päivämäärillä ja välilehden nimellä.
  </Accordion>

  <Accordion title="Ajo epäonnistuu virheellä &#x22;Exceeded maximum execution time&#x22;">
    Yksi ajo saa kestää kuusi minuuttia. Lataa liikevaihtopääkirja ja maksupääkirja kahdesta eri funktiosta kahdella käynnistimellä, joiden välissä on tunti.
  </Accordion>

  <Accordion title="Päivämäärät tai summat näkyvät tekstinä">
    Välilehdelle on asetettu kaava tai muotoilu ennen latausta. Tyhjennä välilehden muotoilu ja anna skriptin kirjoittaa arvot uudelleen.
  </Accordion>
</AccordionGroup>

Google dokumentoi skriptin käyttämät kutsut sivuilla [UrlFetchApp](https://developers.google.com/apps-script/reference/url-fetch/url-fetch-app), [Properties service](https://developers.google.com/apps-script/guides/properties) ja [Installable triggers](https://developers.google.com/apps-script/guides/triggers/installable).

## Aiheeseen liittyvät artikkelit

<CardGroup cols={2} className="doc-rows-condensed">
  <Card title="Tuo datasi BI-työkaluun" href="/docs/fi/guides/reports/pull-report-data">
    Päätepisteet, tiedostomuoto ja kutsurajat.
  </Card>

  <Card title="Yhdistä Looker Studio" href="/docs/fi/guides/reports/connect-looker-studio">
    Rakenna koontinäyttöjä tämän taulukon päälle.
  </Card>

  <Card title="Yhdistä Tableau" href="/docs/fi/guides/reports/connect-tableau">
    Kohdista Tableau tähän taulukkoon.
  </Card>

  <Card title="Talousraportit" href="/docs/fi/concepts/reports/finance-reports">
    Jokainen pääkirjan sarake ja miten kukin luku muodostuu.
  </Card>
</CardGroup>
