javascript - 我如何使用谷歌应用程序脚本来修改我从谷歌分析中提取的数据?

标签 javascript google-apps-script google-analytics-api

我正在使用谷歌应用程序脚本从谷歌分析中提取数据并将其放入谷歌表格中的报告中。对于这个特定的报告,拉取的数据非常大,我想在将其放入 google sheet 之前对其进行修改。我需要你的帮助来弄清楚如何使用 javascript/google apps 脚本来完成。

这是我当前的代码:

function testReport() {

  var profileId = XXXXXXX;
  var tableId = 'ga:' + profileId;

  var startDate = 'yesterday';
  var endDate = 'yesterday';  

  var metrics = 'ga:sessions';
  var optionalArgs = {  
    'dimensions': 'ga:landingPagePath, ga:date',
    'filters': 'ga:sessions>0',
  };

  var report = Analytics.Data.Ga.get(tableId, startDate, endDate, metrics, optionalArgs);

  if (report.rows) {

    var spreadsheet = SpreadsheetApp.openByUrl('https://docs.google.com/spreadsheets/d/FILLER_TEXT/edit#gid=0');
    var sheet = spreadsheet.getSheetByName('Data'); 
    var firstEmptyRow = sheet.getLastRow() + 1;

    sheet.getRange(firstEmptyRow,1, report.rows.length, report.rows[0].length).setValues(report.rows);
  }

}

report.rows 是一个对象,格式如下:

[[/,20191228,100],[/locationOne,20191228,10],[/locationTwo,20191228,1],[/locationOne?s=a,20191228,10]]

这将创建一个如下所示的 google 表格:

Landing Page        Date    Sessions
/                 20191228    100
/locationOne      20191228     10
/locationTwo      20191228      1
/locationOne?s=a  20191228     10

但是,我的网站上有很多着陆页,所以我需要先压缩这些数据,然后再将其粘贴到 google 表格中。理想情况下,我想做两件事:

  1. 根据着陆页值创建一个名为“Web Section”的新列。例如,如果 着陆页包含“一个”,然后是新列中的值 应该是“位置一”。如果着陆页包含“两个”,则该值应为“位置二”。如果未指定值,则所有数据都应属于“其他”
  2. 对数据进行分组,以便数据按“Web Section”和“Date”列分组,并显示 session 总和

基于此,我应该得到一个如下所示的新表:

Web Section      Date    Sessions
Location One   20191228     20
Location Two   20191228      1
Others         20191228    100

谢谢你帮我解决这个问题!

最佳答案

  • 你想实现以下情况。

    • 来自

      [["/",20191228,100],["/locationOne",20191228,10],["/locationTwo",20191228,1],["/locationOne?s=a",20191228,10],["/locationOne",20191229,10]]
      
    • Web Section      Date    Sessions
      Location One   20191228     20
      Location One   20191229     10
      Location Two   20191228      1
      Others         20191228    100
      
    • 您想修改locationLocation .

    • 如果日期不同,你想把日期分开。
  • 您想使用 Google Apps 脚本实现这一目标。

如果我的理解是正确的,这个答案怎么样?请将此视为几个可能的答案之一。

流程:

修改后的脚本流程如下。

  1. 检索值为 reportAnalytics.Data.Ga.get() .
  2. 创建对象。这用于计算“ session ”。
  3. 创建数组。这用于放入电子表格。
  4. 将数组放入电子表格。

修改后的脚本:

当你的脚本修改后,变成如下。

从:
var spreadsheet = SpreadsheetApp.openByUrl('https://docs.google.com/spreadsheets/d/FILLER_TEXT/edit#gid=0');
var sheet = spreadsheet.getSheetByName('Data'); 
var firstEmptyRow = sheet.getLastRow() + 1;

sheet.getRange(firstEmptyRow,1, report.rows.length, report.rows[0].length).setValues(report.rows);
到:
// Please set the key words for using as "Web Section".
var searchValues = ["One", "Two"];

