Заявки с сайта в Google Таблицы с передачей данных в Google Analytics 4

13.06.2024

Способ передачи заявок с сайта в 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

Для заполнения данной формы включите JavaScript в браузере.
Категории:
Веб-аналитика
Виктор Кончишин
Виктор Кончишин

Основной профиль Веб-Аналитика GA4/Метрика и Таргет. реклама в соц. сетях, а именно FB-IG, Вк, TT. Через Google Tag Manager решаю наверное любые задачи.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *