Способ передачи заявок с сайта в Google Таблицы (Google Sheets) и затем в Google Analytics 4, используя Measurement Protocol.
Вы наверное знаете уже эту реализацию от Якова, статья подробно описывает способ с примерами кодов для HTML-тегов и функций для пользовательских переменных. Реализация использует тег типа Пользовательское изображение и как по мне не всегда удобно прописывать переменные.
В моей реализации я изменил и переписал код для отправки данных в Google Таблицы, переписал код для отправки оффлайн событий через Measurement Protocol в Google Analytics 4.
Посмотрите мое видео руководство как использовать данный метод:
Материал который вам понадобится:
1. Код для вставки в тег типа Пользовательский HTML в Google Tag Manager:
// Разрешенный URL var allowedUrl = {{Domen}}; // Заменить на домен // Замените URL на URL вашего веб-хука Google Apps Script var url = {{Веб Хук Google Sheets}}; // Проверка разрешенного URL if (document.location.host !== allowedUrl) { console.error('Недопустимый источник запроса. Доступ запрещен.'); } else { // Замените эти данные на те, которые вы хотите отправить var dataToSend = { "Date": {{Date}}, "Name": {{All_Form_Name_gra}}, "Email": {{All_Form_Email_gra}}, "Phone": {{All_Form_Phone_gra}}, "timestamp": {{timestamp_micros GA4}}, "Site": {{Site}}, "utm-source": {{utm-source}}, "utm-medium": {{utm-medium}}, "utm-campaign": {{utm-campaign}}, "utm-content": {{utm-content}}, "utm-term": {{utm-term}}, "client_id": {{Client id GA4}}, "engagement_time": {{engagement_time_msec GA4}}, "session_id": {{session ID GA4}}, "gclid": {{gclid GA4}} }; // Опции для HTTP-запроса var requestOptions = { method: 'POST', headers: { 'Content-Type': 'application/json' }, mode: 'no-cors', // Добавляем эту опцию body: JSON.stringify(dataToSend) }; // Отправка HTTP-запроса fetch(url, requestOptions) .then(function(response) { return response.text(); }) .then(function(result) { console.log('Запрос успешно отправлен:', result); }) .catch(function(error) { console.error('Ошибка отправки запроса:', error); }); }
Ключи и значения вы можете подстраивать под себя, как я рассказываю в видео
2. Код для вставки в Google Таблицы Apps Script (для входа данных)
// Вставить название Листа var SHEET_NAME = "Sheet1"; // Вставить ваш ID Sheets var SHEET_KEY = "test"; function doPost(e) { var lock = LockService.getScriptLock(); lock.waitLock(30000); try { var jsonString = e.postData.contents; var jsonData = JSON.parse(jsonString); var doc = SpreadsheetApp.openById(SHEET_KEY); var sheet = doc.getSheetByName(SHEET_NAME); var lastRowWithData = sheet.getLastRow(); var headers = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues()[0]; // Ищем первую пустую строку, начиная с строки номер 2 var firstEmptyRow = 2; while (firstEmptyRow <= lastRowWithData && sheet.getRange(firstEmptyRow, 1).getValue() != "") { firstEmptyRow++; } // Добавляем данные в первую пустую строку for (var j = 0; j < headers.length; j++) { if (headers[j] in jsonData) { sheet.getRange(firstEmptyRow, j + 1).setValue(jsonData[headers[j]]); } } } catch (e) { return ContentService.createTextOutput(JSON.stringify({ "result": "error", "error": e })).setMimeType(ContentService.MimeType.JSON); } finally { lock.releaseLock(); } return ContentService.createTextOutput("Данные успешно добавлены в таблицу.").setMimeType(ContentService.MimeType.TEXT); }
Укажите правильно название листа и айди вашего sheets из URL.
3. Код для вставки в Google Таблицы Apps Script (для отправки оффлайн событий в Google Analytics 4)
var DATE_COLUMN = 1; var NAME_COLUMN = 2; var SITE_COLUMN = 3; var PHONE_COLUMN = 4; var EMAIL_COLUMN = 5; var UTM_SOURCE_COLUMN = 6; var UTM_MEDIUM_COLUMN = 7; var UTM_CAMPAIGN_COLUMN = 8; var UTM_TERM_COLUMN = 9; var UTM_CONTENT_COLUMN = 10; var CID_COLUMN = 11; var TIM_ID_COLUMN = 12; var ETM_COLUMN = 13; var SID_COLUMN = 14; var STATUS_COLUMN = 16; var GLID_COLUMN = 15; function onDropdownChange(e) { var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); // Получаем активный лист var lastRow = sheet.getLastRow(); var row = e.range.rowStart; if ((sheet.getName() == 'Sheet1') && (e.range.columnStart == STATUS_COLUMN) && ((row > 1) || (row < lastRow + 1))) { var date = sheet.getRange(row, DATE_COLUMN).getValue(); var name = sheet.getRange(row, NAME_COLUMN).getValue(); var site = sheet.getRange(row, SITE_COLUMN).getValue(); var phone = sheet.getRange(row, PHONE_COLUMN).getValue(); var email = sheet.getRange(row, EMAIL_COLUMN).getValue(); var utm_source = sheet.getRange(row, UTM_SOURCE_COLUMN).getValue(); var utm_medium = sheet.getRange(row, UTM_MEDIUM_COLUMN).getValue(); var utm_campaign = sheet.getRange(row, UTM_CAMPAIGN_COLUMN).getValue(); var utm_term = sheet.getRange(row, UTM_TERM_COLUMN).getValue(); var utm_content = sheet.getRange(row, UTM_CONTENT_COLUMN).getValue(); var cid = sheet.getRange(row, CID_COLUMN).getValue(); var tim = sheet.getRange(row, TIM_ID_COLUMN).getValue(); var etm = sheet.getRange(row, ETM_COLUMN).getValue(); var sid = sheet.getRange(row, SID_COLUMN).getValue(); var status = e.value; var glid = sheet.getRange(row, GLID_COLUMN).getValue(); // Введите ваше название События var event_name = 'Lead_CRM'; // Введите ваш Measurement ID (G-XXXXXXXXXX) var measurement_id = 'G-'; // Введите ваш API Secret var api_secret = 'API'; var url = 'https://www.google-analytics.com/mp/collect?api_secret=' + api_secret + '&measurement_id=' + measurement_id; // Можете добавить и менять параметры var payload = { 'client_id': cid, 'timestamp_micros': parseInt(tim), 'non_personalized_ads': true, 'events': [{ 'name': event_name, 'params': { 'status': status, 'engagement_time_msec': etm, 'session_id': sid, 'utm_source': utm_source, 'utm_medium': utm_medium, 'utm_campaign': utm_campaign, 'utm_content': utm_content, 'utm_term': utm_term, 'name': name, 'site': site, 'date': date, 'phone': phone, 'email': email, 'glid': glid }, }], }; var options = { 'method': 'POST', 'payload': JSON.stringify(payload) }; try { var response = UrlFetchApp.fetch(url, options); Logger.log(response); SpreadsheetApp.getUi().alert('Событие передано' + response.getResponseCode()); } catch (e) { Logger.log('Ошибка: ' + e); } } }
Не забудьте:
- в коде указать идентификатор вашего потока G-
- сгенерировать API Key для Measurement Protocol
- указать название вашего листа
После этого создаем веб-приложение, по факту веб хук и вставляем его в переменную Веб Хук Google Sheets.
Формировать Payload для передачи в Params, я лично использую этот инструмент.
Возможно в видео я не показал все возможности данной реализации, это чтобы вы могли проводить свои эксперименты.
Если у вас не хватает времени или желания делать столько переменных или тегов как у меня, вы можете приобрести готовый шаблон для GTM, заполнив форму ниже.
[Шаблон Google Tag Manager] Заявки с сайта в Google Таблицы с передачей данных в Google Analytics 4