【GAS×JavaScript】ボタンのクリック数をスプレッドシートに記録する方法

Webサイトのボタンが押された回数をスプレッドシートに記録できますか?

はい。Google Apps ScriptをWebアプリとして公開し、ボタンのJavaScriptからPOST通信を送れば、クリックのたびにB1セルの数値を1増やせます。この記事では、同時クリックによる記録漏れを防ぐ処理も加えます。

「このボタンは何回押されたのだろう?」という簡単な利用状況を、Googleスプレッドシートへ記録する仕組みを作ります。GAS側とWebサイト側の両方を、画像付きで順番に設定します。

記録したクリック数をWebサイトにも表示したい場合は、この記事の設定後にスプレッドシートの値をWebサイトに表示する方法を追加できます。

用途の範囲
この方法は簡易的なクリック状況の把握向けです。URLを知る人なら通信を送れるため、個人情報、金額、正確な課金・成果計測など、改ざんされると困るデータには使わないでください。
目次

仕組みと準備するもの

Webページのボタンを押すと、JavaScriptのfetch()がGASのWebアプリへPOST通信を送ります。GASは通信を受け取り、スプレッドシートのB1セルを読み取って1を加えます。

用意するもの役割
GoogleスプレッドシートB1セルにクリック数を保存する
Apps ScriptWebサイトからの通信を受けて数値を増やす
ボタンを置くWebページクリック時にGASへPOST通信を送る

新しいスプレッドシートを開き、A1セルに「クリック数」などの見出しを入力します。B1セルは空欄または0にしてください。

B1セルにクリック数を記録するスプレッドシート

スプレッドシートからApps Scriptを開く

スプレッドシートの「拡張機能」→「Apps Script」を選びます。このシートにひも付いたApps Scriptプロジェクトが開きます。

スプレッドシートの拡張機能メニューからApps Scriptを開く操作

GAS側のコードを保存する

Code.gsに最初から入っているコードを消し、次のコードへ置き換えます。

function doPost() {
  const guard = LockService.getScriptLock();
  guard.waitLock(10000);
  try {
    const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
    const cell = sheet.getRange("B1");
    const metricNum = Number(cell.getValue()) || 0;
    cell.setValue(metricNum + 1);
    return ContentService.createTextOutput("ok");
  } finally {
    guard.releaseLock();
  }
}

プロジェクト名は「Apps Click Count」など、用途が分かる名前に変更します。コードを貼り付けたら、上部の保存ボタンを押すか、保存済みの表示になったことを確認してください。

LockServiceは、複数人がほぼ同時にボタンを押したとき、同じ数値を読み取って上書きする競合を抑えます。ロックを取得できない状態が10秒続くと、その通信はエラーになります。

Webアプリとしてデプロイする

保存したApps Scriptを、Webサイトから呼び出せるWebアプリとして公開します。Google側の画面文言は更新されることがありますが、設定する内容は同じです。

  1. STEP1
    新しいデプロイを開く

    画面右上の「デプロイ」→「新しいデプロイ」を選びます。

    Apps Scriptのデプロイメニューから新しいデプロイを選ぶ画面
  2. STEP2
    種類でウェブアプリを選ぶ

    「種類の選択」の横にある歯車を押し、「ウェブアプリ」を選びます。

    新しいデプロイの種類でウェブアプリを選ぶ画面
  3. STEP3
    実行ユーザーとアクセス範囲を設定する

    説明には「ボタンのクリック数を記録」などを入力します。「次のユーザーとして実行」は自分、「アクセスできるユーザー」は公開サイトから使える範囲に設定し、「デプロイ」を押します。

    ウェブアプリの説明と実行ユーザーとアクセス範囲を設定する画面

    Google Workspaceの管理設定によっては、組織外を含む公開範囲を選べない場合があります。その場合は管理者のポリシーに従ってください。

  4. STEP4
    初回のアクセスを承認する

    初回は承認を求められます。「アクセスを承認」を押し、このプロジェクトを作成したGoogleアカウントを選びます。

    新しいデプロイでアクセスの承認を求める画面
    Apps Scriptと連携するGoogleアカウントを選ぶ画面

    自分で作った未確認のApps Scriptでは、Googleの確認画面が表示されることがあります。「詳細」を開く前に、プロジェクト名と利用中のアカウントが自分のものか確認してください。

    自作Apps ScriptのGoogle未確認画面で詳細を確認する操作
    自分で作成したApps Scriptのプロジェクトへ進む確認画面

    最後に、要求されている権限がスプレッドシートへのアクセスなど今回の目的と一致することを確認して許可します。自分で作成していないプロジェクトや、目的に合わない権限が表示された場合は進めないでください。

    Apps Scriptが要求する権限の内容を確認して許可する画面
  5. STEP5
    ウェブアプリのURLをコピーする

    デプロイが完了したら、「ウェブアプリ」欄にあるURLをコピーします。公開ページから使うURLは/execで終わるものです。

    デプロイ完了画面でウェブアプリのURLをコピーする操作

