GASのUrlFetchAppで
外部APIと連携する方法|GET・POST・認証

GAS (Apps Script)UrlFetchApp .fetch(url, options)method / payload / headersを options で指定HTTP requestresponse (JSON)External Web APIgetResponseCode()getContentText()200 → 成功 / 4xx・5xx → エラーJSON.parse で扱える

UrlFetchApp(GASから外部URLにHTTPリクエストを送るサービス)を使えば、GASから天気・為替・チャットツール・自社システムなどのWeb APIと連携できます。GETでの取得、POSTでの送信、認証、エラー処理まで動くコードで解説します。

|対象: GAS UrlFetchApp / fetch / fetchAll / 外部API連携

Table of Contents

UrlFetchAppとは(できること)

UrlFetchAppは、GASから外部のURLにHTTPリクエスト(Web上でデータをやり取りする通信)を送るためのサービスです。 これを使うと、GASがスプレッドシートやGmailの中だけで完結せず、外の世界のAPIとつながります。

主な用途

為替・天気などの外部データ取得
Slack・LINEへの通知送信
自社システムのAPI連携
AI APIの呼び出し

基本の形はUrlFetchApp.fetch(url, options)の1行です。第1引数にURL、第2引数に「GETかPOSTか」「送るデータ」「認証ヘッダー」などの設定オブジェクトを渡します。 返ってきたレスポンスから、本文やステータスコードを取り出して使います。

GETでデータを取得しJSONに変換する

いちばん多いのが、APIからデータを「取得する」GETリクエストです。fetchの第2引数を省略するとGETになります。多くのAPIはJSON文字列を返すので、getContentText()で本文を取り出し、JSON.parse()でオブジェクトに変換します。

function fetchExchangeRate() {
  // GETリクエスト(method を省略すると get になる)
  const url = 'https://api.example.com/v1/rates?base=JPY';
  const response = UrlFetchApp.fetch(url);

  // レスポンス本文(文字列)を取り出す
  const text = response.getContentText();

  // JSON文字列をオブジェクトに変換して使う
  const data = JSON.parse(text);

  Logger.log(data.rates.USD); // 例: 0.0064
  return data;
}

URLの末尾に?base=JPYのように付く部分がクエリパラメータ(検索条件)です。値に日本語や記号が入る場合はencodeURIComponent()で変換してから連結すると文字化けや不正なURLを防げます。

optionsでリクエストを細かく制御する

第2引数のoptionsで、リクエストの挙動を細かく指定できます。実務でよく使うのはmuteHttpExceptionsです。これをtrueにすると、エラー応答でも例外で止まらず、自分でステータスコードを確認できます。

function fetchWithOptions() {
  const url = 'https://api.example.com/v1/users';

  const options = {
    method: 'get',
    // 例外を投げず、ステータスコードを自分で確認する
    muteHttpExceptions: true,
    // リダイレクトを自動で追わない場合は false
    followRedirects: true,
  };

  const response = UrlFetchApp.fetch(url, options);
  Logger.log(response.getResponseCode()); // 200 など
  Logger.log(response.getContentText());
}

よく使う options キー

  • method … get / post / put / delete
  • payload … POSTなどで送るデータ本体
  • contentType … 送るデータの形式(例: application/json)
  • headers … 認証トークンなどのリクエストヘッダー
  • muteHttpExceptions … エラーで止めず自分で判定する

POSTでデータを送信する

データを登録・送信するときはPOSTを使います。JSONを送るAPIが多いので、contentType'application/json'にして、送るオブジェクトをJSON.stringify()で文字列にしてからpayloadに渡すのが定番です。

function postJson() {
  const url = 'https://api.example.com/v1/tasks';

  const body = {
    title: '見積書を作成する',
    dueDate: '2026-08-01',
    done: false,
  };

  const options = {
    method: 'post',
    contentType: 'application/json',
    // オブジェクトは JSON.stringify で文字列にして送る
    payload: JSON.stringify(body),
    muteHttpExceptions: true,
  };

  const response = UrlFetchApp.fetch(url, options);
  const code = response.getResponseCode();

  if (code === 200 || code === 201) {
    const created = JSON.parse(response.getContentText());
    Logger.log('登録成功: ' + created.id);
  } else {
    Logger.log('登録失敗(' + code + '): ' + response.getContentText());
  }
}

フォーム形式(application/x-www-form-urlencoded)で受け付けるAPIの場合は、contentTypeを省略し、payload に{ title: '...', done: 'false' }のようにオブジェクトをそのまま渡します。GAS側が自動でフォーム形式に組み立ててくれます。

APIキー・Bearerトークンで認証する

多くのAPIは、リクエストヘッダーに認証情報を付ける必要があります。もっとも多いのがAuthorization: Bearer トークンの形式です。headersに指定します。

function fetchWithAuth() {
  // APIキーはコードに直書きせず、PropertiesService から読む
  const token = PropertiesService
    .getScriptProperties()
    .getProperty('API_TOKEN');

  const url = 'https://api.example.com/v1/me';

  const options = {
    method: 'get',
    headers: {
      // Bearer トークン認証
      Authorization: 'Bearer ' + token,
      Accept: 'application/json',
    },
    muteHttpExceptions: true,
  };

  const response = UrlFetchApp.fetch(url, options);
  Logger.log(response.getResponseCode());
  return JSON.parse(response.getContentText());
}

APIキーはコードに直書きしない

APIキーをコード内に直接書くと、共有時やGitへの公開時に漏れる危険があります。PropertiesServiceに保存して読み込むのが安全です。詳しくはAPIキーをPropertiesServiceに安全に保存する方法で解説しています。

エラー処理とステータスコードの確認

外部APIは、必ず成功するとは限りません。muteHttpExceptions: trueを付けたうえでgetResponseCode()でステータスコードを確認し、成功・失敗を自分で分岐します。200番台が成功、400番台はリクエスト側の問題、500番台はサーバー側の問題です。

function fetchSafely(url) {
  const options = { method: 'get', muteHttpExceptions: true };
  const response = UrlFetchApp.fetch(url, options);
  const code = response.getResponseCode();

  // 200番台だけを成功として扱う
  if (code >= 200 && code < 300) {
    return JSON.parse(response.getContentText());
  }

  // それ以外はエラーとして扱い、内容をログに残す
  if (code === 429) {
    Logger.log('レート制限。時間をおいて再実行してください');
  } else if (code >= 500) {
    Logger.log('サーバー側エラー(' + code + ')');
  } else {
    Logger.log('リクエストエラー(' + code + '): '
      + response.getContentText());
  }
  return null;
}

429(レート制限)や503などは、少し時間をおいて再実行すると成功することがあります。一定回数まで自動で待って再送する「指数バックオフ」を組み合わせると、大量呼び出しでも安定します。

fetchAllで複数リクエストを高速化する

複数のURLを叩くとき、fetchをforループで1件ずつ呼ぶと、件数分だけ待ち時間が積み重なります。UrlFetchApp.fetchAll()にリクエストの配列を渡すと、まとめて並行実行して大幅に速くなります。

function fetchManyUrls() {
  const urls = [
    'https://api.example.com/v1/items/1',
    'https://api.example.com/v1/items/2',
    'https://api.example.com/v1/items/3',
  ];

  // リクエストの配列を作る
  const requests = urls.map(function (url) {
    return { url: url, method: 'get', muteHttpExceptions: true };
  });

  // まとめて並行実行(1件ずつ fetch するより速い)
  const responses = UrlFetchApp.fetchAll(requests);

  const results = responses.map(function (res) {
    if (res.getResponseCode() === 200) {
      return JSON.parse(res.getContentText());
    }
    return null;
  });

  Logger.log(results.length + '件取得しました');
  return results;
}

取得したデータはスプレッドシートに一括書き込みすると効率的です。1セルずつ書くのではなく、二次元配列にまとめてsetValues()で一度に書き込みます。

