GASのUrlFetchAppで
外部APIと連携する方法|GET・POST・認証
UrlFetchApp(GASから外部URLにHTTPリクエストを送るサービス)を使えば、GASから天気・為替・チャットツール・自社システムなどのWeb APIと連携できます。GETでの取得、POSTでの送信、認証、エラー処理まで動くコードで解説します。
Table of Contents
UrlFetchAppとは(できること)
UrlFetchAppは、GASから外部のURLにHTTPリクエスト(Web上でデータをやり取りする通信)を送るためのサービスです。 これを使うと、GASがスプレッドシートやGmailの中だけで完結せず、外の世界の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 / deletepayload… 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を組み込んだ業務自動化までご相談いただけます。 内容が固まっていなくても大丈夫です。現在の業務・課題をお聞きした上でご提案します。