公開設定で注意すること

公開サイトの匿名ユーザーから記録するには、アクセス範囲を広くする必要があります。その代わり、ウェブアプリのURLを知っている人や自動プログラムもクリック数を増やせます。

  • フォームの氏名、住所、メールアドレスを保存しない
  • 金額、注文数、投票結果など正確性が必要な用途に使わない
  • この数値だけで課金や成果報酬を決めない
  • ウェブアプリのURLを必要以上に公開・共有しない

厳密な計測が必要な場合は、認証、サーバー側の検証、不正送信の制限などを備えた別の仕組みを利用してください。

Webサイト側にボタンを設置する

次のHTMLを、ボタンを表示したい場所へ設置します。

<button class="metric-button" type="button">クリック!</button>

続いてJavaScriptを設置し、★GASのURL★を先ほどコピーした/exec URLへ置き換えます。

const gasUrl = "★GASのURL★";
const metricButton = document.querySelector(".metric-button");

metricButton.addEventListener("click", async function () {
  metricButton.disabled = true;
  try {
    await fetch(gasUrl, { method: "POST", mode: "no-cors" });
  } catch (error) {
    alert("送信できませんでした。");
  } finally {
    metricButton.disabled = false;
  }
});

送信中はボタンを一時的に無効化し、同じ人が短時間に連打しにくくしています。ただし、ページを開き直したり別のプログラムからURLへ通信したりする操作までは防げません。

no-corsでは成功結果を読めません
ブラウザからPOST通信は送れますが、JavaScript側ではGASが返す本文やHTTPエラーを確認できません。エラー表示が出なかったことだけで記録成功とは判断せず、シートの数値とApps Scriptの実行履歴を確認してください。

ボタンを押して動作確認する

  1. 1B1セルを空欄または0にする
  2. 2Webページのボタンを1回押す
  3. 3数秒待ち、B1セルが1になったことを確認する
  4. 4もう一度押し、B1セルが2になることを確認する
  5. 5Apps Script左側の「実行数」でdoPostが完了していることを確認する

シートを開いたまま数値が変わらない場合は、ページを再読み込みして確認します。ブラウザの開発者ツールでは通信自体も確認できますが、no-corsの応答は内容を読み取れない「opaque」として扱われます。

記録されないときの確認

ボタンを押してもB1セルが増えない

URLが/devではなく/execで終わるか、JavaScriptのURLを置き換えたか、アクセス範囲が公開ページの閲覧者に合っているかを確認します。

コードを直したのに動作が変わらない

保存だけでは公開版へ反映されません。「デプロイ」→「デプロイを管理」から編集を開き、新しいバージョンとして更新します。

原因が分からない

Apps Script左側の「実行数」を開き、失敗したdoPostのエラー内容を確認します。B1セルが保護されていないか、対象シートが開いているシートと一致するかも確認してください。

まとめ

  • スプレッドシートのB1セルへクリック数を保存する
  • GASのdoPost()がPOST通信を受け、数値を1増やす
  • LockServiceで同時書き込みによる記録漏れを抑える
  • Webサイト側はfetch()/exec URLへ通信する
  • 成功はシートの数値とApps Scriptの実行履歴で確認する
  • 誰でも数値を増やせるため、簡易的な利用状況の把握に限定する

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次