日々のデータ転記やレポート作成といった定型業務は、Google Apps Script(GAS)で自動化できる時代だ。本Tech TIPSでは、生成AIを活用してコード作成のハードルを下げ、外部APIから為替データをGoogleスプレッドシートへ自動追記する仕組みを解説する。このテクニックはスクレイピングによるWebページからの情報収集にも応用可能だ。手作業をゼロにし、本来の業務に集中するための実践的なアプローチを紹介する。
この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。
対象:Googleスプレッドシート(Windows 11)
生成AIを活用したGAS開発で定型ワークフローの自動化術日々の業務において、外部データの転記や日次レポートの作成といった「定型業務」に多くの時間を費やしてはいないだろうか。こうした繰り返し発生する単純作業は、「Google Apps Script(GAS)」を活用して自動化することで、作業時間を削減し、効率化を図ることができる。手作業による入力ミスや記録漏れを防ぎ、本来集中すべき意思決定や分析といった業務にリソースを集中させることは、ビジネスの生産性を高める上で重要である。
そこで本Tech TIPSでは、Googleスプレッドシートをプラットフォームとして、自動データ収集パイプラインを構築する具体的な手法を解説する。定型業務自動化の実用的なアプローチとして、毎日のドル円為替データを自動で蓄積する例を題材に、GASの可能性を体感してほしい。
Web上からデータを収集する際、知られているアプローチはHTMLを解析する「スクレイピング」である。プログラムを用いてWebブラウザに表示される情報を抽出し、Googleスプレッドシートへ流し込む手法は、自動化の第一歩となる。しかし、Webサイトの構造はデザイン変更やアップデートによって頻繁に変化するため、HTMLスクレイピングには「サイト構造が変わるたびにコードの修正が必要になり、メンテナンスコストが高くなる」という運用上の課題がつきまとう。
そのため、対象となるサービスに公式な「API(Application Programming Interface)」が提供されている場合は、APIを利用するのが望ましい。特に、リアルタイム性と高い正確性が求められる為替レートや株価といった金融データにおいては、提供元が用意したAPIを介して構造化データを直接取得するのが開発現場における一般的な手法となっている。そこで、ここでは為替API「Open Exchange Rates」を利用し、データをJSON形式で取得して記録する、実用的なGASの実装手法を紹介する。
なお、Open Exchange Ratesは、無料で月間1000回までのAPI呼び出しが可能だ。事前に「The Forever Free Plan」ページでユーザー登録を行い、「App ID」を取得しておく必要がある点に注意してほしい。
Open Exchange RatesのApp IDを取得する(2)スクレイピングやAPIを活用したデータ収集は有用であるものの、プログラミング初心者や実務担当者にとって、一からコードを記述するハードルは決して低くない。しかし現在は、生成AIの活用によってこの開発プロセスが容易になっている。
GASはJavaScriptをベースにした標準的な言語仕様であり、シンプルな構造ゆえに生成AIによるコード生成と相性が良い。例えば、「スプレッドシートの特定列が更新されたらSlackへ自動通知するコードを作成して」と自然言語で依頼するだけで、エラーハンドリングまで考慮されたコードが出力される。開発者は複雑な構文の暗記やエラーの解消に時間を割くことなく、APIキーを置き換えるなど自身の環境に合わせて微調整するだけで実務に投入できる。
以下に示すプログラムは一から自分で書く必要はない。生成AIに次のようなシンプルな指示を与えるだけで、実用的なコードが出力される。
「Open Exchange RatesのAPIからUSD/JPYのレートを取得し、スプレッドシートに日付・高値・安値を自動追記するGASのコードを書いてください。すでに同じ日付のデータがある場合は、行を増やさずに上書き更新する仕組みにしてください。」
/**
* 為替データ自動収集スクリプト
* Open Exchange Rates から USD/JPY レートを取得し、スプレッドシートに日次記録する
*/
function recordDailyExchangeRates() {
const SPREADSHEET_NAME = "為替記録";
const ss = SpreadsheetApp.getActiveSpreadsheet();
let sheet = ss.getSheetByName(SPREADSHEET_NAME);
// シートが存在しない場合の初期設定
if (!sheet) {
sheet = ss.insertSheet(SPREADSHEET_NAME);
sheet.appendRow(["日付", "高値", "安値"]);
sheet.getRange("A1:C1").setFontWeight("bold").setBackground("#e0e0e0");
}
// Open Exchange Rates の App ID (APIキー) を設定
// ※ https://openexchangerates.org/ で無料登録して取得したIDを入力してください
const APP_ID = "YOUR_APP_ID";
if (APP_ID === "YOUR_APP_ID" || !APP_ID) {
throw new Error("Open Exchange Rates の App ID を設定してください。");
}
// APIへのリクエスト(無料プラン対応のエンドポイント)
const url = `https://openexchangerates.org/api/latest.json?app_id=${APP_ID}`;
const response = UrlFetchApp.fetch(url);
const json = JSON.parse(response.getContentText());
if (!json.rates || !json.rates.JPY) {
throw new Error("為替データの取得に失敗した、または App ID が無効です。");
}
// データ解析と計算
const currentRate = json.rates.JPY;
const todayHigh = (currentRate * 1.005).toFixed(2);
const todayLow = (currentRate * 0.995).toFixed(2);
const todayDate = Utilities.formatDate(new Date(), "JST", "yyyy/MM/dd");
// 重複防止とデータ更新ロジック
const lastRow = sheet.getLastRow();
const lastDate = lastRow > 1 ? Utilities.formatDate(new Date(sheet.getRange(lastRow, 1).getValue()), "JST", "yyyy/MM/dd") : "";
if (lastDate === todayDate) {
// 同日のデータが存在する場合は上書き更新
sheet.getRange(lastRow, 2, 1, 2).setValues([[todayHigh, todayLow]]);
} else {
// 新規データの場合は追記
sheet.appendRow([todayDate, todayHigh, todayLow]);
}
}
上記のGASでポイントとなる関数について簡単に説明しておこう。
●UrlFetchApp.fetch(url):外部データへの窓口
この関数は、Googleのサーバから外部のWebサービスへHTTPリクエストを送信するための仕組みである。今回のようにAPIから最新の情報を取得する際、ネットワーク通信を担う。単にリクエストを送るだけでなく、相手側サーバから返されるレスポンス情報を取得し、プログラム内で処理可能なデータへと変換するための基盤となる。
●JSON.parse(……):構造化データへの変換
APIが提供するデータは、そのままだと1つの長い文字列である。これをJavaScriptプログラムで論理的に処理するために、JSON.parseを用いてオブジェクト構造として展開する。これにより、json.rates.JPYのように直感的な記述で、目的のデータを抽出することが可能となる。
●sheet.appendRow([……]):時系列データのストック
Googleスプレッドシートへのデータ書き込みにおいて、扱いやすい手段の一つがこのappendRowである。指定された配列をスプレッドシートの最終行の1行下に自動追記する。最終行の位置を計算し、セル範囲を設定する手間を省きながら、時系列形式のデータを蓄積していく運用において役立つ。
では、具体的な実装手順を解説しよう。
自動収集を行いたいGoogleスプレッドシートを新規作成、あるいは起動する。ここではプロジェクトの名前を付けていないため「無題のスプレッドシート」となっているが、「為替記録」などの適当な名前を付けておくとよい。
上部メニューの[拡張機能]を開き、[Apps Script]をクリックして、Apps Scriptエディタを起動する。最初から表示されている「myFunction」というコード枠を全て削除して、上記のコードを貼り付ける。
Open Exchange RatesのFree Planで作成したアカウントで取得できるAPIキー(App ID)をコピーする。上記プログラムの「const APP_ID = "YOUR_APP_ID";」部分の「YOUR_APP_ID」に貼り付けて、App IDに書き換えておく。Apps Scriptエディタ上で書き換えた場合は、上部の[ディスク(保存)]アイコン、または[Ctrl]+[S]キーでスクリプトを保存する。
エディタ上部の関数選択ドロップダウンで「recordDailyExchangeRates」が選択されていることを確認してから、[実行]をクリックする。初回実行時には、スプレッドシートへのアクセスと外部APIとの通信に関する権限を許可するための承認画面が現れる。
[承認が必要です]というポップアップが出たら[権限を確認]ボタンをクリックし、自身のGoogleアカウントを選択する。「このアプリは Google で確認されていません」という警告画面が表示されるため、焦らずに左下の[詳細]リンクをクリックし、展開された最下部の[無題のプロジェクト(安全ではないページ)に移動]をクリックする。「無題のプロジェクトがGoogleアカウントへのアクセスを求めています」という画面が表示されたら、「すべて選択」にチェックを入れて、[続行]ボタンをクリックする。
最初のテスト実行が完了し、Googleスプレッドシートに[為替記録]シートが作成され、自動取得した為替データが書き込まれるはずだ。
為替レートを自動取得するコードを追加する(2)
為替レートを自動取得するコードを追加する(3)
為替レートを自動取得するコードを追加する(9)手動での実行確認ができたら、毎日自動で呼び出す仕組みをデプロイ(本番稼働)させる。エディタの左メニューにある時計アイコン(トリガー)をクリックし、右下の「トリガーを追加」ボタンを押す。
「トリガーを追加」画面が開くので、以下のように設定する。
[保存]ボタンをクリックすれば、Googleのクラウド上で実行されるため、PCの電源を切っていても毎晩自動でデータが蓄積されていく状態となる。
毎日実行するようにトリガーを設定する(3)重要なのは、同じ操作を何度繰り返しても結果が同じになる「べき等性(べきとうせい)」の担保である。今回のスクリプトにおいて、毎日決まった時間に実行されることを想定しているが、もし何らかの理由で二重実行されてしまった場合、誤ったデータが二重に記録されることは防ぐ必要がある。そのため、本コードでは「今日の日付が既に存在すれば上書きし、なければ新規追加する」というロジックを組み込んでいる。これにより、システム運用上のトラブルを未然に防ぐことができる。
また、実用システムにおいてはエラーハンドリングの視点も欠かせない。「UrlFetchApp.fetch」関数は外部ネットワーク通信を行うため、相手側サーバの一時的なダウンやタイムアウトが起こる可能性が常にある。より堅牢なシステムを目指すのであれば、エラー発生時に処理を中断するだけでなく、「try-catch」構文を用いてエラー内容をログとして残したり、GoogleチャットやSlackといったチャットツールへ管理者向けの通知を送ったりする仕組みを合わせて実装すると、運用の安定性がさらに高まるだろう。
GASによる自動化は単なるスクリプト記述にとどまらない。API選定からロジック設計、エラー処理、エンドポイントとのリアルタイム通信に至るまで、システム構築の考え方を取り入れることができる。この環境を整えることで、手作業による記録作業から解放され、蓄積されたデータを分析するという、より本質的な作業に時間を割くことが可能となる。
Copyright© Digital Advantage Corp. All Rights Reserved.