Apps Script से Google Sheets कॉन्टैक्ट Brevo में आयात करें

बार-बार चल सकने वाला Apps Script उदाहरण जो सहमति जांचता है, फ़ील्ड मैप करता है, अनसब्सक्राइब बचाता है और API त्रुटि दिखाता है।

google apps script brevo

Sheets से Brevo में संपर्क कैसे लाएं?

Sheet में email, firstName, lastName और consent कॉलम जोड़ें। BREVO_API_KEY को Script Properties में रखें, कोड में लिस्ट ID दें और syncSheetToBrevo चलाएं। केवल सहमति वाले रिकॉर्ड लिए जाते हैं; स्क्रिप्ट Brevo की अनसब्सक्राइब स्थिति जांचती है, डुप्लिकेट हटाती है और API त्रुटि पर रुकती है। यह आपका रखा हुआ Apps Script है, बिल्ट-इन कनेक्टर नहीं।

और जानें
इस पेज पर

उदाहरण · सैंपल डेटा

सिंक का उदाहरण

एक रिकॉर्ड जाँचें

स्रोत

Google Sheets

कनेक्टर की स्थिति: नियोजित

गंतव्य

Brevo

कनेक्टर की स्थिति: सक्रिय

स्रोत फ़ील्डगंतव्य फ़ील्डनमूना मान
email email [email protected]
firstName FNAME Alex
lastName LNAME Example
  1. ड्राफ़्ट
  2. एक रिकॉर्ड जाँचें
  3. यह वर्ज़न मंज़ूर करें

स्थिति हर कनेक्टर की अलग है; इससे यह सिंक तैयार होने की गारंटी नहीं मिलती। ये फ़ील्ड केवल उदाहरण हैं। सिंक चलने से पहले असली स्कीमा और अनुमतियाँ जाँचें।

किसी इवेंट के बारह पंजीकरण एक बार एक्सपोर्ट करना आसान है। दूसरी बार एक ईमेल दोहर सकता है और कोई दूसरा व्यक्ति Brevo में अनसब्सक्राइब हो चुका हो सकता है। दोहराए जा सकने वाले आयात को दोनों बातें देखनी चाहिए।

स्क्रिप्ट Brevo के कॉन्टैक्ट पढ़ने, बनाने और अपडेट करने वाले एंडपॉइंट इस्तेमाल करती है। यह छोटे तय आयात के लिए है, बल्क लोडर या बिल्ट-इन Google Sheets कनेक्टर नहीं। ईमेल नहीं भेजती। सहमति का प्रमाण और स्क्रिप्ट चलाना आपकी जिम्मेदारी है।

Sheet और लिस्ट तैयार करें

Contacts टैब में ठीक ये हेडर बनाएं। consent में चेकबॉक्स रखें और तय मार्केटिंग उपयोग के लिए अनुमति होने पर ही TRUE सेट करें।

emailfirstNamelastNameconsent
[email protected]JaneDoeTRUE
[email protected]AlexLeeFALSE

Brevo लिस्ट चुनें या बनाएं और उसकी संख्यात्मक ID को LIST_ID में डालें। Brevo में FNAME और LNAME एट्रिब्यूट होने चाहिए; केवल यही मैप होते हैं। Sheet में सहमति का समय और तरीका साबित न हो तो स्रोत रिकॉर्ड अलग रखें। TRUE सेल अपने आप प्रमाण नहीं है।

Extensions → Apps Script → Project Settings → Script Properties में BREVO_API_KEY जोड़ें। गुण स्क्रिप्ट उपयोगकर्ताओं में साझा होते हैं, इसलिए संपादन सीमित रखें। की को सेल या कोड में न रखें। Google के एक्सेस नियम देखें।

स्क्रिप्ट

Code.gs को इस उदाहरण से बदलें और पहले रन से पहले LIST_ID सेट करें।

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 चुनें और Run दबाएं। Google, Sheets और बाहरी अनुरोध की अनुमति पूछेगा। Executions में {written, skipped} लॉग देखें। पढ़ने पर 404 मिले तो नया कॉन्टैक्ट, 200 मिले तो अपडेट; बाकी त्रुटि पर रन रुकता है। कॉन्टैक्ट राइट सफल होने का मतलब अभियान भेजना नहीं है।

