Created
June 12, 2023 10:54
-
-
Save satoshi71/1bc18f07f4cb6bca5130eb991d72f0bc to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//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