// Create object.
var object = report.rows.reduce(function(o, e) {
  var idx = -1;
  var check = searchValues.some(function(f, j) {
    if (e[0].indexOf(f) != -1) {
      idx = j;
      return true;
    }
    return false;
  });
  if (check) {
    var s = searchValues[idx];
    var key = e[0].replace(/\//g, "").split(s).shift().replace(/^[a-z]/g, function(f) {return f.toUpperCase()}) + " " + s +  "_" + e[1];
    o[key] = key in o ? o[key] + Number(e[2]) : Number(e[2]);
  } else {
    var others = "Others_" + e[1];
    o[others] = others in o ? o[others] + Number(e[2]) : Number(e[2]);
  }
  return o;
}, {});

// Create array.
var array = Object.keys(object).map(function(e) {return e.split("_").concat(object[e])});
array.sort(function(a, b) {return (a[0] < b[0] ? -1 : 1)});

// Put array to Spreadsheet.
var spreadsheet = SpreadsheetApp.openByUrl('https://docs.google.com/spreadsheets/d/FILLER_TEXT/edit#gid=0');
var sheet = spreadsheet.getSheetByName('Data'); 
var firstEmptyRow = sheet.getLastRow() + 1;
sheet.getRange(firstEmptyRow,1, array.length, array[0].length).setValues(array);

用于检查脚本:

var report = {rows: [["/",20191228,100],["/locationOne",20191228,10],["/locationTwo",20191228,1],["/locationOne?s=a",20191228,10],["/locationOne",20191229,10]]};

// Please set the key words for using as "Web Section".
var searchValues = ["One", "Two"];

// Create object.
var object = report.rows.reduce(function(o, e) {
  var idx = -1;
  var check = searchValues.some(function(f, j) {
    if (e[0].indexOf(f) != -1) {
      idx = j;
      return true;
    }
    return false;
  });
  if (check) {
    var s = searchValues[idx];
    var key = e[0].replace(/\//g, "").split(s).shift().replace(/^[a-z]/g, function(f) {return f.toUpperCase()}) + " " + s +  "_" + e[1];
    o[key] = key in o ? o[key] + Number(e[2]) : Number(e[2]);
  } else {
    var others = "Others_" + e[1];
    o[others] = others in o ? o[others] + Number(e[2]) : Number(e[2]);
  }
  return o;
}, {});

// Create array.
var array = Object.keys(object).map(function(e) {return e.split("_").concat(object[e])});
array.sort(function(a, b) {return (a[0] < b[0] ? -1 : 1)});
	
console.log(array);

备注:

  • 在这个修改后的脚本中,为了搜索用作“Web Section”的关键字,我使用了var searchValues = ["One", "Two"];。 .因为我不确定 locationOne 的模式, locationTwo .所以在这个修改后的脚本中,首先,请设置这个。
  • 不幸的是,我不确定是否20191228100["/",20191228,100]是数字或字符串。所以我用了 Number(e[2])在修改后的脚本中。
  • 如果不想对数组进行排序,请去掉array.sort(function(a, b) {return (a[0] < b[0] ? -1 : 1)}); .

引用资料:

如果我误解了您的问题并且这不是您想要的方向,我深表歉意。到时候能不能提供更多的样本值和你期望的输出?借此,我想确认一下。

添加:

  • 您想使用 One , Two作为搜索值。
  • 您想使用 First Output , Second Output作为用于放置电子表格的名称。

关于你的附加问题,我可以像上面那样理解。如果我的理解是正确的,下面的示例脚本怎么样?

// Please set the key words and names for using as "Web Section".
var searchValues = {
  search: ["One", "Two"],
  name:   ["First Output", "Second Output"]
};

// Create object.
var object = report.rows.reduce(function(o, e) {
  var idx = -1;
  var check = searchValues.search.some(function(f, j) {
    if (e[0].indexOf(f) != -1) {
      idx = j;
      return true;
    }
    return false;
  });
  if (check) {
    var key = searchValues.name[idx] +  "_" + e[1];
    o[key] = key in o ? o[key] + Number(e[2]) : Number(e[2]);
  } else {
    var others = "Others_" + e[1];
    o[others] = others in o ? o[others] + Number(e[2]) : Number(e[2]);
  }
  return o;
}, {});

// Create array.
var array = Object.keys(object).map(function(e) {return e.split("_").concat(object[e])});
array.sort(function(a, b) {return (a[0] < b[0] ? -1 : 1)});

// Put array to Spreadsheet.
var spreadsheet = SpreadsheetApp.openByUrl('https://docs.google.com/spreadsheets/d/FILLER_TEXT/edit#gid=0');
var sheet = spreadsheet.getSheetByName('Data'); 
var firstEmptyRow = sheet.getLastRow() + 1;
sheet.getRange(firstEmptyRow,1, array.length, array[0].length).setValues(array);
  • 在此示例脚本中,请对应search的索引和 name 的索引在 searchValues .
  • 在上述情况下,使用 One 搜索的值和 Two使用 First Output 的名称和 Second Output , 分别。

关于javascript - 我如何使用谷歌应用程序脚本来修改我从谷歌分析中提取的数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59518226/

相关文章:

Javascript 电子邮件验证特定域

loops - Google Scripts For 循环

javascript - 单个 onEdit 函数有效 - 多个相同的函数不起作用

google-maps - 使用嵌入的 API 谷歌分析设置 API key

使用谷歌分析在 R 中刷新 oauth token

javascript - google maps api 与带有背景附件 :fixed which overlaps it 的 div 冲突

javascript - 在 meteor 中使用mongo聚合来总计解锁/锁定集合

javascript - 假设我删除了 window.alert,我该如何取回它?

testing - 测试 Google 表格插件

php - 从谷歌分析 api 获取数据的问题