【ほぼ、そのまま使えるコード配布中】Googleアナリティクスの実績をスプレッドシートへ自動で転記する方法

## Apps Scriptとは？

Apps Scriptとは、Googleが提供するプログラム言語で、javascriptをベースに作られています。

GmailやGoogleドライブなど、Googleのサービスと連携して何かを行うWebサービスやアプリをつくることができます。

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416622/164ddad4-86a8-18c4-ffeb-c9a4e5626815.png)


### アナリティクスと組み合わせて、何かできそう！
Googleアナリティクスの分析結果をレポート化して、毎日自動で配信する方法を、下記の記事で紹介しました。

https://miuradonuts.com/2023/07/20/ga-002/

※ここで紹介しているレポートは、テンプレートも配布中です。

このレポート、めちゃくちゃ見やすくて本当に良いものなのですが、１つだけ不得意なことがあります。

それは…「データのストック（蓄積）には不向きなこと」。

つまり、日々の実績をシートにまとめて、後で推移などを分析したり、このタイミングでアクセスが急激に伸びている！と言ったことを見るのには、実は不向きなんです。そこで、このレポートの運用はもちろん継続しつつ、シンプルに実績を蓄積できないかな…と考えました。

そう、こんな感じに。

![5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416622/a16a35f5-0583-cdec-de93-247684567f9f.jpeg)


実は、「Apps Script」とGoogle Analyticsを組み合わせることで、自動でデータを蓄積することができるんです。

### Google Analyticsとの連携方法
➀「Apps Script」の画面へ移行します

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416622/3533ee03-7300-3121-0517-e9a6073b352c.png)


スプレッドシート「拡張機能」から「Apps Script」を選んでください。


➁GoogleアナリティクスのAPIに接続して、集計値を参照できるように準備します

![2-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416622/653d4248-6eb8-e8c0-49c0-f5684fae9fc7.png)


・「サービス」をクリックし、「Google Analytics Data API」を選択します
・バージョンは最新の「ベータ版」、IDが「AnalyticsData」であることを確認します
・最後に「追加」を押して、接続完了です

![2-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416622/603f73a2-7d7b-b36d-62cc-317adb9c8504.png)


「サービス」の下に「AnalyticsData」と表示がされていればＯＫです。

### Apps Scriptの画面構成
ここで、「Apps Script」の画面構成について、見ておきましょう。

![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416622/1b3af1ce-9830-c8c5-0cd1-2ceee9e33f6e.png)


・右下の青枠の広いスペースが、コード（Javascript）を書く場所になります。
・「実行」を押すと、上記で書いたコードが動き、処理が開始されます。

上記の画像を翻訳すると…

「myFunction」という名前の空っぽの関数を作っていて、「実行」ボタンを押すことで、「myFunction」の処理が開始されます

という意味になります。

## Google Analyticsの集計値を取得してみよう
### Apps Scriptへコードを貼り付けます

今回は、下記の項目を取得します。
・日付
・エンゲージメント時間（秒）
・総PV数
・アクティブユーザ数
・新規ユーザ数
・イベント数
・コンバージョンイベント数

※下記のJavascriptのコードを、コピーして貼り付けてください
※貼り付ける際には、デフォルトで書かれている「function myFunction() {}」は消去して大丈夫です。

```
function GetDateGA4() {

  // Googleアナリティクスの「プロパティID」を取得します
  /*** GA4のプロパティIDを記載してください ***/
  const propertyId = 'ここにプロパティIDを貼り付けます';

  try {
    // ここでは取得したい項目を設定します（取得順は下記の順となります）
    //「日付」「総PV数」「アクティブユーザ数」「新規ユーザ数」「エンゲージメント時間（秒）」「イベント数」「コンバージョンイベント数」
    const metric = AnalyticsData.newMetric();
    metric.name = 'screenPageViews';

    const metric1 = AnalyticsData.newMetric();
    metric1.name = 'userEngagementDuration';

    const metric2 = AnalyticsData.newMetric();
    metric2.name = 'activeUsers';

    const metric3 = AnalyticsData.newMetric();
    metric3.name = 'newUsers';

    const metric4 = AnalyticsData.newMetric();
    metric4.name = 'eventCount';

    const metric5 = AnalyticsData.newMetric();
    metric5.name = 'conversions';

    // 行の項目を指定します
    const dimension = AnalyticsData.newDimension();
    dimension.name = 'date';

    // 取得期間を指定します（昨日:yesterday, 7日前:7daysAgo, 今日:today, 28日前:28daysAgo）
    const dateRange = AnalyticsData.newDateRange();
    dateRange.startDate = 'yesterday';
    dateRange.endDate = 'yesterday';
    
    // GA4からデータを取得するためのリクエストを作成します
    const request = AnalyticsData.newRunReportRequest();
    request.dimensions = [dimension];
    request.metrics = [metric,metric1,metric2,metric3,metric4,metric5];
    request.dateRanges = dateRange;
    
    // 指定されたGA4のプロパティIDからデータを取得します
    const report = AnalyticsData.Properties.runReport(request,
        'properties/' + propertyId);
    if (!report.rows) {
      console.log('Oops...データを取得できません！.');
      return;
    }
    
    // 現在アクティブなシート名「****」を取得します
    /*** スプレッドシート内の画面下「タブ名」を記載してください ***/
    const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
    const sheet = spreadsheet.getSheetByName('Daily'); 

    // Analytics Data APIから取得したレポートの結果を整えます
    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];
    });

    // 取得したデータをシートのA列を基準とした最下行に出力します
    var lastRowA = sheet.getRange(sheet.getMaxRows(), 1).getNextDataCell(SpreadsheetApp.Direction.UP).getRow();
    sheet.getRange(lastRowA + 1, 1, report.rows.length, rows[0].length)
        .setValues(rows);

    // 処理に"成功"した時にコンソールログに出力するメッセージはコチラ
    console.log('おめでとう！レポートは正常に出力されました！: %s',
        spreadsheet.getUrl());
  
  } catch (e) {

    // 処理に"失敗"した時にコンソールログに出力するメッセージはコチラ
    console.log('おやおおや…何かがおかしいみたいだぞ？: %s', e.error);
  
  }
}
```
### 貼り付けたコードをちょっとだけ解説
今回のコードの大まかな流れは、こんな感じです。