function saveApiResultToSheet() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet()
    .getSheetByName('データ');

  const response = UrlFetchApp.fetch(
    'https://api.example.com/v1/users',
    { method: 'get', muteHttpExceptions: true }
  );
  if (response.getResponseCode() !== 200) return;

  const users = JSON.parse(response.getContentText());

  // API のレスポンスを二次元配列にして一括書き込み
  const rows = users.map(function (u) {
    return [u.id, u.name, u.email];
  });

  if (rows.length > 0) {
    sheet.getRange(2, 1, rows.length, 3).setValues(rows);
  }
}

実務での注意点

1. 1日あたりの呼び出し回数に上限がある

UrlFetchには1日あたりの呼び出し回数の割り当て(クォータ)があり、無料アカウントとGoogle Workspaceアカウントで上限が異なります。大量に呼ぶ処理ではCacheServiceで結果を一時保存し、同じAPIを何度も叩かない設計にします。

2. 6分の実行時間制限に注意

GASの1回の実行は原則6分までです。1件ずつfetchを大量に回すと制限に達しやすくなります。fetchAllでまとめる、処理を分割してトリガーで続きから再開する、といった工夫が有効です。

3. 文字化けはgetContentTextの文字コード指定で対処

APIやWebページがUTF-8以外(Shift_JISなど)を返すと文字化けします。getContentText('Shift_JIS')のように文字コードを指定すると正しく読めます。

4. 初回実行時に承認(認可)が必要

UrlFetchAppを使うスクリプトは、初回実行時に外部接続の承認を求められます。 画面の指示に従って許可すれば以降は不要です。承認をコードで省略することはできません。

まとめ

UrlFetchApp.fetch(url, options)の1行を起点に、GASは外部APIと自由に連携できます。GETで取得し、POSTで送信し、headersで認証し、muteHttpExceptionsでエラーを制御する——この4つを押さえれば、たいていのAPI連携は実装できます。

取得

GET + getContentText + JSON.parse

送信

POST + payload + contentType

安定運用

muteHttpExceptions + fetchAll + キャッシュ

よくある質問

GASから外部のWeb API(天気・為替・チャットツール・自社システムのAPIなど)にアクセスしてデータを取得したり送信したりするときに使います。UrlFetchApp.fetch(url) で指定したURLにHTTPリクエストを送り、返ってきたレスポンスをコードで処理できます。スプレッドシートのデータを外部サービスへ連携する自動化の土台になります。

データを取得するだけならGET、データを送信・登録するならPOSTを使うのが基本です。GASでは fetch の第2引数に { method: 'get' } または { method: 'post', payload: ... } を渡して切り替えます。method を省略するとGETになります。POSTでJSONを送るときは contentType を 'application/json' にし、payload を JSON.stringify() で文字列化します。

多くのAPIはリクエストヘッダーに認証情報を付けます。fetch の options に headers: { Authorization: 'Bearer ' + token } のように指定します。APIキーをコードに直接書くのは避け、PropertiesService に保存して読み込むのが安全です。GitHubなどにコードを公開してもキーが漏れません。

options に muteHttpExceptions: true を付けます。これを付けないと400・500番台のレスポンスで例外が投げられて処理が止まります。付けておけば例外にならず、getResponseCode() でステータスコードを自分で確認して分岐できます。200番台なら成功、それ以外はエラー内容をログに残す、といった制御ができます。

UrlFetchApp.fetchAll(requests) を使います。リクエストの配列を渡すと、複数のHTTPリクエストをまとめて並行実行します。1件ずつ fetch をループで呼ぶより大幅に速くなります。ただし件数が多いと1日の呼び出し上限や実行時間に影響するため、必要な件数だけに絞るのが実務のコツです。

はい。GASにはURL Fetchの1日あたりの呼び出し回数の割り当て(クォータ)があり、無料アカウントとGoogle Workspaceアカウントで上限が異なります。大量に呼ぶ処理では、CacheServiceで結果を一時保存して同じAPIを何度も叩かない、fetchAllでまとめる、といった設計で呼び出し回数を抑えるのが安全です。

外部API連携・GAS開発を
相談する。

外部サービスのAPI連携、既存システムとのデータ連携、AI APIを組み込んだ業務自動化までご相談いただけます。 内容が固まっていなくても大丈夫です。現在の業務・課題をお聞きした上でご提案します。