🕸️ GASクローラー実践:為替レートと株価データの自動取得

多くの人はGoogle Apps Script(GAS)がスプレッドシートのセル操作だけに使えると思っています。 しかし実際には、GASには超強力な武器が内蔵されています:UrlFetchAppです。

これを使えば、Googleスプレッドシートが「インターネットに接続」して世界中のデータを取得できるようになります!さらにGASの無料**時間トリガー(Time-driven Triggers)**を組み合わせれば、「毎日自動実行」するクローラーロボットをゼロコストで構築可能です。

本章では実践的なクローラーを作成し、毎朝9時に台湾銀行から最新の米ドル為替レートを取得し、スプレッドシートに書き込む方法を学びます。


1. 究極の武器 UrlFetchApp を理解する

通常のJavaScriptではAPI呼び出しにfetch()axiosを使います。 しかしGAS環境ではfetchが使えず、代わりにGoogle専用のUrlFetchApp.fetch()が用意されています。

基本構文:

// ウェブページのHTMLソースを取得(クローリング)
var response = UrlFetchApp.fetch("https://example.com");
var html = response.getContentText();

// APIを呼び出してJSONを取得
var apiResponse = UrlFetchApp.fetch("https://api.exchangerate-api.com/v4/latest/USD");
var data = JSON.parse(apiResponse.getContentText());

2. 実践:台湾銀行の米ドル為替レートAPIを取得

ネット上には無料の為替レートAPIが多数あります。ここでは公開APIを利用して「1米ドル=何台湾ドル」を取得するデモを行います。

手順1:スプレッドシート作成とGASエディタ起動

  1. 新しいGoogleスプレッドシートを作成し、「私の財務ダッシュボード」と命名
  2. A1セルに「日付」、B1セルに「米ドル為替レート」と入力
  3. 上部メニューから拡張機能 > Apps Scriptをクリック

手順2:クローラースクリプト作成

以下のコードをCode.gsに貼り付け:

// メインプログラム:データ取得とスプレッドシート書き込み
function fetchDailyExchangeRate() {
  // 1. 取得対象APIのURL指定(無料公開の為替API)
  var apiUrl = "https://api.exchangerate-api.com/v4/latest/USD";
  
  try {
    // 2. リクエスト発行でデータ取得
    var response = UrlFetchApp.fetch(apiUrl);
    var jsonString = response.getContentText();
    
    // 3. テキストをJavaScriptオブジェクトに変換
    var data = JSON.parse(jsonString);
    
    // 4. データから「米ドル対台湾ドル(TWD)」レートを抽出
    var usdToTwd = data.rates.TWD;
    
    // データがない場合のエラーハンドリング
    if (!usdToTwd) {
      Logger.log("TWD為替レートデータが見つかりません!");
      return;
    }
    
    Logger.log("本日の米ドル為替レート:" + usdToTwd);
    
    // 5. スプレッドシート書き込み用データ準備:[今日の日付, 為替レート]
    var today = new Date();
    // 日付をYYYY/MM/DD形式にフォーマット
    var dateString = Utilities.formatDate(today, Session.getScriptTimeZone(), "yyyy/MM/dd");
    
    // 6. データをスプレッドシートの最終行に追加
    appendToSheet(dateString, usdToTwd);
    
  } catch (error) {
    Logger.log("クローラーエラー発生:" + error.toString());
  }
}

// スプレッドシート書き込みヘルパー関数
function appendToSheet(date, rate) {
  // 現在バインドされているスプレッドシートとシート1を取得
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheets()[0];
  
  // 最終行にデータを追加(配列[A列, B列]で渡す)
  sheet.appendRow([date, rate]);
  
  Logger.log("✅ データ書き込み成功!");
}

手順3:手動テスト

上部の「実行」ボタンをクリック(関数はfetchDailyExchangeRateを選択)。 初回実行時、Googleは「外部ネットワーク接続」の権限要求警告を表示します。 「権限を確認 > アカウント選択 > 詳細 > 移動(安全でない)」をクリックして権限を許可してください。

権限付与後、Googleスプレッドシートに戻ると、2行目に本日の日付と米ドル為替レートが自動入力されているのを確認できます!


3. 上級クローリングテクニック:HeadersやUser-Agentの偽装

金融サイトによってはボットアクセスをブロックする場合があります。その際は通常のブラウザを装ったり、特定のAPIキーを追加する必要があります。

UrlFetchAppの第二引数で詳細設定(Options)を渡せます:

function fetchWithHeaders() {
  var url = "https://pro-api.coinmarketcap.com/v1/cryptocurrency/quotes/latest?symbol=BTC";
  
  var options = {
    "method": "get",
    // 特定ブラウザのみ許可するサイトにはUser-Agentを追加
    // 有料APIならAPIキーを追加
    "headers": {
      "X-CMC_PRO_API_KEY": "YOUR_API_KEY_HERE",
      "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
    },
    // 404/500エラー時にプログラムがクラッシュするのを防ぐ(デフォルトではエラー抛出)
    "muteHttpExceptions": true 
  };

  var response = UrlFetchApp.fetch(url, options);
  Logger.log(response.getContentText());
}

💡 実践の落とし穴: 台湾のサイト(PTTや証券取引所など)をクロールする場合、エンコーディングをUTF-8やBig5に変換するのを忘れないでください!そうしないとHTMLが文字化けします。


4. 究極の自動化:時間トリガー(Time-driven Triggers)設定

コードは完成しましたが、毎朝自分で「実行」ボタンを押すわけにはいきませんよね? Googleのサーバーに毎朝決まった時間にこのコードを実行させる「アラーム」を設定しましょう。

  1. GASエディタの左メニューで「時計」アイコン(トリガー)をクリック
  2. 右下の青いボタン**トリガーを追加(Add Trigger)**をクリック
  3. 以下のように設定:
    • 実行する関数:fetchDailyExchangeRate
    • 実行するデプロイ:Head
    • イベントソース:時間主導型(Time-driven)
    • 時間ベースのトリガータイプ:日付ベースのタイマー(Day timer)
    • 時間:午前9時~10時
  4. 保存をクリック

完成!🎉

これで毎朝9時過ぎに、Googleのサーバーがバックグラウンドでクローラープログラムを起動し、APIから最新の米ドル為替レートを取得し、スプレッドシートに整然と入力してくれます!

これが自動化エンジニアのロマンです。一度コードを書けば、機械が一生働いてくれます。 次章ではこのクローラーを発展させ、データ取得後にLINEメッセージをあなたのスマホに自動送信する方法を学びます!

完全なチュートリアルをロック解除

このチャプターは有料コンテンツです。プロジェクトに参加して、10以上の神レベルのPromptや実際のソースコード例を含む、5000字以上の深い分析をロック解除してください!