森田 嶺

UrlFetchAppを徹底解説!GASで外部APIと連携してできること7選

UrlFetchAppを徹底解説!GASで外部APIと連携してできること7選サムネイル画像

Google Apps Script(GAS)は、GoogleスプレッドシートやGmail、GoogleフォームといったGoogleのサービスを自動化できる強力なツールです。その中でも、外部のWebサービスと連携する際に欠かせないのがUrlFetchAppサービスです。

UrlFetchAppを使いこなせば、GASの可能性はさらに広がります。たとえば、スプレッドシートのデータを外部のチャットツールに通知したり、Webサイトの情報を自動で収集したり、AIサービスと連携して高度な処理を行ったりと、まさに「かゆいところに手が届く」自動化が実現できます。

本記事では、UrlFetchAppの基本的な使い方から、実用的な応用例までを網羅的に解説します。

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をマスターし、私たちの業務をより豊かで生産的なものにしていきましょう。

森田 嶺
森田 嶺
大学卒業後、 AWS や Google Cloud 等、主にクラウドを基盤とした新規サービス開発の経験を経て、YOSHIDUMIに入社。Google ドライブ拡張サービス「Cmosy」「共有ドライブマネージャー」等、 Google Cloud を活用した自社サービスの開発に従事。現在、 Google 等が提供する生成AIを活用したサービスを開発中。
ぶっちゃけどうなの? 経験者が語るグループウェア移行の落とし穴セミナー

13:00-14:00 オンライン

ぶっちゃけどうなの? 経験者が語るグループウェア移行の落とし穴セミナー

詳細はこちら

データはすべてドライブへ!Google ドライブ運用まるわかりセミナー

14:00-15:00 オンライン

データはすべてドライブへ!Google ドライブ運用まるわかりセミナー

詳細はこちら

Google Workspace ユーザー必見! AppSheet & Google Apps Script 連携で実現する業務改善セミナー

14:00-15:00 オンライン

Google Workspace ユーザー必見! AppSheet & Google Apps Script 連携で実現する業務改善セミナー

詳細はこちら

価格比較だけで損してない?Google Workspaceの真価を引き出す導入&代理店選びセミナー

13:00-14:00 オンライン

価格比較だけで損してない?Google Workspaceの真価を引き出す導入&代理店選びセミナー

詳細はこちら

非エンジニア歓迎!基礎から活用シーンまで学べる! AppSheet を使った現場 DX 入門セミナー

14:00-15:00 オンライン

非エンジニア歓迎!基礎から活用シーンまで学べる! AppSheet を使った現場 DX 入門セミナー

詳細はこちら

Gemini と NotebookLM でビジネスを加速! ~ Google Workspace との連携で実現する、生産性向上と DX 推進~

14:00-15:00 オンライン

Gemini と NotebookLM でビジネスを加速! ~ Google Workspace との連携で実現する、生産性向上と DX 推進~

詳細はこちら

まだ AI 導入で消耗してる?2025 年最新「生成 AI 標準搭載」Gemini vs Copilot 徹底比較

14:30-15:00 オンライン

まだ AI 導入で消耗してる?2025 年最新「生成 AI 標準搭載」Gemini vs Copilot 徹底比較

詳細はこちら

オンラインセミナー開催中

お申込みはこちらをCheck!

関連する他の記事をよむ