Articole:
- Data export to Google Sheets
- Conectarea Facebook Pixel la un proiect pe Kwiga
- Sending a webhook to transfer data to another service
- Integrarea și utilizarea Zoom — noțiuni esențiale
- Generarea linkurilor de plată cu date precompletate
- Gestionarea unui clic pe un buton în widget
- Sending a webhook to KeyCRM with separation of the application and payment.
We will show you how to set up automatic data export from Kwiga to Google Sheets.
Puteți configura exportul de date pentru diverse evenimente folosind automatizarea (puteți specifica drept eveniment contact adăugat, etichetă adăugată, achiziție reușită sau eșuată etc.; lista completă de evenimente este disponibilă în articol).
În plus, puteți folosi opțiunea de a trimite un webhook atunci când utilizați widgeturi; fluxul rămâne același.
Pașii principali:
-
Creați un fișier și adăugați scriptul în el
-
Creați o aplicație web și obțineți linkul pentru trimiterea webhookului
-
Configurați trimiterea webhookului folosind automatizarea în Kwiga sau trimiterea formularului în widget.
Întregul proces este prezentat în videoclip și nu necesită cunoștințe de programare. Doar urmați pașii indicați, iar dacă ceva nu funcționează, contactați suportul.
Pasul 1: Creați un fișier în care vor fi trimise datele din Kwiga
Deschideți Google Sheets și creați un fișier nou, apoi deschideți editorul de scripturi.
Se va deschide o fereastră nouă și trebuie să lipiți scriptul în editorul acesteia. Puteți descărca scriptul prin link (sau puteți copia textul din partea de jos a articolului). Trebuie să ștergeți tot textul care este deja în editor.
Rezultatul final:
Pasul 2: Creați o aplicație web și obțineți linkul pentru trimiterea webhookului
În același editor de scripturi, găsiți butonul Deploy și selectați New deployment
Selectați Web app ca tip, iar în lista derulantă Who has access setați Everyone, apoi faceți clic pe Deploy.
Ca rezultat, veți obține Web App URL, pe care apoi trebuie să îl adăugați în Kwiga.
Pasul 3: Configurați trimiterea datelor în Kwiga
Faceți clic pe butonul All solutions din meniul de sus și selectați Automation. Creați un nou declanșator și alegeți evenimentul care va porni automatizarea. Acesta poate fi contact adăugat, etichetă adăugată, plată sau orice alt eveniment.
După aceea, derulați în jos și selectați Webhook - Send data în acțiuni. În câmpul pentru link, specificați Web App URL, tipul cererii POST și selectați câmpurile care trebuie exportate în tabel.
Salvați, iar toți pașii sunt finalizați.
Alternativ, puteți configura trimiterea webhookului din widget; aceasta este disponibilă atunci când utilizați elementul Form. Bifați opțiunea Additionally send to a third-party service, apoi în formularul care se deschide adăugați linkul, tipul cererii POST și selectați parametrii de trimis. În această listă vor fi disponibili doar parametrii care sunt prezenți în formular (acest widget).
Cum funcționează scriptul Google Sheets pentru webhook-uri
- La prima solicitare a webhook-ului, anteturile tabelului sunt create automat pe baza cheilor datelor de intrare
- Dacă tabelul are deja anteturi și trebuie să începeți să primiți câmpuri de date noi, adăugați aceste anteturi manual în tabel
- Anteturile pot fi rearanjate în tabel - scriptul va determina automat pozițiile lor
- În mod implicit, scriptul adaugă noi înregistrări la fiecare primire a webhook-ului
- Dacă specificați câmpuri în keyColumns, scriptul va actualiza înregistrările existente sau va adăuga altele noi dacă nu găsește o potrivire
- ⚠️ Important: După modificarea scriptului, este necesar să faceți o nouă implementare în Google Apps Script și să actualizați linkul către webhook
Selectarea foii de tabel:
- În mod implicit, este utilizată foaia activă
- Poate fi suprascrisă prin parametrii webhook-ului:
- "sheet_name": "Numele foii" - pentru a selecta foaia după nume
- "sheet_index": 2 - pentru a selecta foaia după număr (începând de la 1)
// ============================================================
// SETĂRI SCRIPT
// ============================================================
// Verificare duplicate - specificați câmpurile pentru căutarea înregistrărilor existente
// Exemple de utilizare:
// var keyColumns = ["email"]; - verificare după email
// var keyColumns = ["order_id"]; - verificare după ID comandă
// var keyColumns = ["email", "order_id"]; - verificare după mai multe câmpuri
var keyColumns = []; // Verificarea duplicatelor dezactivată
// ============================================================
// Funcție pentru trimiterea răspunsului
function sendResponse(success, message) {
var response = {
"status": success ? "success" : "error",
"message": message
};
return ContentService.createTextOutput(JSON.stringify(response))
.setMimeType(ContentService.MimeType.JSON);
}
// Obținerea paginii țintă pentru înregistrarea datelor
function getTargetSheet(hook_data) {
var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
// Verificăm dacă numele paginii este specificat
if (hook_data && hook_data.sheet_name) {
try {
var sheet = spreadsheet.getSheetByName(hook_data.sheet_name);
if (sheet) {
return sheet;
}
} catch (error) {
// Pagina nu a fost găsită
}
}
// Verificăm dacă numărul paginii este specificat
if (hook_data && hook_data.sheet_index && !isNaN(hook_data.sheet_index)) {
try {
var sheets = spreadsheet.getSheets();
var index = parseInt(hook_data.sheet_index) - 1; // Convertim în index de la 0
if (index >= 0 && index < sheets.length) {
return sheets[index];
}
} catch (error) {
// Index pagină incorect
}
}
// Folosim pagina activă implicit
return SpreadsheetApp.getActiveSheet();
}
// Creează anteturi în tabel pe baza datelor furnizate
function populateHeaders(hook_data, sheet) {
if (!hook_data || typeof hook_data !== 'object') {
return false;
}
if (!sheet) {
sheet = getTargetSheet(hook_data);
}
var last_row = Math.max(sheet.getLastRow(), 1);
sheet.insertRowAfter(last_row);
var headers_row = ['timestamp'];
var hook_data_keys = Object.keys(hook_data);
for (var i = 0; i < hook_data_keys.length; i++) {
headers_row.push(hook_data_keys[i]);
}
sheet.appendRow(headers_row);
SpreadsheetApp.flush();
return true;
}
// Procesarea webhook-ului de intrare
function doPost(e) {
var hook_load = null;
// Verificăm existența datelor POST
if (!e || !e.postData || !e.postData.contents) {
return sendResponse(false, "Nu există date pentru procesare");
}
// Parsam datele JSON
try {
hook_load = JSON.parse(e.postData.contents);
} catch (error) {
return sendResponse(false, "Eroare la parsarea datelor JSON");
}
// Validarea datelor primite
if (!hook_load || typeof hook_load !== 'object' || Object.keys(hook_load).length === 0) {
return sendResponse(false, "Date incorecte sau goale primite");
}
try {
// Obținem pagina țintă
var sheet = getTargetSheet(hook_load);
if (!sheet) {
return sendResponse(false, "Nu s-a putut găsi pagina specificată");
}
// Crearea anteturilor, dacă tabelul este gol
if (sheet.getLastColumn() === 0) {
populateHeaders(hook_load, sheet);
}
var headers = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues()[0];
if (headers.length === 0 || headers[0] === "") {
populateHeaders(hook_load, sheet);
headers = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues()[0];
}
// Verificare duplicate
var data = [];
var targetRow = -1;
var numRows = sheet.getLastRow() - 1;
if (keyColumns.length > 0 && numRows > 0) {
data = sheet.getRange(2, 1, numRows, sheet.getLastColumn()).getValues();
for (var r = 0; r < data.length; r++) {
var row = data[r];
var match = true;
for (var k = 0; k < keyColumns.length; k++) {
var key = keyColumns[k];
var idx = headers.indexOf(key);
if (idx === -1 || row[idx] != hook_load[key]) {
match = false;
break;
}
}
if (match) {
targetRow = r + 2; // gestionarea anteturilor
break;
}
}
}
// Pregătirea datelor pentru înregistrare
var new_sheet_row = new Array(headers.length).fill('');
for (var h = 0; h < headers.length; h++) {
var key = headers[h];
if (key === 'timestamp') {
new_sheet_row[h] = new Date();
} else if (hook_load.hasOwnProperty(key)) {
new_sheet_row[h] = hook_load[key];
}
}
// Salvarea datelor în tabel
if (targetRow > -1) {
sheet.getRange(targetRow, 1, 1, new_sheet_row.length).setValues([new_sheet_row]);
} else {
sheet.appendRow(new_sheet_row);
}
SpreadsheetApp.flush();
return sendResponse(true, "Datele au fost salvate cu succes");
} catch (error) {
return sendResponse(false, "Eroare la salvarea datelor: " + error.message);
}
}