1. PV履歴作成 このGASの目的 V1.3.4 26/6/23
本GASは、Google Analytics 4(GA4)から出力したページ別PVデータをもとに、TECNの記事台帳とPV履歴を自動更新するための処理です。
GA4側の元データシート gas4 を読み込み、記事台帳に登録済みの記事とページパスで照合します。
一致した記事については、PV履歴シートの対象日列にPVを記録します。
また、GA4側には存在するが、記事台帳にまだ登録されていないページが見つかった場合は、記事台帳に新規記事として自動追加します。
その場合、状態は 未整理 として登録され、あとから主カテゴリ・従カテゴリなどを整理できるようにします。

2. 処理概要
このGASで実行する主な処理は、以下の通りです。
- スクリプトプロパティからGA4元スプレッドシートURLを取得する
- URLからスプレッドシートIDを抽出する
- GA4元スプレッドシート内の
gas4シートを読み込む gas4シートのA列URLからページパスを抽出する- C列の表示回数をPVとして取得する
- 記事台帳シートのページパスと照合する
- 既存記事の場合、PV履歴に対象日のPVを書き込む
- 新規記事の場合、記事台帳に新規追加する
- 新規記事も含めて、PV履歴シートに行を追加し、対象日のPVを書き込む
- タイトル差分がある場合は、タイトル変更履歴に記録する
- 実行結果をDebugシートに記録する
3. 対象スプレッドシート構成
このGASは、主に以下のシートを使用します。
3-1. 記事台帳
TECNの記事情報を管理するメイン台帳です。
主な項目は以下です。
- 記事ID
- 記事タイトル
- URL
- ページパス
- スラッグ
- 主カテゴリ
- 従カテゴリ
- 公開日
- 更新日
- 状態
- 最終確認日
- 備考
GA4側で新規記事が見つかった場合、このシートに自動追加されます。
3-2. PV履歴
記事ごとの日別PVを横持ちで管理するシートです。
固定列として、以下の情報を持ちます。
- 記事ID
- 記事タイトル
- URL
- ページパス
- スラッグ
- 主カテゴリ
- 従カテゴリ
- 状態
その右側に、日付列が追加されます。
各日付列に、その日の記事別PVが書き込まれます。
3-3. タイトル変更履歴
GA4側から取得したタイトルと、記事台帳に登録済みのタイトルが異なる場合に、変更履歴を記録するシートです。
主な項目は以下です。
- 記録日時
- 記事ID
- URL
- ページパス
- 変更前タイトル
- 変更後タイトル
- 変更検知日
- 備考
タイトルの比較では、全角スペース・半角スペース・記号の揺れをある程度正規化して比較します。
3-4. Debug
GAS実行時の読込値・書込値・一致判定を記録する確認用シートです。
主な項目は以下です。
- 実行日時
- 実行キー
- 対象日
- 元A列
- 読み込みパス
- 読み込みPV
- 書き込みパス
- 書き込みPV
- 一致判定
- 備考
GA4から読み込んだ値と、PV履歴へ書き込む値が一致しているか確認するために使用します。
4. GA4元シート gas4 の前提仕様
このGASは、GA4から出力されたデータが gas4 シートに入っている前提で動作します。
4-1. シート名
GA4元データのシート名は、以下です。
gas4
4-2. 日付情報
gas4 シートのA8、A9から対象日を取得します。
- A8:開始日
- A9:終了日
基本的には、A9の終了日を対象日としてPV履歴に記録します。
A9から日付が取得できない場合は、A8の開始日を使用します。
4-3. ヘッダー行
10行目をヘッダー行として扱います。
想定ヘッダーは以下です。
- A10:ページパスとスクリーン クラス
- C10:表示回数
このヘッダーが想定と異なる場合、処理を停止します。
4-4. データ行
11行目以降をGA4データとして読み込みます。
列の扱いは以下です。
- A列:URLまたはページパス
- B列:記事タイトル
- C列:表示回数、つまりPV
GASでは、A列のURLまたはページパスから、記事台帳照合用のページパスを抽出します。
例:

↓
/sku-meaning
5. メイン関数
5-1. syncGa4ToLedgerAndPv()
役割
GA4元シート gas4 のデータを読み込み、記事台帳とPV履歴を更新するメイン関数です。
通常、日々のPV履歴作成ではこの関数を実行します。
インプット情報
この関数の主な入力情報は以下です。
スクリプトプロパティ
GA4_SOURCE_SPREADSHEET_URL
GA4元データが入っているスプレッドシートのURLを指定します。
GASはこのURLからスプレッドシートIDを抽出し、対象スプレッドシートを開きます。
GA4元スプレッドシート
- シート名:
gas4 - A8 / A9:対象日取得用
- A10 / C10:ヘッダー確認用
- A11以降:URL、タイトル、PVデータ
現在のアクティブスプレッドシート
以下のシートを読み書きします。
- 記事台帳
- PV履歴
- タイトル変更履歴
- Debug
アウトプット情報
この関数を実行すると、以下が更新されます。
記事台帳
- 既存記事の最終確認日を更新
- URLが空白だった場合、GA4側URLを補完
- GA4側にしかないページを新規記事として追加
- 新規記事の状態は
未整理 - 新規記事の備考は
GA4から新規追加
PV履歴
- 対象日列を追加、または既存対象日列を利用
- 記事ごとのPVを対象日列に書き込み
- PV履歴に存在しないページは、新規行として追加
タイトル変更履歴
- 記事台帳のタイトルとGA4側タイトルに差分がある場合、変更履歴を追加
Debug
- 読み込みパス、読み込みPV、書き込みパス、書き込みPVを記録
- 読み込み値と書き込み値が一致しているかを
OK/NGで記録
6. 新規記事の扱い
GA4側 gas4 に存在するページが、記事台帳に存在しない場合、そのページは新規記事として扱われます。
6-1. 新規記事として追加される条件
以下の条件に該当する場合、新規記事として記事台帳に追加されます。
gas4シートにURLまたはページパスが存在する- そのページパスが、記事台帳のページパス列に存在しない
6-2. 新規記事に設定される値
新規記事として追加される場合、記事台帳には以下の値が入ります。
| 項目 | 設定内容 |
|---|---|
| 記事ID | 自動採番 |
| 記事タイトル | GA4側タイトル。使えない場合はページパスから推定 |
| URL | GA4側A列のURL |
| ページパス | URLから抽出したページパス |
| スラッグ | ページパス末尾から抽出 |
| 主カテゴリ | 空白 |
| 従カテゴリ | 空白 |
| 公開日 | 空白 |
| 更新日 | 空白 |
| 状態 | 未整理 |
| 最終確認日 | 実行日 |
| 備考 | GA4から新規追加 |
6-3. 新規記事のPV履歴
新規記事は、記事台帳に追加されるだけでなく、同じ実行内でPV履歴にも追加されます。
PV履歴側には、以下の固定情報が追加されます。
- 記事ID
- 記事タイトル
- URL
- ページパス
- スラッグ
- 主カテゴリ
- 従カテゴリ
- 状態
そのうえで、対象日列にPVが書き込まれます。
6-4. 新規記事の運用
新規記事は、状態が 未整理 で追加されます。
そのため、PV同期後に記事台帳で以下の条件でフィルタすると、新規追加された記事を確認できます。
- 状態 = 未整理
- 備考 = GA4から新規追加
- 主カテゴリが空白
- 従カテゴリが空白
確認後、手動で主カテゴリ・従カテゴリ・状態などを整理します。
7. PV履歴の書き込み仕様
7-1. 対象日列の作成
PV履歴シートには、固定列の右側に日付列を追加します。
対象日の列がすでに存在する場合は、その列を再利用します。
対象日の列が存在しない場合は、右端に新しい日付列を作成します。
日付の形式は以下です。
yyyy-MM-dd
7-2. PVの書き込み
GA4側から読み込んだページごとに、PV履歴シートのページパスと照合します。
- PV履歴に既存行がある場合:対象日列にPVを書き込む
- PV履歴に行がない場合:新規行を追加して対象日列にPVを書き込む
7-3. PVが空白になるケース
PV履歴の対象日列で、一部の記事が空白になることがあります。
これは主に以下のケースです。
- その記事がGA4元シート
gas4に存在しない - その日のPVが0で、GA4側に出力されていない
- GA4の出力件数上限により、対象記事が
gas4に含まれていない - ページパスの形式が一致せず、照合対象になっていない
現在のGASは、gas4 シートに存在するデータをもとにPVを書き込む仕様です。
そのため、gas4 に存在しない記事については、PV履歴にPVは書き込まれません。
8. GA4データ取得関数
8-1. getGa4Rows_()
役割
スクリプトプロパティに設定されたGA4元スプレッドシートURLから、gas4 シートを開き、GA4データを読み込む関数です。
インプット情報
- スクリプトプロパティ
GA4_SOURCE_SPREADSHEET_URL - GA4元スプレッドシート
gas4シート- A8、A9の日付情報
- A10、C10のヘッダー
- A11以降のURL、タイトル、PV
アウトプット情報
以下の形式のデータ配列を返します。
- date:対象日
- rawA:A列の元URLまたはページパス
- pagePath:抽出・正規化したページパス
- pageViews:PV
- url:元URL
- title:記事タイトル
ページパスが空白の行は除外されます。
9. PV履歴書き込み関数
9-1. writePvColumn_()
役割
PV履歴シートに、記事ごとのPVを対象日列へ書き込む関数です。
インプット情報
- PV履歴シート
- 対象日列番号
- PV更新データ
- 記事台帳マップ
PV更新データには、以下の情報が含まれます。
- 記事ID
- 記事タイトル
- URL
- ページパス
- スラッグ
- 主カテゴリ
- 従カテゴリ
- 状態
- PV
アウトプット情報
- PV履歴に存在しないページを新規行として追加
- 対象日列にPVを書き込み
- 該当しない記事の対象日列は空白のまま
10. タイトル補完関数
このGASには、記事台帳またはPV履歴のURLからページタイトルを取得し、タイトル欄を補完する処理も含まれています。
10-1. fillLedgerTitlesFromUrl()
役割
記事台帳のC列URLからページを取得し、B列の記事タイトルを補完します。
インプット情報
- 記事台帳シート
- C列URL
- B列記事タイトル
アウトプット情報
- B列が空白の行に、取得したタイトルを入力
- 取得できない場合は、WARNINGまたはERRORを入力
10-2. fillPvTitlesFromUrl()
役割
PV履歴のC列URLからページを取得し、B列の記事タイトルを補完します。
インプット情報
- PV履歴シート
- C列URL
- B列記事タイトル
アウトプット情報
- B列が空白の行に、取得したタイトルを入力
- 取得できない場合は、WARNINGまたはERRORを入力
10-3. タイトル補完の処理上限
タイトル補完処理は、1回の実行で最大300件まで処理します。
これは、URLへアクセスしてHTMLのtitleタグを取得する処理であり、GASの実行時間制限や外部アクセス負荷を考慮した制限です。
なお、この300件制限はタイトル補完処理の制限であり、GA4からPV履歴を書き込む処理の件数制限ではありません。
10-4. タイトル補完の再実行仕様
タイトル補完処理では、B列の記事タイトルが空白の行だけを処理します。
取得に失敗した場合は、B列に以下のような値を入れます。
- WARNING: URL空白
- WARNING: URL形式不正
- WARNING: titleタグなし
- ERROR: URL正規化失敗
- ERROR: fetchAll失敗
- ERROR: HTTPエラー
- ERROR: 取得処理失敗
WARNINGまたはERRORが入った行は、次回実行時には再処理されません。
これにより、エラー行で処理が止まり続けることを防ぎ、次回実行時には未処理の後続行へ進める仕様です。
11. ページパスの正規化仕様
記事台帳との照合では、URLそのものではなく、ページパスを使用します。
11-1. URLからページパスを抽出する例
入力:

出力:
/sku-meaning
11-2. 正規化ルール
ページパスは、以下のルールで正規化されます。
- URLの場合はドメイン部分を除去する
- クエリパラメータを除去する
- ハッシュを除去する
- 先頭に
/がなければ追加する - 末尾の
/は削除する /単体の場合はそのまま扱う
この正規化により、記事台帳とGA4側のページパスをできるだけ同じ形式で比較します。
12. タイトル変更履歴の仕様
既存記事について、GA4側タイトルと記事台帳タイトルが異なる場合、タイトル変更履歴に記録します。
ただし、比較時には以下のような表記揺れを正規化します。
- 全角スペース
- 半角スペースの連続
|と|- 大文字・小文字
このため、見た目上ほぼ同じタイトルは、不要な変更履歴として記録されにくくなっています。
13. Debugシートの仕様
Debugシートには、実行ごとの確認情報を記録します。
1行ごとに以下を記録します。
- 実行日時
- 実行キー
- 対象日
- GA4元A列
- 読み込みパス
- 読み込みPV
- 書き込みパス
- 書き込みPV
- 一致判定
- 備考
一致判定は、以下のようになります。
- OK:読み込みパスと書き込みパス、読み込みPVと書き込みPVが一致
- NG:パスまたはPVに差異あり
通常運用では、DebugシートでNGがないか確認することで、PV履歴への書き込みが正しく行われたか確認できます。
14. メニュー仕様
スプレッドシートを開いたとき、以下のカスタムメニューを追加します。
メニュー名:
記事PV管理
メニュー項目:
- 記事台帳のURLからタイトルを補完
- PV履歴のURLからタイトルを補完
- GA4→記事台帳/PV履歴を同期
通常のPV履歴作成では、3番目の GA4→記事台帳/PV履歴を同期 を実行します。
15. 通常運用手順
日次でPV履歴を更新する場合の基本手順は以下です。
- GA4からページ別PVデータを出力する
- GA4元スプレッドシートの
gas4シートにデータを用意する gas4シートのA8、A9、A10、C10、A11以降のデータを確認する- 記事台帳側スプレッドシートを開く
- メニュー
記事PV管理を開く GA4→記事台帳/PV履歴を同期を実行する- PV履歴に対象日列が追加されているか確認する
- 対象日のPVが書き込まれているか確認する
- 記事台帳で
未整理の新規記事がないか確認する - 新規記事があれば、主カテゴリ・従カテゴリ・状態を整理する
- DebugシートでNGがないか確認する
16. 注意点
16-1. 再実行しても次の1000件へ進む仕様ではない
このGASは、gas4 シートに存在するデータを読み込んで処理します。
そのため、GA4元シートに1000件しか存在しない場合、GASを再実行しても次の1000件が追加処理されるわけではありません。
1000件以上の記事を処理したい場合は、GA4元シート gas4 側に、必要な件数のデータをあらかじめ出力しておく必要があります。
16-2. PVが空白の記事について
PV履歴で対象日列が空白の記事は、主に以下の理由が考えられます。
- GA4元シート
gas4にその記事が存在しない - その日のPVが0でGA4に出力されていない
- GA4側の出力件数制限で含まれていない
- ページパスが記事台帳と一致していない
16-3. 新規記事はカテゴリ未設定で追加される
GA4側に存在し、記事台帳に存在しない記事は、自動で追加されます。
ただし、主カテゴリ・従カテゴリは空白です。
状態は 未整理 です。
そのため、PV同期後には、記事台帳上で新規記事のカテゴリ整理が必要です。
16-4. タイトル補完処理とPV同期処理は別
タイトル補完処理には、1回300件の処理上限があります。
一方、PV同期処理は、gas4 シートに存在するデータを読み込んでPV履歴へ反映します。
この2つは別処理です。
17. 主な関数一覧
| 関数名 | 役割 |
|---|---|
| syncGa4ToLedgerAndPv | GA4データを記事台帳・PV履歴へ同期するメイン関数 |
| getGa4Rows_ | GA4元スプレッドシートのgas4シートを読み込む |
| readLedgerMap_ | 記事台帳をページパス単位のMapとして読み込む |
| ensurePvDateColumn_ | PV履歴に対象日列を作成または取得する |
| writePvColumn_ | PV履歴へ記事別PVを書き込む |
| appendDebugRows_ | Debugシートへ実行結果を追記する |
| fillLedgerTitlesFromUrl | 記事台帳のURLからタイトルを補完する |
| fillPvTitlesFromUrl | PV履歴のURLからタイトルを補完する |
| fillTitlesFromUrlBySheet_ | 指定シートのURLからタイトルを取得する共通処理 |
| extractPagePathFromUrlOrPath_ | URLまたはページパスから照合用ページパスを抽出する |
| normalizePagePath_ | ページパスを照合用に正規化する |
| extractSlug_ | ページパスからスラッグを抽出する |
| isUsableTitle_ | 使用可能なタイトルか判定する |
| normalizeTitleForCompare_ | タイトル比較用に文字列を正規化する |
| extractSpreadsheetIdLoose_ | URLまたは文字列からスプレッドシートIDを抽出する |
18. まとめ
このGASは、GA4のページ別PVデータをもとに、TECNの記事台帳とPV履歴を自動更新するための管理用GASです。
主な役割は、以下の3つです。
- GA4のPVデータをPV履歴に日別で記録する
- GA4側に存在するが記事台帳にないページを新規記事として追加する
- タイトル変更や処理結果を履歴・Debugとして確認できるようにする
新規記事は 未整理 として追加されるため、PV同期後にカテゴリ整理を行うことで、記事台帳・PV履歴・カテゴリ集計の精度を維持できます。


```



コメント