GA4のプロパティIDを取得
↓
取得したいメトリクスを定義
↓
データの行の項目を「日付」で指定
↓
取得期間を指定
↓
リクエストを作成
↓
指定されたプロパティIDからデータを取得
↓
アクティブなスプレッドシートのシート名を取得
↓
取得したデータを整理
↓
整理したデータをスプレッドシートに出力
↓
成功/失敗メッセージをコンソールに出力


### 実行ボタンを押してみましょう

「実行」ボタンを押すと、下記の画像のように結果が出力されます。
※見出しは出力されないので作成しています。
　
![4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416622/e7357720-b9e4-c098-b339-cc3f0d7ebecd.jpeg)


データが蓄積されると、こんな感じで日々の結果をストックすることができます。

![5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416622/f9769f4c-4a6b-e9bd-7982-4c1dc51817e8.jpeg)



### 皆さんの環境に合わせるには…ココを書き換えましょう

書き換えなければいけない箇所は「2箇所」です。

➀GA4のプロパティID（上から4行目あたり）

```
const propertyId = 'ここにプロパティIDを貼り付けます';
```


![8-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416622/44f4dcbe-3663-9ddf-52a8-d8974c5bddef.png)


プロパティIDは、この数字です。


プロパティIDは、Google Analyticsの「アカウント名横よこの▼」＞「アナリティクスアカウント」＞「プロパティとアプリ」で確認ができます。

![8-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416622/73f5cb23-666c-8fc9-073d-41c76fd9d898.png)


![8-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416622/ea643fb6-fa41-597e-c6f4-e99d81545072.png)


（例）プロパティIDが「123456789」の場合

```
const propertyId = '123456789';
```


➁結果を出力するスプレッドシートの「タブ名」（下から25行目あたり）

```
const sheet = spreadsheet.getSheetByName('Daily'); 
```

上記のコードでは、「Daily」というタブが指定されていますので、Dailyを書き換えましょう。

![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416622/b445cde5-fe7a-a094-da58-1f4284ed2b57.png)


「タブ名」とは、スプレッドシートのココのことです。今回のコードでは結果を出力する「シート名」については、記載する必要はありません。


（例）タブ名が「Output」の場合
```
const sheet = spreadsheet.getSheetByName('Output'); 
```

※注意！
デフォルトでは「myFunction」が実行されるようになっているので、コードを貼り付けた直後に「実行」ボタンを押すと、下記のエラーが表示されます。

![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416622/8084c78d-52a3-ef14-a1e2-685985718b25.png)


これは、コードを貼り付けた直後に出る１回切りのエラーなので、気にしないでください。
もう一度、「実行」ボタンを押すと正常に動きます。（以降、同様のエラーが出ることはありません）

## 集計を自動化してみましょう
「実行」ボタンを押すことで、前日の実績がスプレッドシートへ転記できることが分かりました。でも、毎日「実行」ボタンを押すというタスクをスケジュールへ入れるのは、ちょっとナンセンスです。

そこで、毎日決まった時刻に「実行」ボタンが押されるように、処理を自動化してみましょう。

### 自動化の方法

「Apps Script」のホーム画面に戻り、「トリガー」＞「トリガーを追加」ボタンを押します。

![9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416622/50eba68d-568c-b7cb-a668-361e0dda7a89.png)


トリガーの詳細設定画面が立ち上がりますので、設定をしていきます。

![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416622/f76984ba-00c5-54c0-afd4-be6ebad8ebb0.png)


ここでは、毎日「AM6:00～7:00に処理が自動実行される」ように設定しています。

・実行する関数：今回ペーストした関数の名前を選択してください
・実行するデプロイ：「Head」で構いません
・イベントのソース：時間主導型
・時間ベースのトリガータイプ：日付ベースのタイマー
・時刻：午前6時～7時
・エラー通知設定：今すぐ通知を受け取る

上記設定ができたら「保存」を押して完了です。

この設定により、毎日自動で「実行」ボタンが押されるようになりました。あとは、毎朝追加される実績をチェックすることに時間が割けるので、有意義にサイト運営ができますね。


この記事は、著者が運営するメディア「ぬるぺでぃあ」でも読むことができます（記事は[コチラ](https://miuradonuts.com/2023/07/24/ga-004/)）
![](https://miuradonuts.com/wp-content/uploads/2023/06/ヘッダーエリア画像作成.png)