是否可以使用 Google 优化读取 Javascript 中的 ExperimentId 和 VariationId?
Is it possible to read ExperimentId and VariationId in Javascript with Google Optimize?
我使用 Google 优化创建了一个 A/B-test。现在我想读取 Javascript 中的当前 experimentId 和 variationId。我的目标是根据给定的变化 运行 不同 javascript。
我似乎无法在文档中找到关于此的任何信息。可能吗?
Google 优化允许您在每个 DOM 元素的基础上 运行 任意 JS。
此功能旨在修改 DOM 元素,但没有什么可以阻止您使用它来调用 JS 函数或定义一些变量。
如何设置脚本
- 在可视化编辑器中编辑您的实验变体。
- 单击 Select 元素 图标(左上角的矩形)
- 在元素Select或字段中,输入正文。
- 单击添加更改 按钮和select Javascript。这将打开一个对话框,允许您输入将为主体调用的 JS 函数。
- 在里面输入你想要运行的代码。
什么代码到运行
假设您在页面上定义了一个 doSomething()
方法,您可以使 Google 优化函数看起来像这样:
doSomething("Experiment #1", "Variant A");
或者,您可以尝试全局定义变量。
// We need to use `windows` here, because if we define a variable
// with `var`, it will be limited to the scope of the Google Optimize
// function.
window["google_optimize_exp_id"] = "Experiment #1";
window["google_optimize_exp_var_id"] = "Variant A";
如果您使用第二种方法,请记住您需要等到 Google 优化函数具有 运行 之后才能 运行 调整您自己的逻辑。
编辑: 别介意下面我基于 cookie 的回答,我找到了更好的解决方案。
只需这样做:
var propertyId = "UA-1234567-33";
var experimentId = Object.keys(gaData[propertyId].experiments)[0];
var variationId = gaData[propertyId].experiments[experimentId];
旧答案:
(不要这样做..留在这里供参考)
Maximes 的回答有效,但不是我想要的。我希望能够在不通过可视化编辑器添加代码的情况下找到 experimentId 和 variationId。终于找到方法了
这些值实际上存储在 _gaexp cookie 中。当实验 运行 时,cookie 就会出现。您可以在 Chrome 中检查它,方法是打开 开发人员工具 ,转到 应用程序选项卡 并单击 Cookies 在左窗格中。它看起来像这样:
GAX1.2.S1SJOWxJTVO9tM2QKV3NcP.17723.1
实验id是第二个数字之后的部分:
S0SJOWxJTVO1tM2QKD2NcQ
变体 ID 是最后一个数字:
1
我写这段代码是为了从 cookie 中提取它:
function getCookieValue(cookieName) {
var result = document.cookie.match('(^|;)\s*' + cookieName + '\s*=\s*([^;]+)');
return result ? result.pop() : '';
}
function getExperimentId() {
var cookie = getCookieValue('_gaexp');
if (cookie == undefined) {
return undefined;
} else {
var fields = cookie.split('.');
return fields[2];
}
}
function getVariationId() {
var cookie = getCookieValue('_gaexp');
if (cookie == undefined) {
return undefined;
} else {
var fields = cookie.split('.');
return fields[4];
}
}
var experimentId = getExperimentId();
var variationId = getVariationId();
警告: 从 cookie 中获取实验 ID 和 variationId 不是一个好主意。有两个原因。
- 实验结束后,cookie 仍然存在。 cookie被缓存了,所以你会发现一个不适用的experimentId和variationId,你无法知道这个experiment是不是运行
- 如果您停止实验 A 并开始实验 B,A 的旧值仍将是 cookie 的一部分。所以它看起来像这样:
GAX1.2.S1SJOWxJTVO9tM2QKV3NcP.17723.1!vr1mB2L2RX6kSI1ZnUDTzT.18721.0
这与您同时进行 运行 实验时的效果相同。这使得很难推断要使用什么 experimentId。
我发现可以获取变体编号 运行 代码如下:
gaData["UA-XXXXXXXX-X"].experiments['ZYkOuNLKEoeLytt-dLWw3x']
第一个变体的结果应该是“0"for the original, "1”...
您可以通过以下方式获得实验:
gaData["UA-XXXXXXXX-X"].experiments
当然,您必须将 Google 分析 ID 替换为 UA-XXXXXXXX-X,将实验 ID 替换为 ZYkOuNLKEoeLytt-dLWw3x。
现在还有 Google 优化 javascript API 可用,这是一个更好的选择:
一旦创建实验(开始前),experimentId 现在在优化 UI 中可用。
API已经在页面中可用,您可以这样使用它:
google_optimize.get('<experimentId>');
(注意:这只有在加载了优化容器脚本后才会起作用)
您还可以随时(甚至在加载优化脚本之前)使用以下方法向 运行 和 javascript 注册回调:
function gtag() {dataLayer.push(arguments)}
function implementExperimentA(value) {
if (value == '0') {
// Provide code for visitors in the original.
} else if (value == '1') {
// Provide code for visitors in first variant.
}
gtag('event', 'optimize.callback', {
name: '<experiment_id_A>',
callback: implementExperimentA
});
如果您想同时找到 experimentId 和变体,您可以为任何实验注册回调:
function implementManyExperiments(value, name) {
if (name == '<experiment_id_A>') {
// Provide implementation for experiment A
if (value == '0') {
// Provide code for visitors in the original.
} else if (value == '1') {
// Provide code for visitors in first variant.
...
} else if (name == '<experiment_id_B>') {
// Provide implementation for experiment B
...
}
gtag('event', 'optimize.callback', {
callback: implementManyExperiments
});
更多详情
有 3 种方法可以做到这一点:
1) 根据您的 Google Analytics 设置,您可以通过 Chrome 控制台访问以下对象并传入您的 GA 属性 ID:
Object.keys(window.gaData["YOUR-GA-PROPERTY ID"].experiments).forEach(function(key, index){
var value = window.gaData["YOUR-GA-PROPERTY ID"].experiments[key];
console.log("Info", key, value, index);
});
2) 正如有人已经指出的那样,您可以访问 _gaexp
cookie,它存储您的实验 ID 和变体编号。
//READ THE COOKIE
function readCookie(name) {
var nameEQ = name + "=";
var ca = document.cookie.split(';');
for(var i=0;i < ca.length;i++) {
var c = ca[i];
while (c.charAt(0)==' ') c = c.substring(1,c.length);
if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
}
return null;
};
// GET THE COOKIE
let getCookie = readCookie("_gaexp");
console.log('getCookie', getCookie);
// WILL RETURN A STRING IN THIS FORMAT
// GAX1.2.YOUREXPERIMENTID.18803.0
// The long number in the middle is your experiment ID
// The number at the end is your variant number (0)
// SPLIT THE COOKIE
let splitCookie = readCookie("_gaexp").split("!");
// SPLIT THE COOKIE SO YOU CAN ACCESS THE EXPERIMENT ID AND VARIANT NUMBER
3) 最后,您可以使用 dataLayer
.
这样做有点笨拙,但在 Optimize 360 中,您可以在每个变体中添加 JavaScript(当您编辑 AB Test/variants 时)。并将您的实验 ID 以及其他信息发送到您的数据层。
EG:
function returnDate() {
var today = new Date();
var dd = String(today.getDate()).padStart(2, '0');
var mm = String(today.getMonth() + 1).padStart(2, '0'); //January is 0!
var yyyy = today.getFullYear();
today = mm + '/' + dd + '/' + yyyy;
return today;
}
var dateToday = returnDate();
var ABTest = {
id: 'YOUREXPERIMENTID',
name: 'Title of your test',
description: 'Test description',
date: dateToday, //The launch date of AB Test.
variant: 1,
totalVariants: 5
};
// AND THEN PUSH ALL THAT INFORMATION INTO THE DATALAYER
dataLayer.Tests.push(ABTest);
然后要访问所有这些信息,您需要做的就是访问 window.dataLayer
对象。
现在我如何使用 google 标签管理器,在 dataLayer.Tests
中添加“测试”键。但是你当然不需要那个,但我只是喜欢整理我的对象:)
我使用 Google 优化创建了一个 A/B-test。现在我想读取 Javascript 中的当前 experimentId 和 variationId。我的目标是根据给定的变化 运行 不同 javascript。
我似乎无法在文档中找到关于此的任何信息。可能吗?
Google 优化允许您在每个 DOM 元素的基础上 运行 任意 JS。
此功能旨在修改 DOM 元素,但没有什么可以阻止您使用它来调用 JS 函数或定义一些变量。
如何设置脚本
- 在可视化编辑器中编辑您的实验变体。
- 单击 Select 元素 图标(左上角的矩形)
- 在元素Select或字段中,输入正文。
- 单击添加更改 按钮和select Javascript。这将打开一个对话框,允许您输入将为主体调用的 JS 函数。
- 在里面输入你想要运行的代码。
什么代码到运行
假设您在页面上定义了一个 doSomething()
方法,您可以使 Google 优化函数看起来像这样:
doSomething("Experiment #1", "Variant A");
或者,您可以尝试全局定义变量。
// We need to use `windows` here, because if we define a variable
// with `var`, it will be limited to the scope of the Google Optimize
// function.
window["google_optimize_exp_id"] = "Experiment #1";
window["google_optimize_exp_var_id"] = "Variant A";
如果您使用第二种方法,请记住您需要等到 Google 优化函数具有 运行 之后才能 运行 调整您自己的逻辑。
编辑: 别介意下面我基于 cookie 的回答,我找到了更好的解决方案。
只需这样做:
var propertyId = "UA-1234567-33";
var experimentId = Object.keys(gaData[propertyId].experiments)[0];
var variationId = gaData[propertyId].experiments[experimentId];
旧答案:
(不要这样做..留在这里供参考)
Maximes 的回答有效,但不是我想要的。我希望能够在不通过可视化编辑器添加代码的情况下找到 experimentId 和 variationId。终于找到方法了
这些值实际上存储在 _gaexp cookie 中。当实验 运行 时,cookie 就会出现。您可以在 Chrome 中检查它,方法是打开 开发人员工具 ,转到 应用程序选项卡 并单击 Cookies 在左窗格中。它看起来像这样:
GAX1.2.S1SJOWxJTVO9tM2QKV3NcP.17723.1
实验id是第二个数字之后的部分:
S0SJOWxJTVO1tM2QKD2NcQ
变体 ID 是最后一个数字:
1
我写这段代码是为了从 cookie 中提取它:
function getCookieValue(cookieName) {
var result = document.cookie.match('(^|;)\s*' + cookieName + '\s*=\s*([^;]+)');
return result ? result.pop() : '';
}
function getExperimentId() {
var cookie = getCookieValue('_gaexp');
if (cookie == undefined) {
return undefined;
} else {
var fields = cookie.split('.');
return fields[2];
}
}
function getVariationId() {
var cookie = getCookieValue('_gaexp');
if (cookie == undefined) {
return undefined;
} else {
var fields = cookie.split('.');
return fields[4];
}
}
var experimentId = getExperimentId();
var variationId = getVariationId();
警告: 从 cookie 中获取实验 ID 和 variationId 不是一个好主意。有两个原因。
- 实验结束后,cookie 仍然存在。 cookie被缓存了,所以你会发现一个不适用的experimentId和variationId,你无法知道这个experiment是不是运行
- 如果您停止实验 A 并开始实验 B,A 的旧值仍将是 cookie 的一部分。所以它看起来像这样:
GAX1.2.S1SJOWxJTVO9tM2QKV3NcP.17723.1!vr1mB2L2RX6kSI1ZnUDTzT.18721.0
这与您同时进行 运行 实验时的效果相同。这使得很难推断要使用什么 experimentId。
我发现可以获取变体编号 运行 代码如下:
gaData["UA-XXXXXXXX-X"].experiments['ZYkOuNLKEoeLytt-dLWw3x']
第一个变体的结果应该是“0"for the original, "1”...
您可以通过以下方式获得实验:
gaData["UA-XXXXXXXX-X"].experiments
当然,您必须将 Google 分析 ID 替换为 UA-XXXXXXXX-X,将实验 ID 替换为 ZYkOuNLKEoeLytt-dLWw3x。
现在还有 Google 优化 javascript API 可用,这是一个更好的选择:
一旦创建实验(开始前),experimentId 现在在优化 UI 中可用。
API已经在页面中可用,您可以这样使用它:
google_optimize.get('<experimentId>');
(注意:这只有在加载了优化容器脚本后才会起作用)
您还可以随时(甚至在加载优化脚本之前)使用以下方法向 运行 和 javascript 注册回调:
function gtag() {dataLayer.push(arguments)}
function implementExperimentA(value) {
if (value == '0') {
// Provide code for visitors in the original.
} else if (value == '1') {
// Provide code for visitors in first variant.
}
gtag('event', 'optimize.callback', {
name: '<experiment_id_A>',
callback: implementExperimentA
});
如果您想同时找到 experimentId 和变体,您可以为任何实验注册回调:
function implementManyExperiments(value, name) {
if (name == '<experiment_id_A>') {
// Provide implementation for experiment A
if (value == '0') {
// Provide code for visitors in the original.
} else if (value == '1') {
// Provide code for visitors in first variant.
...
} else if (name == '<experiment_id_B>') {
// Provide implementation for experiment B
...
}
gtag('event', 'optimize.callback', {
callback: implementManyExperiments
});
更多详情
有 3 种方法可以做到这一点:
1) 根据您的 Google Analytics 设置,您可以通过 Chrome 控制台访问以下对象并传入您的 GA 属性 ID:
Object.keys(window.gaData["YOUR-GA-PROPERTY ID"].experiments).forEach(function(key, index){
var value = window.gaData["YOUR-GA-PROPERTY ID"].experiments[key];
console.log("Info", key, value, index);
});
2) 正如有人已经指出的那样,您可以访问 _gaexp
cookie,它存储您的实验 ID 和变体编号。
//READ THE COOKIE
function readCookie(name) {
var nameEQ = name + "=";
var ca = document.cookie.split(';');
for(var i=0;i < ca.length;i++) {
var c = ca[i];
while (c.charAt(0)==' ') c = c.substring(1,c.length);
if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
}
return null;
};
// GET THE COOKIE
let getCookie = readCookie("_gaexp");
console.log('getCookie', getCookie);
// WILL RETURN A STRING IN THIS FORMAT
// GAX1.2.YOUREXPERIMENTID.18803.0
// The long number in the middle is your experiment ID
// The number at the end is your variant number (0)
// SPLIT THE COOKIE
let splitCookie = readCookie("_gaexp").split("!");
// SPLIT THE COOKIE SO YOU CAN ACCESS THE EXPERIMENT ID AND VARIANT NUMBER
3) 最后,您可以使用 dataLayer
.
这样做有点笨拙,但在 Optimize 360 中,您可以在每个变体中添加 JavaScript(当您编辑 AB Test/variants 时)。并将您的实验 ID 以及其他信息发送到您的数据层。
EG:
function returnDate() {
var today = new Date();
var dd = String(today.getDate()).padStart(2, '0');
var mm = String(today.getMonth() + 1).padStart(2, '0'); //January is 0!
var yyyy = today.getFullYear();
today = mm + '/' + dd + '/' + yyyy;
return today;
}
var dateToday = returnDate();
var ABTest = {
id: 'YOUREXPERIMENTID',
name: 'Title of your test',
description: 'Test description',
date: dateToday, //The launch date of AB Test.
variant: 1,
totalVariants: 5
};
// AND THEN PUSH ALL THAT INFORMATION INTO THE DATALAYER
dataLayer.Tests.push(ABTest);
然后要访问所有这些信息,您需要做的就是访问 window.dataLayer
对象。
现在我如何使用 google 标签管理器,在 dataLayer.Tests
中添加“测试”键。但是你当然不需要那个,但我只是喜欢整理我的对象:)