स्क्रिप्ट एक रन में दोहराए ईमेल हटाती है और अगले रन में Brevo फिर जांचती है। यह emailBlacklisted को false नहीं करती और पता नहीं बदलती। Brevo अगर वैश्विक ब्लॉक या लक्ष्य लिस्ट से अनसब्सक्राइब बताए, तो Sheet में TRUE होने पर भी पंक्ति छोड़ दी जाती है। इसे अनसब्सक्राइब पलटने के लिए न चलाएं। Brevo बताता है कि ब्लॉक कॉन्टैक्ट का पता बदलने से ब्लॉक हट सकता है।

शेड्यूल से पहले एक रन जांचें

अपनी टेस्ट लिस्ट और कॉन्टैक्ट लें। एक TRUE, एक FALSE और एक दोहराए ईमेल से एक राइट और दो स्किप अपेक्षित हैं। टेस्ट कॉन्टैक्ट को Brevo में अनसब्सक्राइब करके फिर चलाएं: उस पर राइट नहीं होनी चाहिए। त्रुटि जांचने के लिए अस्थायी गलत LIST_ID दें, Executions में HTTP त्रुटि देखें, ID वापस रखें और दोहराएं। असली ग्राहक डेटा पर टेस्ट न करें। कोड स्थानीय रूप से नकली Brevo रिस्पॉन्स पर जांचा गया है, कोई लाइव राइट नहीं।

Apps Script → Triggers → Add Trigger में syncSheetToBrevo और समय अंतराल चुनें। ट्रिगर बनाने वाले के अकाउंट से चलता है, जिसे Sheet की पहुंच बनी रहनी चाहिए। छोटे Sheet पर रोज एक बार शुरू करें और त्रुटियां देखें। Google रन समय और URL Fetch उपयोग सीमित करता है; बड़े स्रोत को सीमित कार्यों में बांटें।

429 पर स्क्रिप्ट x-sib-ratelimit-reset पढ़कर अधिकतम दो बार फिर कोशिश करती है। जरूरी प्रतीक्षा 60 सेकंड से अधिक हो तो अगली बार के लिए 429 लौटा देती है, जल्दी रिट्राई नहीं करती। अन्य त्रुटि भी रन रोकती है; अगली बार शुरुआत से चलता है। पढ़ने और लिखने के बीच कॉन्टैक्ट अनसब्सक्राइब हो सकता है। यह छोटा अंतर स्वीकार हो तभी उदाहरण लें। ज्यादा सख्त सुरक्षा में इवेंट मिलान, भरोसेमंद सहमति स्रोत और भेजने से पहले अंतिम जांच चाहिए।

बड़े Sheet के लिए Brevo का असिंक्रोनस आयात processId देता है। यह कार्य स्वीकार होने का संकेत है, पूरा होने का नहीं। सफलता बताने से पहले नतीजा जांचें। यहां हर कॉन्टैक्ट का रास्ता त्रुटि वाली पंक्ति दिखाता है।

अक्सर पूछे जाने वाले प्रश्न

क्या बिल्ट-इन Google Sheets कनेक्टर चाहिए?

नहीं। उदाहरण Sheet से जुड़े Apps Script प्रोजेक्ट में चलता है और Brevo कॉन्टैक्ट API कॉल करता है। स्क्रिप्ट, API की और तय ट्रिगर आप संभालते हैं।

कौन-सी पंक्तियां Brevo भेजी जाती हैं?

केवल consent TRUE और वैध ईमेल वाली। स्क्रिप्ट हर रन में डुप्लिकेट हटाती है और लिखने से पहले Brevo जांचती है।

फिर चलाने पर अनसब्सक्राइब व्यक्ति वापस जुड़ जाएगा?

स्क्रिप्ट Brevo में emailBlacklisted या लक्ष्य लिस्ट से अनसब्सक्राइब कॉन्टैक्ट छोड़ती है। यह emailBlacklisted: false नहीं भेजती और ईमेल नहीं बदलती। प्रोडक्शन से पहले अन्य सहमति और ब्लॉक स्रोत जांचें।

असफल रन कैसे दोहराएं?

Apps Script Executions में त्रुटि पढ़ें, वजह सुधारें और वही फ़ंक्शन फिर चलाएं। समान ईमेल और लिस्ट ID से पहले सफल पंक्ति नया कॉन्टैक्ट नहीं बनाती।

अर्ली एक्सेस का अनुरोध करें

अपना पहला नाम और कार्यस्थल का ईमेल पता दर्ज करें। Tajo एक्सेस अनुरोध की पुष्टि के लिए हम आपको एक लिंक ईमेल करेंगे।

Brevo प्राप्त करें

यह पेज Markdown में: import-google-sheet-contacts-to-brevo-apps-script.md

Markdown लोड हो रहा है…
Claude में खोलें ChatGPT में खोलें