require('dotenv').config(); // .envファイルを環境変数として読み込み
const fs = require('fs');
// 保存ファイル名
const fileName = 'report.csv';
// レポートのプロパティID
const propertyId = '000000000';
// Google Analytics Data API client library 読み込み
const {BetaAnalyticsDataClient} = require('@google-analytics/data');
// AnalyticsDataClientの初期化
const analyticsDataClient = new BetaAnalyticsDataClient();
// レポートの実行
async function runReport() {
const [response] = await analyticsDataClient.runReport({
property: `properties/${propertyId}`,
dateRanges: [
{
startDate: '7daysAgo', // 念の為1週間前から取得する
endDate: 'yesterday', // 前日まで取得
},
],
dimensions: [ // ディメンジョンの指定
{
name: 'date',
},
],
metrics: [ // メトリックスの指定
{
name: 'activeUsers', // ユニークユーザー
},
{
name: 'screenPageViews', // 全体のページビュー
}
],
});
// レポートデータの抽出
let reportData = [];
for (const row of response.rows) {
reportData.push([row.dimensionValues[0].value].concat(row.metricValues.map(value => value.value)));
}
// 順番が順不同になっているので日付順に並べ替え
reportData = reportData.sort((a, b) => a[0] - b[0]);
// 保存済みのファイルがあれば読み込む
const text = fs.existsSync(fileName) ? fs.readFileSync(fileName).toString() : '';
// 保存済みの最新日の取得
let lastDate = '0';
if (text) {
const lastLine = text.split('\r\n').pop();
lastDate = lastLine.split(',')[0].replaceAll('-', '');
if (isNaN(lastDate)) {
lastDate = '0';
}
}
if (!text) {
// 保存済みファイルがない場合はヘッダーを書き込み
const header = [response.dimensionHeaders[0].name].concat(response.metricHeaders.map(header => header.name)).join(',');
fs.writeFileSync(fileName, header);
}
// 書き込み用データ
const appendLines = [''];
for (const data of reportData) {
const dateValue = data[0];
// 保存済みの最新日より新しい日付のみ追記する
if (dateValue > lastDate) {
data[0] = formatDate(dateValue);;
appendLines.push(data.join(','));
}
}
const appendText = appendLines.join('\r\n');
if (appendText) {
fs.appendFileSync(fileName, appendText);
}
}
// 日付を"XXXX-XX-XX"形式に変換
function formatDate(value) {
return [value.substring(0, 4), value.substring(4, 6), value.substring(6)].join('-');
}
runReport();