---
title: "Google Sheets-kapcsolatok importálása Brevóba Apps Scripttel"
description: "Ismételhető Google Apps Script példa hozzájárulás-ellenőrzéssel, mezőpárosítással, leiratkozásvédelemmel és látható API-hibákkal."
url: https://tajo.io/hu/blog/import-google-sheet-contacts-to-brevo-apps-script/
markdown: https://tajo.io/hu/blog/import-google-sheet-contacts-to-brevo-apps-script.md
lang: hu-HU
author: "Set Noa"
author_url: https://tajo.io/hu/set-noa/
published: 2026-04-30
updated: 2026-10-09
alternates: {en-US: /blog/import-google-sheet-contacts-to-brevo-apps-script.md, bg-BG: /bg/blog/import-google-sheet-contacts-to-brevo-apps-script.md, cs-CZ: /cz/blog/import-google-sheet-contacts-to-brevo-apps-script.md, de-DE: /de/blog/import-google-sheet-contacts-to-brevo-apps-script.md, da-DK: /dk/blog/import-google-sheet-contacts-to-brevo-apps-script.md, es-ES: /es/blog/import-google-sheet-contacts-to-brevo-apps-script.md, fr-FR: /fr/blog/import-google-sheet-contacts-to-brevo-apps-script.md, el-GR: /gr/blog/import-google-sheet-contacts-to-brevo-apps-script.md, hi-IN: /hi/blog/import-google-sheet-contacts-to-brevo-apps-script.md, id-ID: /in/blog/import-google-sheet-contacts-to-brevo-apps-script.md, hr-HR: /hr/blog/import-google-sheet-contacts-to-brevo-apps-script.md, it-IT: /it/blog/import-google-sheet-contacts-to-brevo-apps-script.md, ja-JP: /jp/blog/import-google-sheet-contacts-to-brevo-apps-script.md, ko-KR: /kr/blog/import-google-sheet-contacts-to-brevo-apps-script.md, ar-SA: /ar/blog/import-google-sheet-contacts-to-brevo-apps-script.md, nl-NL: /nl/blog/import-google-sheet-contacts-to-brevo-apps-script.md, no-NO: /no/blog/import-google-sheet-contacts-to-brevo-apps-script.md, pl-PL: /pl/blog/import-google-sheet-contacts-to-brevo-apps-script.md, pt-BR: /pt/blog/import-google-sheet-contacts-to-brevo-apps-script.md, ro-RO: /ro/blog/import-google-sheet-contacts-to-brevo-apps-script.md, ru-RU: /ru/blog/import-google-sheet-contacts-to-brevo-apps-script.md, sv-SE: /se/blog/import-google-sheet-contacts-to-brevo-apps-script.md, zh-CN: /zh-cn/blog/import-google-sheet-contacts-to-brevo-apps-script.md, sl-SI: /sl/blog/import-google-sheet-contacts-to-brevo-apps-script.md, sr-Latn-RS: /sr/blog/import-google-sheet-contacts-to-brevo-apps-script.md, th-TH: /th/blog/import-google-sheet-contacts-to-brevo-apps-script.md, tr-TR: /tr/blog/import-google-sheet-contacts-to-brevo-apps-script.md, ur-PK: /ur/blog/import-google-sheet-contacts-to-brevo-apps-script.md, vi-VN: /vi/blog/import-google-sheet-contacts-to-brevo-apps-script.md, sk-SK: /sk/blog/import-google-sheet-contacts-to-brevo-apps-script.md}
---

