---
title: "Импорт на контакти от Google Sheets в Brevo с Apps Script"
description: "Повторяем пример с Google Apps Script: проверка на съгласие, съпоставяне на полета, запазване на откази и видими грешки на API."
url: https://tajo.io/bg/blog/import-google-sheet-contacts-to-brevo-apps-script/
markdown: https://tajo.io/bg/blog/import-google-sheet-contacts-to-brevo-apps-script.md
lang: bg-BG
author: "Set Noa"
author_url: https://tajo.io/bg/set-noa/
published: 2026-04-30
updated: 2026-10-09
alternates: {en-US: /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, hu-HU: /hu/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}
---

[Синхронизация на данни](https://tajo.io/bg/blog/?category=data-sync)

# Импорт на контакти от Google Sheets в Brevo с Apps Script

Повторяем пример с Google Apps Script: проверка на съгласие, съпоставяне на полета, запазване на откази и видими грешки на API.

google apps script brevo

Как да синхронизирате контакти от Google Sheets с Brevo?

Добавете колони email, firstName, lastName и consent в таблицата. Задайте BREVO\_API\_KEY в свойствата на скрипта и ID на списъка в кода, после стартирайте syncSheetToBrevo. Скриптът обработва само редове със съгласие, проверява отказите в Brevo, премахва дубликати и спира при грешка на API. Това е Apps Script, който Вие поддържате, не вграден конектор.

[Научете повече](https://tajo.io/bg/blog/import-google-sheet-contacts-to-brevo-apps-script/#%D0%BF%D0%BE%D0%B4%D0%B3%D0%BE%D1%82%D0%B2%D0%B5%D1%82%D0%B5-%D1%82%D0%B0%D0%B1%D0%BB%D0%B8%D1%86%D0%B0%D1%82%D0%B0-%D0%B8-%D1%81%D0%BF%D0%B8%D1%81%D1%8A%D0%BA%D0%B0)

| Поле източник | Целево поле | Примерна стойност |
| --- | --- | --- |
| `email` | `email` | `alex@example.com` |
| `firstName` | `FNAME` | `Alex` |
| `lastName` | `LNAME` | `Example` |

Таблица с дванадесет регистрации за събитие се експортира лесно веднъж. При втория импорт един адрес се повтаря, а друг човек вече се е отписал в Brevo. Повторяемият импорт трябва да разпознае и двете ситуации.

Скриптът използва [крайните адреси на Brevo за четене, създаване и обновяване на контакти](https://developers.brevo.com/reference/create-contact). Той е за малки планирани импорти, не за масово зареждане или като вграден конектор за Google Sheets. Не изпраща имейли. Вие отговаряте за доказателството за съгласие и работата на скрипта.

## Подгответе таблицата и списъка

Създайте раздел `Contacts` с точно тези заглавия. Използвайте квадратчета за `consent` и поставяйте `TRUE` само при съгласие за предвидения маркетинг.

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

Създайте или изберете списък в Brevo и въведете числовия му ID в `LIST_ID`. Проверете дали атрибутите `FNAME` и `LNAME` съществуват в Brevo. Само те се съпоставят. Пазете отделно доказателство кога и как е дадено съгласието, ако таблицата не може да го установи. Клетка `TRUE` сама по себе си не е доказателство.

В **Разширения → Apps Script → Настройки на проекта → Свойства на скрипта** добавете `BREVO_API_KEY`. Свойствата се споделят между потребителите на скрипта, затова ограничете правото за редактиране. Не поставяйте ключа в клетка или код. Вижте [правилата за достъп на Google](https://developers.google.com/apps-script/guides/properties).

## Скриптът

Заменете `Code.gs` с примера и настройте `LIST_ID` преди първото изпълнение.

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

Запазете, изберете `syncSheetToBrevo` и натиснете **Изпълни**. Google ще поиска достъп до Sheets и външни заявки. В **Изпълнения** вижте крайния запис `{written, skipped}`. Отговор 404 при четене води до създаване на контакт, 200 до обновяване. Други грешки спират изпълнението. Успешният запис потвърждава заявката за контакт, не изпращане на кампания.

Скриптът премахва повторените адреси в едно изпълнение и пита Brevo отново при следващото. Никога не задава `emailBlacklisted` като `false` и не променя имейла. Ако Brevo отчете блокиране или отписване от списъка, редът се пропуска дори при `TRUE`. Не използвайте скрипта за отмяна на отписване. [Brevo предупреждава](https://developers.brevo.com/reference/update-contact), че смяна на адреса на блокиран контакт може да премахне блокирането.

## Проверете едно изпълнение преди график

Използвайте тестов списък и контакти под Ваш контрол. Стартирайте с един ред `TRUE`, един `FALSE` и повторен адрес: очаквайте един запис и два пропуснати реда. Отпишете тестовия контакт в Brevo и повторете: за него не трябва да има запис. За проверка на грешка задайте временно невалиден `LIST_ID`, вижте HTTP грешката в **Изпълнения**, възстановете ID и опитайте пак. Не тествайте с реални клиентски данни. Кодът е проверен локално и със симулирани отговори на Brevo, без реален запис.

За график отворете **Apps Script → Тригери → Добави тригер**, изберете `syncSheetToBrevo` и времеви интервал. [Тригерите работят с акаунта на създателя](https://developers.google.com/apps-script/guides/triggers/installable); той трябва да запази достъп до таблицата. За малка таблица започнете всекидневно и преглеждайте грешките. Google [ограничава времето за изпълнение и URL Fetch заявките](https://developers.google.com/apps-script/guides/services/quotas); разделете големите източници на ограничени задачи.

При 429 скриптът чете `x-sib-ratelimit-reset` и опитва най-много още два пъти. Ако нужното изчакване надхвърля 60 секунди, връща 429 за по-късно изпълнение. Другите грешки спират работата; следващото изпълнение започва отначало. Контакт може да се отпише между четенето и записа. Използвайте примера само ако краткият прозорец е приемлив. По-строги гаранции изискват съгласуване по събития, надежден източник на съгласие и последна проверка преди изпращане.

За големи таблици [асинхронният краен адрес за импорт на Brevo](https://developers.brevo.com/reference/import-contacts) връща `processId`. Това потвърждава приемане на задачата, не завършване. Проверете резултата преди да отчетете успех. Пътят по отделни контакти показва грешката при съответния ред.

## Често Задавани Въпроси

**Нужен ли е вграден конектор за Google Sheets?**

Не. Примерът работи в проект Google Apps Script, свързан с таблицата, и извиква API за контакти на Brevo. Вие поддържате скрипта, API ключа и планирания тригер.

**Кои редове се изпращат към Brevo?**

Само тези с TRUE в consent и валиден имейл адрес. Скриптът премахва дубликатите при всяко изпълнение и проверява Brevo преди запис.

**Ново изпълнение записва ли отново отказал се контакт?**

Скриптът пропуска контакти, които Brevo обозначава като emailBlacklisted или отписани от целевия списък. Никога не изпраща emailBlacklisted: false и не променя имейла. Преди продукция проверете и други източници на съгласие.

**Как да повторя неуспешно изпълнение?**

Прочетете грешката в изпълненията на Apps Script, отстранете причината и стартирайте същата функция отново. Записите използват същия адрес и ID на списъка, затова успешно обработен ред не създава втори контакт.

## Свързани статии

### [Как да импортирате контакти от CSV или Excel в Brevo чрез скрипт (Python, Node.js, cURL)](https://tajo.io/bg/blog/import-csv-contacts-to-brevo-with-a-script/)

30.04.2026 г. · 5 мин четене

CSV → Brevo

### [Как да изпратите Excel контакти в Brevo с VBA макрос (и алтернативата с Office Scripts)](https://tajo.io/bg/blog/import-excel-contacts-to-brevo-with-vba-macro/)

30.04.2026 г. · 7 мин четене

Microsoft Excel → Brevo

### [Интеграции с Brevo: изберете връзка, която можете да проверите](https://tajo.io/bg/blog/brevo-connector-guide/)

19.08.2026 г. · 4 мин четене

6 раздела
