はじめに|GASで外部APIを使えると、何が変わるのか
「Googleスプレッドシートのデータを自動で外部サービスに送りたい」「毎朝APIから最新データを取得してシートに書き込む作業を自動化したい」「SlackやChatworkに自動通知を飛ばしたい」——こうした業務自動化の要望に、GAS(Google Apps Script)と外部API連携は強力な答えを提供します。
GASはGoogleが提供する無料のスクリプト実行環境で、スプレッドシート・Gmail・Googleカレンダーなどのサービスをコードで操作できます。さらに、UrlFetchAppというGAS標準機能を使えば、外部のWebサービスやAPIとデータをやり取りできます。
しかし、初心者にとってAPI連携は「リクエスト」「レスポンス」「JSON」「認証」といった専門用語の壁が高く、最初の一歩が踏み出しにくい領域です。本記事では、GASで外部APIに接続するための基本概念から実装コードまでを、初心者でも理解できるように解説します。
GASと外部API連携の基礎知識
APIとは何か?初心者向けに整理する
API(Application Programming Interface)とは、異なるソフトウェア同士がデータをやり取りするための「窓口」です。たとえば、天気予報サービスのAPIにアクセスすれば、今日の気温データを自分のスプレッドシートに自動で取り込めます。
API連携の基本的な流れは以下のとおりです。
GAS(自分のコード)
↓ リクエスト(「このデータをください」)
外部APIサーバー
↓ レスポンス(「はい、このデータです」)
GAS(データを受け取り、スプレッドシートに書き込む等)
GASでAPI連携に使う主要な概念
GASで外部API連携を実装する前に、以下の用語を整理しておくと理解がスムーズです。
| 用語 | 意味 | 具体例 |
|---|---|---|
| エンドポイント | APIのアクセス先URL | https://api.example.com/data |
| メソッド | リクエストの種類 | GET(取得)、POST(送信) |
| パラメータ | リクエストに付加する条件・情報 | ?city=tokyo&lang=ja |
| Header | リクエストの付加情報(認証情報等) | Authorization: Bearer xxx |
| Payload | POSTリクエストで送るデータ本体 | {"name": "田中", "email": "..."} |
| JSON | データの形式(人間にも読みやすい) | {"temperature": 25, "city": "Tokyo"} |
| レスポンス | APIから返ってくるデータ | 取得したJSON形式のデータ |
| 認証 | APIへのアクセス権を証明する仕組み | APIキー、OAuth、Bearer Token |
UrlFetchAppの基本:GASでAPIリクエストを送る
UrlFetchAppとは
UrlFetchAppは、GASが外部URLにHTTPリクエストを送るための標準クラスです。これ一つで、GETリクエスト(データ取得)もPOSTリクエスト(データ送信)も実装できます。
基本的な構文は以下のとおりです。
const response = UrlFetchApp.fetch(url, options);
url:アクセス先のAPIエンドポイントoptions:メソッド・Header・Payloadなどの設定(省略可)response:APIから返ってきたレスポンスオブジェクト
GETリクエスト:外部APIからデータを取得する
GETリクエストの基本コード
GETリクエストは「データを取得する」操作です。レスポンスコードを確認してからJSONをパースする、実務に耐えうる実装は以下のとおりです。
function getApiData() {
// エンドポイントURLとパラメータを設定
const url = 'https://api.example.com/users?limit=10&page=1';
// GETリクエストを実行(optionsを省略するとデフォルトでGET)
const response = UrlFetchApp.fetch(url);
// レスポンスコードを確認してから処理する(必須)
const statusCode = response.getResponseCode();
if (statusCode !== 200) {
console.log('APIエラー: ステータスコード ' + statusCode);
return;
}
// レスポンスをJSON形式に変換して取得
const json = JSON.parse(response.getContentText());
// ログに出力して確認
console.log(json);
}
コードのポイント解説:
?limit=10&page=1の部分が「パラメータ」です。?以降にキー=値の形式で条件を付加しますresponse.getResponseCode()でHTTPステータスコードを確認します。200以外の場合はAPIがエラーを返しているため、JSON.parse()を実行する前に処理を中断します。この確認を省くと、エラーレスポンスをパースしようとして予期しない箇所でスクリプトが停止しますJSON.parse()で文字列をJavaScriptのオブジェクトに変換します
Headerを使った認証付きGETリクエスト
多くのAPIはアクセス制限のために「APIキー」や「Bearer Token」による認証を必要とします。HeaderにAPIキーを設定する実装は以下のとおりです。
function getApiDataWithAuth() {
const url = 'https://api.example.com/data';
// APIキーはスクリプトプロパティから取得する(必須の作法)
const apiKey = PropertiesService.getScriptProperties().getProperty('API_KEY');
// optionsオブジェクトでHeaderを設定
const options = {
method: 'GET',
headers: {
'Authorization': 'Bearer ' + apiKey,
'Content-Type': 'application/json'
}
};
const response = UrlFetchApp.fetch(url, options);
if (response.getResponseCode() !== 200) {
console.log('APIエラー: ' + response.getResponseCode());
return;
}
const json = JSON.parse(response.getContentText());
console.log(json);
}
⚠️ APIキーの直書きは厳禁です APIキーをコード内に直接記述した場合、スクリプトを共有した際や、誤ってコードを公開した際に第三者に漏洩します。有料APIの不正利用や、連携先サービスの個人情報流出に直結する重大なセキュリティリスクです。必ずGASの「スクリプトプロパティ」にAPIキーを保存し、
PropertiesService.getScriptProperties().getProperty('API_KEY')で取得する方式を採用してください。これはGASにおける必須の作法です。
スクリプトプロパティの設定手順:
- GASエディタ左メニューの「プロジェクトの設定」を開く
- 「スクリプト プロパティ」セクションで「プロパティを追加」
- プロパティ名に
API_KEY、値に実際のAPIキーを入力して保存
POSTリクエスト:外部APIにデータを送信する
POSTリクエストの基本コード
POSTリクエストは「データを送信する」操作です。SlackへのWebhook通知やフォームデータの送信に使います。
function postApiData() {
const url = 'https://hooks.slack.com/services/YOUR/WEBHOOK/URL';
// 送信するPayload(本体データ)をJSON形式で作成
const payload = JSON.stringify({
text: 'GASからSlackへの自動通知テストです!'
});
// optionsでメソッド・Header・Payloadを設定
const options = {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
payload: payload
};
// POSTリクエストを実行
const response = UrlFetchApp.fetch(url, options);
if (response.getResponseCode() !== 200) {
console.log('送信失敗: ' + response.getResponseCode());
return;
}
console.log('送信成功');
}
コードのポイント解説:
JSON.stringify()でJavaScriptオブジェクトをJSON文字列に変換してからPayloadに設定しますContent-Type: application/jsonは「JSONを送ります」という宣言です。この設定がないとAPIが正しくデータを受け取れないケースがあります
⚠️ 個人情報をPayloadに含める場合の注意 顧客名・メールアドレスなどの個人情報を外部APIに送信する行為は、「個人情報の第三者提供」に該当する可能性があります。社内のセキュリティポリシーおよびプライバシーポリシーに抵触しないかを、実装前に必ず確認してください。
実践:APIで取得したデータをスプレッドシートに自動書き込みする
GAS × API × スプレッドシートの連携コード
GASの真価は、API連携とスプレッドシート操作を組み合わせた業務自動化にあります。以下は、外部APIからデータを取得してスプレッドシートに書き込む実践的なコード例です。
function fetchAndWriteToSheet() {
// APIキーはスクリプトプロパティから取得
const apiKey = PropertiesService.getScriptProperties().getProperty('API_KEY');
const url = 'https://api.example.com/products';
const options = {
method: 'GET',
headers: {
'Authorization': 'Bearer ' + apiKey
}
};
const response = UrlFetchApp.fetch(url, options);
// ステータスコードを確認してからパース
if (response.getResponseCode() !== 200) {
console.log('取得失敗: ' + response.getResponseCode());
return;
}
const json = JSON.parse(response.getContentText());
// スプレッドシートを取得
const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
// ヘッダー行を設定
sheet.getRange(1, 1, 1, 3).setValues([['商品ID', '商品名', '価格']]);
// データを配列化してから一括書き込み(setValuesはループ外で1回のみ実行)
const rows = json.products.map(product => [
product.id,
product.name,
product.price
]);
sheet.getRange(2, 1, rows.length, 3).setValues(rows);
console.log(rows.length + '件のデータを書き込みました');
}
トリガーで自動実行する設定手順
GASのトリガー機能を使えば、このコードを定期実行(毎朝9時など)に設定できます。
- GASエディタ上部の「時計アイコン(トリガー)」をクリック
- 「トリガーを追加」を選択
- 実行する関数(
fetchAndWriteToSheet)を選択 - 「時間主導型」→「日タイマー」→実行時刻を設定
- 保存して完了
これにより、毎日決まった時刻にAPIからデータが取得され、スプレッドシートが自動更新されます。
GAS外部API連携でよくあるエラーと注意点
エラーと対処法
初心者がつまずきやすいエラーとその対処法を整理します。
| エラー・症状 | 原因 | 対処法 |
|---|---|---|
Exception: Request failed | URLが間違っている or APIが落ちている | エンドポイントURLを再確認、APIの稼働状況を確認 |
| レスポンスコード 401 | 認証エラー(APIキーが間違い or 期限切れ) | APIキーを再発行、Headerの設定を確認 |
| レスポンスコード 403 | アクセス権限がない | APIの利用プランやスコープを確認 |
| レスポンスコード 429 | リクエスト回数の超過(レート制限) | リクエスト間隔を空ける、Utilities.sleep()を使う |
| JSONのパースエラー | レスポンスがJSON形式でない or ステータスコードが200以外 | getResponseCode()で確認後にパースする |
SyntaxError | コードの文法ミス | エラー行を確認、括弧・クォートの対応をチェック |
GASのクォータ(実行制限)に注意する
GASには以下の実行制限があります。大量データを扱う際は事前に把握しておく必要があります。
| 制限の種類 | 一般アカウントの上限 |
|---|---|
| URLフェッチ回数(1日あたり) | 20,000回 |
| 1回のスクリプト実行時間 | 6分 |
| トリガーによる実行時間(1日あたり) | 90分 |
大量のレコードを処理する場合は、1回の実行で処理する件数を分割し、Utilities.sleep()で実行間隔を設けるなどの対策が必要です。
認証方式の種類と設定方法
外部APIの認証方式は複数あります。利用するAPIのドキュメントを確認し、対応する方式でHeaderを設定してください。
| 認証方式 | Headerの設定例 | 主な用途 |
|---|---|---|
| APIキー | 'x-api-key': 'YOUR_KEY' | 多くのWebサービスAPI |
| Bearer Token | 'Authorization': 'Bearer TOKEN' | OAuth2.0対応サービス |
| Basic認証 | 'Authorization': 'Basic ' + Utilities.base64Encode('user:pass') | 旧来のシステム |
利用規約の確認を忘れずに
APIから取得したデータを自社サービスで公開したり、第三者に再配布したりする場合は、APIを提供しているサービスの利用規約に違反しないかを事前に確認してください。多くのAPIには「データの再配布禁止」や「商用利用の制限」が明記されています。利用規約への違反はアカウント停止や法的リスクにつながります。
まとめ|GAS外部API連携で業務自動化を加速する
GASとUrlFetchAppを組み合わせることで、外部サービスとのデータ連携・通知・自動集計を、プログラミング初心者でも実装できます。
本記事のポイントを整理します。
UrlFetchApp.fetch(url, options)がGASでAPIリクエストを送る基本構文- GETはデータ取得、POSTはデータ送信。
optionsのmethodで切り替える - パラメータはURLに付加、認証情報はHeaderに設定、送信データはPayloadに設定する
- APIキーは必ずスクリプトプロパティで管理する。コードへの直書きは不正利用・情報漏洩に直結する
- レスポンスは
getResponseCode()で200を確認してからJSON.parse()でオブジェクト化する - GASには1日のURL取得回数・実行時間の制限があるため、大量処理は分割設計が必要
- 取得データの再配布や個人情報の送信は、利用規約・社内ポリシーの確認が前提
「まず天気APIやSlack Webhookなど、認証が簡単なAPIで試してみる」——この一歩が、GASを使ったDX推進・業務自動化の出発点になります。
次のステップ|GASを使った業務自動化・API連携を相談する
「自社の業務にGASとAPI連携を活用したいが、実装が難しい」「どのAPIと連携すれば業務が効率化できるか相談したい」とお考えの方は、以下のフォームからお気軽にご相談ください。
GAS開発・業務自動化・DX推進の支援実績を持つ専門チームが、貴社の課題に合わせた最適な実装プランをご提案します。