[Adatszinkronizálás](https://tajo.io/hu/blog/?category=data-sync)

# Google Sheets-kapcsolatok importálása Brevóba Apps Scripttel

Ismételhető Google Apps Script példa hozzájárulás-ellenőrzéssel, mezőpárosítással, leiratkozásvédelemmel és látható API-hibákkal.

google apps script brevo

Hogyan szinkronizálhatók a Google Sheets névjegyei a Brevóval?

Hozz létre email, firstName, lastName és consent oszlopokat. Tedd a BREVO\_API\_KEY értékét a Script Properties közé, állítsd be a lista ID-jét, majd futtasd a syncSheetToBrevo függvényt. Csak a hozzájárult sorokat veszi figyelembe, ellenőrzi a Brevo leiratkozásait, kiszűri a duplikátumokat és API-hibánál megáll. Ez saját kezelésű Apps Script, nem beépített csatlakozó.

[Tudjon meg többet](https://tajo.io/hu/blog/import-google-sheet-contacts-to-brevo-apps-script/#k%C3%A9sz%C3%ADtsd-el%C5%91-a-t%C3%A1bl%C3%A1t-%C3%A9s-a-list%C3%A1t)

| Forrásmező | Célmező | Mintaérték |
| --- | --- | --- |
| `email` | `email` | `alex@example.com` |
| `firstName` | `FNAME` | `Alex` |
| `lastName` | `LNAME` | `Example` |

Egy tucat rendezvényes jelentkezőt könnyű egyszer exportálni. Második alkalommal egy cím duplán szerepelhet, egy másik személy pedig már leiratkozott a Brevóban. Az ismételhető importnak mindkettőt fel kell ismernie.

A szkript a [Brevo kapcsolatolvasó, -létrehozó és -frissítő végpontjait](https://developers.brevo.com/reference/create-contact) használja. Kicsi, időzített importhoz való, nem tömeges betöltő vagy beépített Google Sheets-csatlakozó. Nem küld e-mailt. A hozzájárulás bizonyítékáért és az üzemeltetésért te felelsz.

## Készítsd elő a táblát és a listát

Hozz létre `Contacts` lapot pontosan ezekkel a fejlécekkel. A `consent` oszlopban csak akkor legyen `TRUE`, ha az adott marketingcélra van hozzájárulás.

| email | firstName | lastName | consent |
| --- | --- | --- | --- |
| [jane@example.com](mailto:jane@example.com) | Jane | Doe | TRUE |
| [alex@example.com](mailto:alex@example.com) | Alex | Lee | FALSE |

Hozz létre vagy válassz Brevo-listát, és a számszerű azonosítóját írd a `LIST_ID` mezőbe. A `FNAME` és `LNAME` attribútumoknak létezniük kell; a példa csak ezeket párosítja. A hozzájárulás idejét és módját bizonyító forrást külön őrizd meg, ha a tábla nem tartalmazza. A `TRUE` cella önmagában nem bizonyíték.

Az **Extensions → Apps Script → Project Settings → Script Properties** helyen add hozzá a `BREVO_API_KEY` értéket. A tulajdonságok a szkript felhasználói számára közösek, ezért korlátozd a szerkesztést. Ne tedd a kulcsot cellába vagy forráskódba. Lásd [Google hozzáférési szabályait](https://developers.google.com/apps-script/guides/properties).

## A szkript

Cseréld le a `Code.gs` tartalmát erre, és az első futás előtt állítsd be a `LIST_ID` értékét.

```javascript
const LIST_ID = 42; // Replace with your existing Brevo list ID.
const TAB = 'Contacts';
const BASE = 'https://api.brevo.com/v3';

function syncSheetToBrevo() {
  const key = PropertiesService.getScriptProperties().getProperty('BREVO_API_KEY');
  if (!key) throw new Error('Set BREVO_API_KEY in Script Properties first');
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(TAB);
  if (!sheet) throw new Error('Contacts tab missing');
  const values = sheet.getDataRange().getValues();
  const headers = values.shift().map(h => String(h).trim());
  const columns = ['email', 'firstName', 'lastName', 'consent']
    .map(name => headers.indexOf(name));
  if (columns.includes(-1)) throw new Error('Required header missing');
  const [emailCol, firstCol, lastCol, consentCol] = columns;
  const seen = new Set();
  const result = { written: 0, skipped: 0 };

  for (const row of values) {
    const email = String(row[emailCol] || '').trim().toLowerCase();
    if (row[consentCol] !== true || !/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email) || seen.has(email)) {
      result.skipped++;
      continue;
    }
    seen.add(email);
    const path = '/contacts/' + encodeURIComponent(email);
    const current = brevo_(key, path, 'get');
    if (current.code !== 200 && current.code !== 404) {
      throw new Error(`Contact read failed (${current.code}) for row ${result.written + result.skipped + 2}`);
    }
    if (current.code === 200) {
      const contact = JSON.parse(current.text);
      if (contact.emailBlacklisted || (contact.listUnsubscribed || []).includes(LIST_ID)) {
        result.skipped++;
        continue;
      }
    }
    const attributes = {};
    if (row[firstCol] !== '') attributes.FNAME = String(row[firstCol]);
    if (row[lastCol] !== '') attributes.LNAME = String(row[lastCol]);
    const body = { attributes, listIds: [LIST_ID] };
    const saved = current.code === 404
      ? brevo_(key, '/contacts', 'post', { email, ...body })
      : brevo_(key, path, 'put', body);
    if (![201, 204].includes(saved.code)) {
      throw new Error(`Contact write failed (${saved.code}) for ${email}: ${saved.text.slice(0, 200)}`);
    }
    result.written++;
  }
  Logger.log(JSON.stringify(result));
  return result;
}

function brevo_(key, path, method, body) {
  for (let attempt = 0; attempt < 3; attempt++) {
    const response = UrlFetchApp.fetch(BASE + path, {
      method,
      contentType: 'application/json',
      headers: { 'api-key': key },
      payload: body ? JSON.stringify(body) : undefined,
      muteHttpExceptions: true,
    });
    const code = response.getResponseCode();
    if (code !== 429) return { code, text: response.getContentText() };
    if (attempt === 2) return { code, text: response.getContentText() };
    const reset = Object.entries(response.getHeaders()).find(
      ([name]) => name.toLowerCase() === 'x-sib-ratelimit-reset'
    );
    const raw = Number(reset && reset[1]);
    const seconds = Number.isFinite(raw) && raw > 0 ? raw : 2 ** attempt;
    const waitSeconds = seconds + 2 ** attempt;
    if (waitSeconds > 60) return { code, text: response.getContentText() };
    Utilities.sleep(waitSeconds * 1000);
  }
}
```

Mentsd el, válaszd a `syncSheetToBrevo` függvényt, majd kattints a **Run** gombra. Google engedélyt kér a táblához és külső kérésekhez. Az **Executions** nézetben keresd a `{written, skipped}` naplót. A 404-es olvasás létrehozáshoz, a 200-as frissítéshez vezet; más hiba megállítja a futást. A sikeres kapcsolatírás nem jelent kampányküldést.

A szkript egy futáson belül kiszűri az ismétlődő címeket, a következő futásban pedig újra lekérdezi a Brevót. Nem állítja az `emailBlacklisted` értékét `false`-ra és nem módosít címet. Globális tiltás vagy a cél-listáról való leiratkozás esetén a sort `TRUE` mellett is kihagyja. Ne használd leiratkozás visszavonására. [A Brevo szerint](https://developers.brevo.com/reference/update-contact) a blokkolt kapcsolat címének cseréje feloldhatja a blokkolást.

## Egy futás ellenőrzése időzítés előtt

Használj saját tesztlistát és tesztkapcsolatokat. Egy `TRUE`, egy `FALSE` és egy duplikált címmel egy írás és két kihagyás várható. Iratkoztasd le a tesztkapcsolatot, majd futtasd újra: hozzá nem tartozhat új írás. Hibateszthez ideiglenesen adj meg érvénytelen `LIST_ID` értéket, ellenőrizd a HTTP-hibát az **Executions** nézetben, állítsd vissza és ismételd meg. Ne tesztelj valódi ügyfélrekordokon. A cikk kódját helyben, mock Brevo-válaszokkal ellenőriztük, élő írás nélkül.

Az **Apps Script → Triggers → Add Trigger** menüben időzítsd a `syncSheetToBrevo` függvényt. [A triggerek a létrehozó fiókjában futnak](https://developers.google.com/apps-script/guides/triggers/installable), amelynek meg kell tartania a táblához való hozzáférést. Kis táblánál indulj napi futással és nézd a hibákat. Google [korlátozza a futási időt és az URL Fetch használatát](https://developers.google.com/apps-script/guides/services/quotas); nagy forrásokat bonts korlátozott feladatokra.

A 429 után a szkript a `x-sib-ratelimit-reset` alapján legfeljebb kétszer próbálkozik. Ha a szükséges várakozás 60 másodpercnél hosszabb, 429-cel megáll egy későbbi futásig. Más hibánál is megáll, majd a következő futás elölről kezd. A kapcsolat az olvasás és írás között leiratkozhat; a példa csak akkor megfelelő, ha ez a szűk versenyablak elfogadható. Szigorúbb védelemhez eseményegyeztetés, megbízható hozzájárulási tár és küldés előtti utolsó ellenőrzés kell.

Nagy táblákhoz a [Brevo aszinkron importja](https://developers.brevo.com/reference/import-contacts) `processId` értéket ad. Ez a feladat elfogadása, nem a befejezése. Az eredményt külön ellenőrizd. A kapcsolatonkénti példa a hibát a megfelelő sornál mutatja meg.

## Gyakran Ismételt Kérdések

**Kell beépített Google Sheets-csatlakozó?**

Nem. A példa a táblához kötött Apps Script projektben fut és a Brevo kapcsolati API-ját hívja. Te tartod fenn a szkriptet, a kulcsot és az időzített triggert.

**Mely sorok kerülnek a Brevóba?**

Csak azok, ahol a consent TRUE és az e-mail cím érvényes. A szkript futásonként deduplikál, majd írás előtt lekérdezi a Brevót.

**Újra feliratkoztat egy leiratkozott kapcsolatot?**

A Brevo által emailBlacklisted jelzésű vagy a cél-listáról leiratkozott kapcsolatot kihagyja. Nem küld emailBlacklisted: false értéket, és nem módosítja az e-mail címet. Éles használat előtt más tiltási és hozzájárulási forrásokat is ellenőrizz.

**Hogyan ismételjek meg egy hibás futást?**

Olvasd el az Apps Script végrehajtási hibáját, javítsd az okot, majd futtasd újra ugyanazt a függvényt. A cím és lista ID ugyanaz marad, ezért egy korábban sikeres sor nem hoz létre második kapcsolatot.

## Kapcsolódó cikkek

### [Hogyan importálj CSV vagy Excel kapcsolatokat a Brevóba script segítségével (Python, Node.js, cURL)](https://tajo.io/hu/blog/import-csv-contacts-to-brevo-with-a-script/)

2026\. ápr. 30. · 5 perc olvasás

CSV → Brevo

### [Hogyan küldd át az Excel kapcsolatokat a Brevóba VBA makróval (és az Office Scripts alternatíva)](https://tajo.io/hu/blog/import-excel-contacts-to-brevo-with-vba-macro/)

2026\. ápr. 30. · 6 perc olvasás

Microsoft Excel → Brevo

### [Brevo-integrációk: válasszon ellenőrizhető kapcsolatot](https://tajo.io/hu/blog/brevo-connector-guide/)

2026\. aug. 19. · 4 perc olvasás

6 szakasz
