前提
GASでスプレッドシートとGoogleAnalytics4(GA4)を連携させるシステムを作っています。
スプレッドシート自身のURLとセルに記載されたアナリティクスのIDをGAS上に反映させる機能を実装中に以下のエラーメッセージが発生しました。
実現したいこと
・スプレッドシート内の特定のセルに記載されている値(GA4のプロパティID)をGASで取得する
・上記で取得したプロパティIDをGA4のデータを取得するGAS内のプロパティID欄に反映させる
・GA4取得GAS内で指定した項目をスプレッドシートにエクスポートさせる
└この時、セルのプロパティIDが変わることでGASからエクスポートされる内容が変わるようにする
発生している問題・エラーメッセージ
プロパティIDが正しくないとのエラーがでて、GA4取得のGASが作動しない。
エラーメッセージ
GoogleJsonResponseException: API call to analyticsdata.properties.runReport failed with error: Invalid property ID: Value. A numeric Property ID is required. To learn more about Property ID, see https://developers.google.com/analytics/devguides/reporting/data/v1/property-id.
該当のソースコード
GAS(Java Script)
ソースコード
function runReport() {
// スプレッドシート&シートオブジェクトを取得
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getSheetByName('データベース');
// セルを選択
var range = sheet.getRange('Z1');
// セルの値を取得
var value = range.getValue();
// 取得したデータを実行ログに表示
console.log(range);
//
/ 実行前に「PROPERTY_ID」「SPREADSHEET_ID」「SHEET_NAME」の情報(**)を入力 /
//
//BASIC INFO
//取り込み対象のGoogle AnalyticsプロパティID
const PROPERTY_ID = 'Value';
//出力先のスプレッドシートID
const SPREADSHEET_ID = SpreadsheetApp.getActiveSpreadsheet();
//出力先のシート名
const SHEET_NAME = "データベース";
//PARAMETERS
//取得したいメトリクスの名前
const METRIC_NAMES = ['sessions', 'newUsers', 'activeUsers', 'conversions','engagedSessions','userEngagementDuration'];
//取得したいディメンジョンの名前
const DIMENSION_NAMES = ['Date','eventName','defaultChannelGroup'];
//取得期間の開始終了
const START_DATE = "2022-01-01";
const END_DATE = "today";
try {
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;
}
const spreadsheet = SpreadsheetApp.openById(SPREADSHEET_ID);
const sheet = spreadsheet.getSheetByName(SHEET_NAME);
sheet.clear();
// Append the headers.
const dimensionHeaders = report.dimensionHeaders.map(
(dimensionHeader) => {
return dimensionHeader.name;
});
const metricHeaders = report.metricHeaders.map(
(metricHeader) => {
return metricHeader.name;
});
const headers = [...dimensionHeaders, ...metricHeaders];
sheet.appendRow(headers);
// 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];
});
sheet.getRange(2, 1, report.rows.length, headers.length).setValues(rows);
Logger.log('Report spreadsheet created: %s',spreadsheet.getUrl());
} catch (e) {
Logger.log(e);
}
}
function _runReport() {
/**
- TODO(developer): Uncomment this variable and replace with your
- Google Analytics 4 property ID before running the sample.
*/
const propertyId = PROPERTY_ID;
try {
const metric = AnalyticsData.newMetric();
metric.name = 'screenPageViews';
const dimension = AnalyticsData.newDimension();
dimension.name = 'pageTitle';
const dateRange = AnalyticsData.newDateRange();
dateRange.startDate = 'today-90';
dateRange.endDate = 'today';
const request = AnalyticsData.newRunReportRequest();
request.dimensions = [dimension];
request.metrics = [metric];
request.dateRanges = dateRange;
const report = AnalyticsData.Properties.runReport(request,
'properties/' + propertyId);
if (!report.rows) {
Logger.log('No rows returned.');
return;
}
const spreadsheet = SpreadsheetApp.create('Google Analytics Report');
const sheet = spreadsheet.getActiveSheet();
// Append the headers.
const dimensionHeaders = report.dimensionHeaders.map(
(dimensionHeader) => {
return dimensionHeader.name;
});
const metricHeaders = report.metricHeaders.map(
(metricHeader) => {
return metricHeader.name;
});
const headers = [...dimensionHeaders, ...metricHeaders];
sheet.appendRow(headers);
// 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];
});
sheet.getRange(2, 1, report.rows.length, headers.length)
.setValues(rows);
Logger.log('Report spreadsheet created: %s',
spreadsheet.getUrl());
} catch (e) {
console.log(e);
// TODO (Developer) - Handle exception
Logger.log('Failed with error: %s', e.error);
}
}
試したこと
「const PROPERTY_ID = 'Value';
//出力先のスプレッドシートID
const SPREADSHEET_ID = SpreadsheetApp.getActiveSpreadsheet();
//出力先のシート名
const SHEET_NAME = "データベース";」
に問題があるかと思い、getvalue関数などを組み込んでみましたが、難しそうでした。
課題としては、セルを取得するコードと、GA4のデータを取得するコードの連携ができていないことかと考えています。
補足情報(FW/ツールのバージョンなど)
不明点あればご質問ください
あなたの回答
tips
プレビュー