Skip to content

Instantly share code, notes, and snippets.

@satoshi71
Created June 12, 2023 10:54
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save satoshi71/1bc18f07f4cb6bca5130eb991d72f0bc to your computer and use it in GitHub Desktop.
Save satoshi71/1bc18f07f4cb6bca5130eb991d72f0bc to your computer and use it in GitHub Desktop.
//Google AnalyticsプロパティID
const PROPERTY_ID = '';
//取得日数
const days = 30;
function getGA4Data(){
console.log('GA4データ取得中');
let rows = runReport();
console.log('データ整理中');
modifyData(rows);
console.log('完了');
}
function modifyData(rows){
//日付ヘッダー
let period = [];
var now = new Date();
for(let i=days-1; i>=0; i--){
dt = new Date(now.getFullYear(), now.getMonth(), now.getDate()-i);
period.push(dt);
}
//期間分だけ0埋め
let zero = []
for(var n=0; n<days; n++) zero.push(0);
let result = [];
result.push(['TITLE', 'URL', 'PV'].concat(period));
rows.unshift([0,'-','-',0]);
let total_pv=0;
for(let i=1; i<rows.length; i++){
if(i==1 || rows[i][2]!=rows[i-1][2]){
if(i>1){
lines[2]=total_pv;
result.push(lines);
}
//データ行新規作成
lines = [rows[i][1],rows[i][2],0];
lines = lines.concat(zero);
total_pv=0;
}
//日付indexにセット
let index = period.findIndex(element => element.getTime()==toDate(rows[i][0]).getTime());
lines[index+3]=Number.parseInt(rows[i][3]);
total_pv+=Number.parseInt(rows[i][3]);
}
//シートへ展開
const sheet = SpreadsheetApp.getActiveSheet();
sheet.getRange("A5:AZ10000").clearContent();
sheet.getRange(5, 1, result.length, result[0].length).setValues(result);
}
function runReport(){
//開始日と終了日(今日)を設定
var dt = new Date();
var END_DATE = Utilities.formatDate(dt, 'Asia/Tokyo', 'yyyy-MM-dd');
dt.setDate(dt.getDate()-days+1);
var START_DATE = Utilities.formatDate(dt, 'Asia/Tokyo', 'yyyy-MM-dd');
//取得したいメトリクスの名前
const METRIC_NAMES = ['screenPageViews'];
//取得したいディメンジョンの名前
const DIMENSION_NAMES = ['Date', 'pageTitle', 'pagePath'];
const metrics = METRIC_NAMES.map((x) => {
const tmp = AnalyticsData.newMetric();
tmp.name = x;
return tmp;
});
const dimensions = DIMENSION_NAMES.map((x) => {
const tmp = AnalyticsData.newDimension();
tmp.name = x;
return tmp;
});
const dateRange = AnalyticsData.newDateRange();
dateRange.startDate = START_DATE;
dateRange.endDate = END_DATE;
const request = AnalyticsData.newRunReportRequest();
request.dimensions = dimensions;
request.metrics = metrics;
request.dateRanges = dateRange;
const report = AnalyticsData.Properties.runReport(request,'properties/' + PROPERTY_ID);
if (!report.rows) {
Logger.log('No rows returned.');
return;
}
// Append the results.
const rows = report.rows.map((row) => {
const dimensionValues = row.dimensionValues.map(
(dimensionValue) => {
return dimensionValue.value;
});
const metricValues = row.metricValues.map(
(metricValues) => {
return metricValues.value;
});
return [...dimensionValues, ...metricValues];
});
rows.sort((a, b) => {
//URLは降順
if (a[2] > b[2]) return -1;
if (a[2] < b[2]) return 1;
//日付は昇順
if (a[0] > b[0]) return 1;
if (a[0] < b[0]) return -1;
else 0;
});
return rows;
}
function toDate(dt_str) {
dt_str = String(dt_str)
var arr = (dt_str.substr(0, 4) + '/' + dt_str.substr(4, 2) + '/' + dt_str.substr(6, 2)).split('/');
return new Date(arr[0], arr[1] - 1, arr[2]);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment