UrlFetchAppの基本を徹底解説
まずはUrlFetchAppがどのようなもので、どうやって使うのか、その基本をしっかりと押さえていきましょう。
UrlFetchAppとは何か
UrlFetchAppは、GASから外部のウェブサイトやAPIに対してHTTPリクエストを送信し、そのレスポンスを受け取るためのサービスです。簡単に言えば、「GASの世界からインターネットの世界へアクセスするための入口」のようなものです。ユーザーはUrlFetchAppを通じて、世界中の多種多様なWeb API(Application Programming Interface)と対話し、データを取得したり、送信したりすることができます。
基本的な使い方を理解する
最もシンプルな使い方は、fetch()関数にアクセスしたいURLを指定するだけです。
JavaScript function basicFetch() { // アクセスしたいWebサービスのURL const url = 'https://www.example.com/'; // UrlFetchAppのfetch関数にURLを指定して、レスポンスを取得 const response = UrlFetchApp.fetch(url); // レスポンスのHTMLコンテンツをログに出力 Logger.log(response.getContentText()); // レスポンスコード(200なら成功)をログに出力 Logger.log(response.getResponseCode()); }
|
このコードは、指定したURLにGETリクエストを送信し、返ってきたレスポンスをHTTPResponseオブジェクトとして受け取ります。このコードで利用した各メソッドの説明は以下の通りです。
メソッド
|
説明
|
getContentText()
|
レスポンスのボディを文字列として取得します。最近のAPI連携では、JSON形式のデータが返ってくることが多いです。
|
getResponseCode()
|
HTTPステータスコードを取得します。200であればリクエストが成功したことを意味します。
|
より高度な制御はoptionsパラメータを利用する
実用的なAPI連携では、単にURLにアクセスするだけでなく、より詳細な設定が必要になります。そこで登場するのがfetch()メソッドの第2引数であるoptionsパラメータです。
Javascript function advancedFetch() { // アクセスしたいWebサービスのURL const url = 'https://api.example.com/data'; // 本来はAPIトークンはPropertiesServiceで管理した方が良い const token = 'YOUR_API_TOKEN'; // APIに対して細かくパラメータを指定可能 const options = { 'method': 'post', // GET, POST, PUT, DELETEなどを指定 'contentType': 'application/json', 'headers': { 'Authorization': 'Bearer ' + token }, 'payload': JSON.stringify({ 'user': 'John Doe', 'message': 'Hello, API!' }), 'muteHttpExceptions': true // エラー時に例外をスローしない };
const response = UrlFetchApp.fetch(url, options);
// ... レスポンス処理 ... }
|
optionsで指定できる主なパラメータを見ていきましょう。
プロパティ
|
説明
|
method
|
HTTPメソッドを指定します(get, post, put, deleteなど)。デフォルトはgetです。
|
payload
|
POSTやPUTリクエストで送信するデータを指定します。通常、オブジェクトをJSON.stringify()で文字列に変換して渡します。
|
headers
|
HTTPヘッダーをオブジェクト形式で指定します。APIキーを使った認証(Authorization)やコンテンツタイプの指定(Content-Type)によく使われます。
|
contentType
|
payloadのMIMEタイプを指定します。application/jsonやapplication/x-www-form-urlencodedなどがよく使われます。
|
muteHttpExceptions
|
trueに設定すると、4xx(クライアントエラー)や5xx(サーバーエラー)のようなHTTPエラーが発生しても例外でスクリプトが停止せず、レスポンスを返します。getResponseCode()と組み合わせて自前でエラーハンドリングをする際に必須です。
|
レスポンスのJSONをパースする
APIから返されるデータの多くはJSON形式です。getContentText()で取得したJSON文字列は、JSON.parse()を使うことでGASで扱いやすいオブジェクトに変換できます。
JavaScript function parseJsonResponse() { // 例として、以下のようなJSONが返ってくると仮定 // {"id": 123, "name": "Taro Yamada", "isActive": true} const jsonString = '{"id": 123, "name": "Taro Yamada", "isActive": true}'; // JSON.parse()を利用して、文字列をオブジェクトに変換する const data = JSON.parse(jsonString); Logger.log(data.name); // "Taro Yamada" と出力される Logger.log(data.isActive); // true と出力される }
|
注意点とベストプラクティス
UrlFetchAppは非常に強力ですが、利用する上でいくつか注意すべき点があります。これらを守ることで、安定的で安全なスクリプトを運用できます。
APIキーなどの機密情報の管理
APIキーやアクセストークンをコード内に直接書き込むのは非常に危険です。スクリプトが第三者に閲覧された場合、情報が漏洩してしまいます。 その場合は、PropertiesServiceを使いましょう。
PropertiesServiceは、スクリプトごとに安全に情報が保存できる仕組みです。以下のコードはGASコードでPropertiesServiceを利用する例になりますが、GASのWebコンソールから直接プロパティを設定することも可能です。GASのスクリプトエディタ > 「プロジェクトの設定」>「スクリプトプロパティ」からプロパティを直接保存することができます。
JavaScript // 保存 PropertiesService.getScriptProperties().setProperty('SLACK_WEBHOOK_URL', 'https://hooks.slack.com/services/...'); // 取得 const webhookUrl = PropertiesService.getScriptProperties().getProperty('SLACK_WEBHOOK_URL');
|
APIの利用回数制限(レートリミット)
多くのAPIには、短時間にアクセスできる回数の上限(レートリミット)が設けられています。ループ処理などで連続してAPIを呼び出すと、この制限に達してしまい、一時的にアクセスをブロックされることがあります。 その場合は、Utilities.sleep()を使って、リクエストの間に適切な待機時間を設けましょう。
JavaScript for (let i = 0; i < 100; i++) { // APIを呼び出す処理 UrlFetchApp.fetch(url, options);
// 1秒待機する Utilities.sleep(1000); }
|
エラーハンドリング
API連携は、ネットワークの問題や相手サーバーの都合で失敗することがあります。エラーが発生した際にスクリプトが途中で停止しないように、適切に処理する必要があります。 その場合はoptionsの muteHttpExceptions: trueとtry...catchブロックを組み合わせて、エラーハンドリングを実施し、必要であればリトライ処理を実装しましょう。
JavaScript
function robustFetch() { const url = 'https://api.example.com/invalid-endpoint'; const options = { 'muteHttpExceptions': true }; try { const response = UrlFetchApp.fetch(url, options); const code = response.getResponseCode(); if (code === 200) { // 成功時の処理 Logger.log('Success!'); } else { // APIエラー時の処理 Logger.log(`Error: Status Code ${code}, Response: ${response.getContentText()}`); } } catch (e) { // ネットワークエラーなど、fetch自体が失敗した場合の処理 Logger.log(`Fetch failed: ${e.message}`); } }
|
キャッシュの活用
同じリクエストを何度も行う場合、結果を一時的に保存しておくことで、APIへのリクエスト回数を減らし、処理を高速化できます。 その場合は、CacheServiceを使いましょう。頻繁に変わらないデータ(例: ユーザーリストなど)の取得に適しています。
JavaScript function fetchWithCache() { const cache = CacheService.getScriptCache(); const cacheKey = 'weather_data_tokyo'; let cached = cache.get(cacheKey); if (cached != null) { // キャッシュがあればそれを使う return JSON.parse(cached); } // キャッシュがなければAPIから取得 const response = UrlFetchApp.fetch(weather_api_url); const data = response.getContentText(); // 結果をキャッシュに保存(例: 1時間) cache.put(cacheKey, data, 3600); return JSON.parse(data); }
|
GASで外部APIと連携してできること7選
それでは、UrlFetchAppを使って具体的にどのようなことができるのか、実用的な10個の例を見ていきましょう。ただ、あくまで本章は、どのようなことがUrlFetchAppで実現できるかをイメージしてもらうことが目的であるため、業務では利用できないようなコードも含まれます。
① Slackへの自動通知
スプレッドシートの特定セルが編集されたり、Googleフォームが送信されたりしたタイミングで、Slackの指定チャンネルにメッセージを自動投稿できます。 具体的なユースケースとしては、問い合わせ通知、タスク完了報告、エラー監視などがあります。
コード例(Incoming Webhooksを使用)
JavaScript function postToSlack() { // Webhook URLに置き換えてください const webhookUrl = 'https://hooks.slack.com/services/XXX/YYY/ZZZ'; const message = 'こんにちは!これはGASから送信されたメッセージです。';
const payload = { text: message };
const options = { method: 'post', contentType: 'application/json', payload: JSON.stringify(payload) };
const response = UrlFetchApp.fetch(webhookUrl, options); Logger.log(response.getContentText()); }
|
② LINEへのプッシュ通知
個人のLINEやLINEグループに、GASからプッシュ通知を送れます。 具体的なユースケースとしては、定期リマインダー、個人のタスク通知、家族への連絡などがあります。
コード例(LINE Notifyを使用)
JavaScript function sendLineNotify() { // ここにLINE Notifyのトークンを貼り付ける const token = 'YOUR_ACCESS_TOKEN'; const message = 'これはGASから送信されたLINE通知です。';
const options = { method: 'post', headers: { 'Authorization': 'Bearer ' + token }, payload: { message: message } }; const response = UrlFetchApp.fetch('https://notify-api.line.me/api/notify', options); Logger.log(response.getContentText());
}
|
③ 天気予報の取得と記録
OpenWeatherMapなどの天気予報APIを使い、指定した都市の天気情報を取得し、スプレッドシートに毎日自動で記録できます。 具体的なユースケースとしては、イベント企画の参考、農業や漁業でのデータ収集、旅行計画などがあります。
コード例(OpenWeatherMap API)
JavaScript function getWeatherData() { const apiKey = 'YOUR_OPENWEATHERMAP_API_KEY'; const city = 'Tokyo'; const url = `https://api.openweathermap.org/data/2.5/weather?q=${city}&appid=${apiKey}&units=metric&lang=ja`;
const response = UrlFetchApp.fetch(url); const data = JSON.parse(response.getContentText());
const weather = data.weather[0].description; const temp = data.main.temp;
// スプレッドシートに書き込む処理 const sheet = SpreadsheetApp.getActiveSheet(); sheet.appendRow([new Date(), city, weather, temp]); }
|
④ ChatGPT(OpenAI API)との連携
スプレッドシート上のテキストデータをOpenAIのAPIに送り、文章の要約、翻訳、アイデア出し、分類などを行うことができます。 具体的なユースケースとしては、大量のアンケート回答の要約、ブログ記事の自動生成、メール返信文の作成支援などがあります。
コード例(OpenAI API)
JavaScript function callChatGPT() { // 自分のAPIキーに置き換えてください const apiKey = 'sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'; const prompt = "日本の首都はどこですか?"; const url = "https://api.openai.com/v1/chat/completions";
const payload = { model: "gpt-3.5-turbo", messages: [ { role: "user", content: prompt } ], temperature: 0.7 };
const options = { method: "post", contentType: "application/json", headers: { Authorization: "Bearer " + apiKey }, payload: JSON.stringify(payload), muteHttpExceptions: true };
const response = UrlFetchApp.fetch(url, options); const result = JSON.parse(response.getContentText()); // レスポンス出力(内容を確認) Logger.log(result.choices[0].message.content); }
|
⑤ 為替レートの自動取得
無料で使える為替レートAPIを叩いて、最新のレート(例:USD/JPY)をスプレッドシートに記録します。 具体的なユースケースとしては、輸出入業務でのコスト計算、海外旅行の予算管理、金融資産の評価額計算などがあります。
コード例(ExchangeRate-API)
※以下のプログラムはコンテナバインドスクリプトを想定しています。書き込み先のスプレッドシートから[拡張機能]-[Apps Script]を選択し、ファイルに紐付けたGASプログラムを実行してください。
JavaScript function getExchangeRate() { const baseCurrency = 'USD'; const url = `https://open.er-api.com/v6/latest/${baseCurrency}`; const response = UrlFetchApp.fetch(url); const data = JSON.parse(response.getContentText());
const jpyRate = data.rates.JPY; Logger.log(`1 USD = ${jpyRate} JPY`); SpreadsheetApp.getActiveSheet().appendRow([new Date(), 'USD/JPY', jpyRate]); }
|
⑥ Webサイトの情報を定期的に取得(Webスクレイピング)
UrlFetchAppでWebページのHTMLを取得し、Parserライブラリなどと組み合わせて特定の情報を抽出します。具体的なユースケースとしては、競合サービスの価格調査、特定のキーワードを含むニュース記事の収集、セールの開始情報の監視などがあります。
※[注意]スクレイピングは相手サーバーに負荷をかける行為です。対象サイトの利用規約(robots.txtなど)を必ず確認し、良識の範囲内で行いましょう。
JavaScript function scrapeWebsiteTitle() { const rssUrl = "https://news.google.com/rss?hl=ja&gl=JP&ceid=JP:ja"; const response = UrlFetchApp.fetch(rssUrl); const xml = response.getContentText(); const document = XmlService.parse(xml); const root = document.getRootElement(); const channel = root.getChild("channel"); const items = channel.getChildren("item");
const newsList = items.map(item => { return { title: item.getChildText("title"), link: item.getChildText("link"), pubDate: item.getChildText("pubDate") }; });
Logger.log(newsList); }
|
⑦ Google翻訳APIとの連携
スプレッドシート上のテキストを、Google Cloudの翻訳APIを使って高精度に翻訳します。 具体的なユースケースとしては、多言語の問い合わせメールへの対応、海外向けドキュメントの翻訳作業の効率化などがあります。 GAS標準のLanguageAppを使えば翻訳処理は可能ですが、Google Cloudの翻訳APIの方が多くの言語に対応し、品質も高いのでオススメです。
コード例(Google Cloud Translation API)
JavaScript function translateText() { const apiKey = 'YOUR_GOOGLE_CLOUD_API_KEY'; const url = `https://translation.googleapis.com/language/translate/v2?key=${apiKey}`;
const textToTranslate = 'Hello, world!';
const payload = { 'q': textToTranslate, 'source': 'en', 'target': 'ja' };
const options = { 'method' : 'post', 'contentType': 'application/json', 'payload' : JSON.stringify(payload) };
const response = UrlFetchApp.fetch(url, options); const data = JSON.parse(response.getContentText());
const translatedText = data.data.translations[0].translatedText; Logger.log(translatedText); // 「こんにちは世界!」 }
|
まとめ
本記事では、GASのUrlFetchAppサービスについて、基本的な使い方から、Slack通知、ChatGPT連携、Webスクレイピングといった7つの実用的な活用例、そして安全に運用するための注意点までを詳しく解説しました。
UrlFetchAppは、Googleのサービスと外部の世界を繋ぐ架け橋です。この記事で紹介した例は、その可能性のほんの一部に過ぎません。世の中には数え切れないほどのAPIが公開されており、それらを組み合わせることで、あなたのアイデア次第でどんな自動化も実現できると思います。
まずは身近な業務の「ちょっとした不便」を解決するために、簡単なAPI連携から試してみてください。UrlFetchAppをマスターし、私たちの業務をより豊かで生産的なものにしていきましょう。