Google Apps Script(GAS)外部API連携の基本|初心者がつまずくリクエスト・レスポンス・認証を完全解説

DX

はじめに|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のアクセス先URLhttps://api.example.com/data
メソッドリクエストの種類GET(取得)、POST(送信)
パラメータリクエストに付加する条件・情報?city=tokyo&lang=ja
Headerリクエストの付加情報(認証情報等)Authorization: Bearer xxx
PayloadPOSTリクエストで送るデータ本体{"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における必須の作法です。

スクリプトプロパティの設定手順:

  1. GASエディタ左メニューの「プロジェクトの設定」を開く
  2. 「スクリプト プロパティ」セクションで「プロパティを追加」
  3. プロパティ名に 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時など)に設定できます。

  1. GASエディタ上部の「時計アイコン(トリガー)」をクリック
  2. 「トリガーを追加」を選択
  3. 実行する関数(fetchAndWriteToSheet)を選択
  4. 「時間主導型」→「日タイマー」→実行時刻を設定
  5. 保存して完了

これにより、毎日決まった時刻にAPIからデータが取得され、スプレッドシートが自動更新されます。


GAS外部API連携でよくあるエラーと注意点

エラーと対処法

初心者がつまずきやすいエラーとその対処法を整理します。

エラー・症状原因対処法
Exception: Request failedURLが間違っている 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はデータ送信。optionsmethodで切り替える
  • パラメータはURLに付加、認証情報はHeaderに設定、送信データはPayloadに設定する
  • APIキーは必ずスクリプトプロパティで管理する。コードへの直書きは不正利用・情報漏洩に直結する
  • レスポンスはgetResponseCode()で200を確認してからJSON.parse()でオブジェクト化する
  • GASには1日のURL取得回数・実行時間の制限があるため、大量処理は分割設計が必要
  • 取得データの再配布や個人情報の送信は、利用規約・社内ポリシーの確認が前提

「まず天気APIやSlack Webhookなど、認証が簡単なAPIで試してみる」——この一歩が、GASを使ったDX推進・業務自動化の出発点になります。


次のステップ|GASを使った業務自動化・API連携を相談する

「自社の業務にGASとAPI連携を活用したいが、実装が難しい」「どのAPIと連携すれば業務が効率化できるか相談したい」とお考えの方は、以下のフォームからお気軽にご相談ください。

GAS開発・業務自動化・DX推進の支援実績を持つ専門チームが、貴社の課題に合わせた最適な実装プランをご提案します。

    タイトルとURLをコピーしました