【GAS×JS】スプレッドシートの情報を取得してサイトに表示する方法

前回、Google Apps Script(GAS)+ JavaScript を連携し、Webサイトのボタンクリック数をGoogleスプレッドシートに記録する方法を紹介しました。

今回は、スプレッドシートに保存したデータをWebサイトに表示する方法を紹介します。

実装例
現在のカウント: 読み込み中…
メッセージ: 読み込み中…
取得先のスプレッドシート
(カウントは10の時)
  • スプレッドシートのB1、B2セルのデータを取得して、カウント数とメッセージを表示する。
  • ボタンをクリックすると、スプレッドシートのカウント数が増える。
    カウント数を記録する方法については 前回記事 にて紹介済
目次

準備するもの(前回と同じ)

  • Googleスプレッドシート(B1とB2セルのデータをWebサイトに表示)
  • GAS(Webアプリとして公開)
  • Webサイト(HTML+JavaScript)
    • JavaScriptでクリックイベントをGASに送信

スプレッドシートとGASの設定

前回作成したのスプレッドシートの2行目に、以下のような内容を記述します。

  • A2:メッセージ
  • B2:Hello World(このセルに保存した内容をWebサイトに表示させます)

続いてスプレッドシートの「拡張機能」→「Apps Script」を開き、以下のコードを記述します。(前回作成したdoPost()関数の下に、doGet()関数を追記しました。)

// WebアプリにPOSTリクエストが来たときに実行される関数(前回作成済分)
function doPost(e) {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var range = sheet.getRange("B1");

  // 現在の値を取得。空だった場合は0として扱う
  var count = range.getValue() || 0;

  // カウントを1増やして、その値をB1セルに設定
  count += 1;
  range.setValue(count);

  // スプレッドシートへの変更を即時反映
  SpreadsheetApp.flush();

  // 応答として、更新後の数値をテキストで返す
  return ContentService
    .createTextOutput(String(count))  // 数値を文字列に変換して返す
    .setMimeType(ContentService.MimeType.TEXT);
}

// WebアプリにGETリクエストが来たときに実行される関数
function doGet(e) {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  
  // B1とB2の値を取得
  var count = sheet.getRange("B1").getValue() || 0;
  var message = sheet.getRange("B2").getValue() || "";
  
  // JSON形式でデータを返す
  return ContentService
    .createTextOutput(JSON.stringify({
      count: count,
      message: message
    }))
    .setMimeType(ContentService.MimeType.JSON);
}

コード記載後、保存するのを忘れないように。

コードを記載して保存したら、再びデプロイを行います(すでに公開済の場合でも、コードを更新したら新しくデプロイしなければなりません)。

  1. 「デプロイ」→「新しいデプロイ」
  2. 「歯車マーク」→「ウェブアプリ」
  3. 「設定」を以下の通り入力
    • 新しい説明:ボタンのクリック数をカウント
    • 次のユーザーとして実行:自分
    • アクセスできるユーザー:全員
  4. 「デプロイ」をクリック
    • 初めてデプロイする場合はアクセスを許可
  5. 「ウェブアプリ」のURLをコピー
画像付きの手順(前回記事のもの)はこちら
step 1
step 2
step 3
step 4
step 5
step 6
step 7
step 8
step 9
step 10
step 11

以上でスプレッドシート(GAS)側の設定は完了です。

(補足)アプリの公開設定について

この記事では、Google Apps Script(GAS)を「全員」に公開して、ボタンのクリック数をスプレッドシートに記録しています。クリック数の記録だけであれば、特別な情報を扱わないためセキュリティ上の大きな心配は不要です。ただし、次のようなケースでは注意が必要です。

  • 入力フォームの内容を保存する場合
  • 金額や個人情報に関わる処理を行う場合
  • 他の人に改ざんされると困る情報を扱う場合

必要に応じて、アクセス制御(例:トークン認証)や公開範囲の見直しも検討してみてください。

Webサイトの設定(HTML+JavaScript でGASに送信)

以下を自分のWebサイトやブログに設置します。
★GASのURL★ の部分は、先ほどコピーしたURLに差し替えてください。

<div class="container">
  <div class="count-display">
    現在のカウント: <span id="current-count">読み込み中...</span>
  </div>
  <div class="message">
    メッセージ: <span id="message">読み込み中...</span>
  </div>
  <button id="count-button">クリック!</button>
</div>
// GASで発行したWebアプリのURLをここに貼り付けてください
const SHEET_URL = "★GASのURL★";

// データを取得して表示する関数
async function fetchAndDisplayData() {
  try {
    // GETリクエストでデータを取得
    const response = await fetch(SHEET_URL);
    const data = await response.json();
    
    // 取得したデータを表示
    document.getElementById("current-count").textContent = data.count;
    document.getElementById("message").textContent = data.lastUpdate || "未更新";
  } catch (error) {
    console.error("データの取得に失敗しました:", error);
    document.getElementById("current-count").textContent = "エラー";
    document.getElementById("message").textContent = "エラー";
  }
}

// ページ読み込み時にデータを取得
fetchAndDisplayData();

// クリック数をカウントする関数(前回作成済分)
document.getElementById("count-button").addEventListener("click", () => {
  // fetch関数でPOSTリクエストを送る(GASが受け取ってカウント)
  fetch(SHEET_URL, { method: "POST" })
    .catch(() => {
      // 通信に失敗した場合のエラーハンドリング
      alert("送信エラーが発生しました");
    });
});

以上で設定完了です。Webサイトにスプレッドシートのデータが表示されるかどうか、またボタンをクリックしてプレッドシートにクリック数が記録されるかどうか、確認してみてください!

まとめ

Webアプリケーションの基本機能
  • doPostとdoGetの2つの主要なエンドポイントを実装
  • スプレッドシートをデータストアとして活用
カウンター機能の実装
  • B1セルにカウンター値を保存
  • 空のセルの場合は0として初期化
  • POSTリクエストごとにカウントを1増加
データの永続化
  • SpreadsheetApp.flush()を使用して即時反映
  • スプレッドシートをデータベースとして活用することで、データの永続性を確保
レスポンス形式の最適化
  • POSTリクエスト:単純なテキスト形式でカウント値を返却
  • GETリクエスト:JSON形式で複数のデータ(カウントとメッセージ)を返却

これで、スプレッドシートの情報を取得&変更という基本機能を実装できました。ぜひ応用してみてください!


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