メインコンテンツへスキップ
見出し画像

Google search consoleの週次レポートを毎週月曜日に作成してくれるGASを作る

     創業してから5期目を間もなく終えようとしています(弊社は9月〆)。ありがたいことに、仕事に恵まれながらなんとかやってこれています。これまでのいろんな方とのつながりがあることが基本ですが、新たなつながりをつくっていくことも大切です。
     そこで、ブログやポッドキャストといったWebメディアに積極的に取り組み、なるべく弊社のことを知っていただく機会を創ってきました。ブログは今では、月間3万Pv位、診療報酬改定などのイベントが有る月は6万Pv位になります。医療という狭い領域では、まずまずだと思います。

     また、認知度も上がってきましたので外部の事業者とも提携してアフェリエイトも開始しました。今後は、ブログ等メディア単体での収益化も目指しておきたいと思っています。そこで、重要なことはアクセス解析です。以前、GA4の週次レポートを作成するGASをご紹介しました。GA4は、当該Webサイトに来てからの行動などを主に分析するものです。ですから、営業スタッフで言えば営業トークが上手いか下手か、ということになるかなと思います。信用度・信頼度を高める、という言い方もできると思います。1人企業というやや信用や安心感に欠けるところを、ニュースメディアがあるという信用と継続的に配信しているという安心を演出してきました。

     今後、顧客を増やしていく、Webメディア単体で稼いでもらうことも考えると、外に出て、見込み客をキャッチする営業も必要になります。そこで重要なのがGoogle search consoleの活用です。自然検索などでどういったキーワードで訪れているのかを分析するためのサービスです。

     このGoogle search consoleについて、毎週月曜日に前1週間の結果を収集・整理してくれるGASを作りました。なお、このGASだと収集・整理までです。そこで、Google studioをあわせて利用すると、月曜日の任意の時間にレポートを作成して通知もできます。

    画像
    毎週生成されるレポートです。スプレッドシートのGeminiでレポートを作ってもらうこともできます。私は、Google studioを利用して、毎週月曜日06:15にこのレポート結果をGeminiに読み込んでもらって、レポートをメールで通知してもらっています。


     Google studioの利活用についてはまた改めてご紹介しようと思います。ここでは、Google search consoleの週次レポートを作成してくれるGASの作り方をご紹介します。Google Search Console APIの有効化など、やや何度が高く感じるかもしれませんが、最初の手間だけです。


    Google search consoleの週次レポートを自動作成しているGASの作り方

    その1: スプレッドシートとGASエディタの準備

    1. Googleドライブで新しい Googleスプレッドシート を作成します(名前は「サーチコンソール週次レポート」など任意)。

    2. 上部メニューの 「拡張機能」 > 「Apps Script」 をクリックします。

    3. Apps Scriptのエディタが開きます。プロジェクト名を「SearchConsole_WeeklyReport」などに変更しておきましょう。

    その2: Google Cloudプロジェクトの作成とAPIの有効化

    GASからSearch Console APIを利用するために、専用の無料Google Cloudプロジェクトを準備します。

    1. プロジェクトの新規作成

    1. Google Cloud Console(プロジェクト作成画面) にアクセスします。

    2. プロジェクト名(例: gas-search-console)を入力し、「作成」 をクリックします。

    3. 作成完了後、画面上部やダッシュボードに表示される 「プロジェクト番号(数字のみの列)」 をコピーして手元に控えておきます (ここにプロジェクト番号が確認できるダッシュボード画面のスクショを挿入)。

    2. Search Console APIを有効化

    1. Google Search Console APIのライブラリ画面 を開きます。

    2. 画面上部で先ほど作成したプロジェクトが選択されていることを確認します。

    3. 青い 「有効にする」 ボタンをクリックします。

    その3: OAuth同意画面の設定とGASへの紐付け

    プロジェクトをGASに接続するため、OAuth同意画面を初期設定します。

    1. OAuth同意画面の作成

    1. OAuth 同意画面の設定ページ にアクセスします。

    2. User Typeで 「外部」 を選択し、「作成」をクリックします。

    3. 以下の必須項目のみ入力します(他は空欄でOKです)。

    • アプリ名: GAS Search Console(任意)

    • ユーザーサポートメール: 自身のメールアドレス

    • デベロッパーの連絡先情報: 自身のメールアドレス

    1. 画面下の 「保存して次へ」 をクリックします。

    2. 「スコープ」画面は何も追加せず、そのまま 「保存して次へ」 をクリックします。

    3. 「テストユーザー」画面で 「+ ADD USERS」 をクリックし、GASを実行する自身のGoogleアカウントのメールアドレス を追加して「保存して次へ」をクリックします。

    4. 「ダッシュボードに戻る」をクリックします。

    2. GASとGoogle Cloudプロジェクトを紐付ける

    1. GASエディタに戻り、左メニューの 「プロジェクトの設定(歯車アイコン)」 をクリックします。

    2. 「Google Cloud Platform(GCP)プロジェクト」欄の 「プロジェクトを変更」 をクリックします。

    3. Step 2で控えた「プロジェクト番号」 を貼り付け、「プロジェクトを設定」 をクリックします (ここに「プロジェクトを設定」画面のスクショを挿入)。

    その4: マニフェストファイル(権限)の編集

    Search Console APIへのアクセス権限をGASに許可します。

    1. 引き続きGASの 「プロジェクトの設定(歯車アイコン)」 で、「『appsscript.json』マニフェスト ファイルをエディタで表示する」 にチェックを入れます。

    2. 左メニューの 「エディタ(<>アイコン)」 に戻ると、ファイル一覧に appsscript.json が表示されます。

    3. appsscript.json を開き、内容を以下のように書き換えて保存します。

     {
      "timeZone": "Asia/Tokyo",
      "dependencies": {},
      "exceptionLogging": "STACKDRIVER",
      "runtimeVersion": "V8",
      "oauthScopes": [
        "https://www.googleapis.com/auth/webmasters.readonly",
        "https://www.googleapis.com/auth/spreadsheets",
        "https://www.googleapis.com/auth/script.external_request"
      ]
    }

    その5: スクリプトの貼り付けとテスト実行

    1. 左メニューのファイル一覧から コード.gs を開きます。

    2. 既存のコードを全削除し、以下のコードをそのまま貼り付けます。

    /**
     * 毎週月曜日にトリガー実行するメイン関数
     * 1行目の見出しを残し、2行目以降を最新の7日間データで「上書き」します
     */
    function fetchWeeklySearchConsoleData() {
      // --- 設定項目 ---
      // 対象のサイトURLを指定します。
      // URLプレフィックスプロパティなら末尾のスラッシュまで含める(例: 'https://example.com/')
      // ドメインプロパティなら 'sc-domain:example.com' の形式で記述
      const SITE_URL = 'https://example.com/'; 
      
      // 出力先シート名
      const SHEET_NAME = 'GSC_Weekly_Report';
      // -----------------
    
      const ss = SpreadsheetApp.getActiveSpreadsheet();
      let sheet = ss.getSheetByName(SHEET_NAME);
      if (!sheet) {
        sheet = ss.insertSheet(SHEET_NAME);
      }
    
      // ヘッダー行の定義
      const headers = [
        '集計開始日', 
        '集計終了日', 
        '検索クエリ', 
        'ページURL', 
        'クリック数', 
        '表示回数', 
        'CTR (%)', 
        '平均掲載順位'
      ];
    
      // 1行目の見出し設定
      if (sheet.getLastRow() === 0) {
        sheet.appendRow(headers);
        sheet.getRange(1, 1, 1, headers.length).setFontWeight('bold').setBackground('#f3f3f3');
        sheet.setFrozenRows(1);
      } else {
        const firstCell = sheet.getRange(1, 1).getValue();
        if (firstCell !== '集計開始日') {
          sheet.insertRowBefore(1);
          sheet.getRange(1, 1, 1, headers.length).setValues([headers]);
          sheet.getRange(1, 1, 1, headers.length).setFontWeight('bold').setBackground('#f3f3f3');
          sheet.setFrozenRows(1);
        }
      }
    
      // 日付範囲(API反映遅延を避けるため3日前〜9日前の7日間を算出)
      const dateRange = getPast7DaysRange();
    
      // APIエンドポイント
      const encodedSiteUrl = encodeURIComponent(SITE_URL);
      const endpoint = `https://www.googleapis.com/webmasters/v3/sites/${encodedSiteUrl}/searchAnalytics/query`;
    
      const payload = {
        startDate: dateRange.startDate,
        endDate: dateRange.endDate,
        dimensions: ['query', 'page'],
        rowLimit: 1000
      };
    
      const options = {
        method: 'post',
        contentType: 'application/json',
        headers: {
          Authorization: `Bearer ${ScriptApp.getOAuthToken()}`
        },
        payload: JSON.stringify(payload),
        muteHttpExceptions: true
      };
    
      try {
        const res = UrlFetchApp.fetch(endpoint, options);
        const statusCode = res.getResponseCode();
        const resBody = res.getContentText();
    
        if (statusCode !== 200) {
          Logger.log(`APIエラー (Status ${statusCode}): ${resBody}`);
          return;
        }
    
        const data = JSON.parse(resBody);
        const rows = data.rows;
    
        if (!rows || rows.length === 0) {
          Logger.log(`データが見つかりませんでした: ${dateRange.startDate} 〜 ${dateRange.endDate}`);
          return;
        }
    
        const outputData = rows.map(row => {
          const query = row.keys[0] || '(not set)';
          const page = row.keys[1] || '';
          const clicks = row.clicks || 0;
          const impressions = row.impressions || 0;
          const ctr = row.ctr ? (row.ctr * 100).toFixed(2) : 0;
          const position = row.position ? row.position.toFixed(1) : 0;
    
          return [
            dateRange.startDate,
            dateRange.endDate,
            query,
            page,
            clicks,
            impressions,
            ctr,
            position
          ];
        });
    
        // 既存の2行目以降のデータのみをクリアして最新データで上書き
        const lastRow = sheet.getLastRow();
        if (lastRow > 1) {
          sheet.getRange(2, 1, lastRow - 1, sheet.getLastColumn()).clearContent();
        }
    
        // 2行目から最新データを一括書き込み
        sheet.getRange(2, 1, outputData.length, outputData[0].length).setValues(outputData);
        
        Logger.log(`上書き完了: ${outputData.length} 件 (${dateRange.startDate} 〜 ${dateRange.endDate})`);
    
      } catch (e) {
        Logger.log(`実行エラー: ${e.message}`);
      }
    }
    
    /**
     * 過去7日間(3日前〜9日前)の YYYY-MM-DD 文字列を生成するヘルパー関数
     * ※ サーチコンソールの反映遅延(2〜3日)を考慮しています
     */
    function getPast7DaysRange() {
      const today = new Date();
      
      // 終了日: 3日前
      const end = new Date(today);
      end.setDate(today.getDate() - 3);
      
      // 開始日: 9日前(7日間分)
      const start = new Date(today);
      start.setDate(today.getDate() - 9);
    
      const formatDate = (date) => Utilities.formatDate(date, 'JST', 'yyyy-MM-dd');
    
      return {
        startDate: formatDate(start),
        endDate: formatDate(end)
      };
    }
    
    /**
     * 毎週月曜日の朝(7時〜8時)に自動実行するトリガー作成関数
     */
    function createWeeklyTrigger() {
      const triggers = ScriptApp.getProjectTriggers();
      for (const trigger of triggers) {
        if (trigger.getHandlerFunction() === 'fetchWeeklySearchConsoleData') {
          ScriptApp.deleteTrigger(trigger);
        }
      }
    
      ScriptApp.newTrigger('fetchWeeklySearchConsoleData')
        .timeBased()
        .everyWeeks(1)
        .onWeekDay(ScriptApp.WeekDay.MONDAY)
        .atHour(7)
        .create();
    
      Logger.log('毎週月曜日(7:00〜8:00)の自動実行トリガーを設定しました。');
    }

    3.上記コードの10行目あたりにあるSITE_URL を、ご自身のサーチコンソールで登録しているURL(または sc-domain:example.com)に書き換えて保存します。

    ◯初回実行とアクセスの承認

    1. ツールバーの関数選択で fetchWeeklySearchConsoleData を選び、「実行」 をクリックします。

    2. 「承認が必要です」というダイアログが出たら、ご自身のアカウントを選択します。

    3. 「このアプリは Google で確認されていません」と表示された場合は、左下の 「詳細」 > 「(安全ではないページ)に移動」 をクリックし、「許可」 を選択します。

    4. スプレッドシートを確認し、1行目に項目見出し、2行目以降にデータが出力されていればテスト成功です!

    その6: 毎週月曜日の自動更新(トリガー)を設定する

    最後に、毎週自動で上書き実行されるように設定します。ワンクリックで設定できる関数を用意しています。

    1. GASエディタ上部の関数選択プルダウンで createWeeklyTrigger を選択します。

    2. 「実行」 をクリックします。

    3. 実行ログに「毎週月曜日(7:00〜8:00)の自動実行トリガーを設定しました。」と表示されれば完了です。


     以上です。レポートの結果は、スプレッドシートにあるGeminiに分析のお願いをするとわかりやすいレポートを作ってくれます。念のため、レポートを読み解くための数値の意味についてご紹介します。

    画像

     改めてご紹介しますが、Google studioを利用すると、レポート作成からメールでのレポートの通知まで自動化できます。便利ですね。

     
     
     
    HCナレッジ合同会社(東京都葛飾区)という一人会社の代表社員です。2021年10月の創業から2024年9月末までの3期を振り返ります。私なりに創業までに必要な準備、実際に創業してからやるべきことなど実体験をもとに紹介してまいります。

    あなたへのおすすめ