見出し画像

【GAS初心者講座#7】GAS初学者向け:HTTP通信・API入門 - 外部サービスとデータをやり取りする技術

こんにちは!ノンプロ研でGASコースのTAをしているTaroです。

今回は、GAS(Google Apps Script)で「HTTP通信・API」を学びます。外部サービスと連携する技術を習得します!この記事は、ノンプロ研初心者講座【GASコース】第7回の内容をもとに作成しています。

この記事で学べること

  • HTTP通信:インターネットを経由してデータをやり取りする仕組み

  • UrlFetchApp:HTTP通信を行うGASのサービス

  • JSON:データを交換するための形式

  • API:外部サービスをプログラムから操作する仕組み

  • 郵便番号API:実践的な外部サービスとの連携


なぜこの回が重要なのか?

これまでの6回で学んだこと:

  • 変数、制御構文、関数、配列、オブジェクト(第1-4回)

  • スプレッドシート操作(第5-6回)

でも、これだけではスプレッドシート内のデータしか扱えません。

今回学ぶHTTP通信とAPIで、できることが爆発的に広がります:

これまで:スプレッドシート内のデータだけ
今回から:インターネット上のあらゆるサービスと連携

具体例:

  • 郵便番号を入力すると、自動で住所を取得

  • 天気情報を毎朝自動取得してスプレッドシートに記録

  • SlackやChatworkに自動通知

  • 外部データベースと連携

  • 各種Webサービスのデータを取得・加工

実務での切実なニーズ: 「顧客リストに郵便番号だけ入力されている...住所を1件ずつ調べて入力するのは大変...自動化できないかな?」

→ この問題を解決するのが、今回学ぶ郵便番号APIです。


今日のゴール

3つの目標を達成しましょう:

目標1:HTTP通信の基本を理解する

  • リクエストとレスポンスの仕組み

  • UrlFetchApp.fetch()の使い方

  • ステータスコードとエラーハンドリング

目標2:JSONを扱えるようになる

  • JSONとは何か理解する

  • JSON.parse()でJSONをオブジェクトに変換

  • JSON.stringify()でオブジェクトをJSONに変換

目標3:実践的なAPIを使う

  • 郵便番号APIを使って住所を取得

  • スプレッドシートに連携

  • カスタム関数を作成

この3つができれば、GASで「外の世界」とつながります。
あなたのGASスキルは、次のステージに進みます。


アジェンダ

  1. HTTP通信とUrl Fetchサービス - Webの仕組みを理解する

  2. POSTリクエストとJSON - データを送信・受信する

  3. API - 外部サービスを活用する


第1部:HTTP通信とUrl Fetchサービス

このセクションでできるようになること

  • HTTP通信の仕組み(リクエストとレスポンス)を理解する

  • UrlFetchApp.fetch()でWebページを取得する

  • GETリクエストとPOSTリクエストの違いを理解する

  • ステータスコード(200, 404, 500など)を読み取る

  • try...catch文でエラーを適切に処理する

実務での例: 「Webサイトが正常に動いているか定期的にチェックして、エラーが出たら通知する」 → これがHTTP通信とエラーハンドリングで実現できます。


HTTP通信とは?

HTTP通信とは、インターネットを経由して通信をする様式です。

HTTP = Hyper Text Transfer Protocol
「ハイパーテキストを転送するルール」という意味です。

身近な例:

  • Webサイトを見る

  • 検索する

  • ネットショッピングをする

  • YouTubeを見る

  • TwitterやLINEを使う

これらすべてがHTTP通信で行われています。

なぜGASでHTTP通信を学ぶのか?

実は、あなたが毎日使っているWebサービスは、すべてHTTP通信で動いています。

GASでHTTP通信ができるようになると:

  • 郵便番号APIを使って住所を自動取得

  • 天気APIを使って天気情報を取得

  • Slack APIを使って自動通知

  • 各種Webサービスのデータを取得・加工

つまり、インターネット上のあらゆるサービスとGASが連携できるようになります。

これまではスプレッドシート内で完結していましたが、今回から「外の世界」とつながります。


HTTP通信の仕組み

HTTP通信は、「お願い(リクエスト)」と「返事(レスポンス)」の往復です。

基本的な流れ:

あなた(ブラウザ)         Webサーバー
      │                       │
      │  リクエスト →         │
      │ 「このページを見せて」 │
      │                       │
      │  ← レスポンス          │
      │  「はい、どうぞ」       │
      │                       │

レストランに例えると:

あなた              ウェイター              厨房
  │                   │                   │
  │「ラーメンください」│                   │
  │ ────────→         │                   │
  │    (リクエスト)    │「ラーメン1つ」     │
  │                   │ ────────→         │
  │                   │    (注文)         │
  │                   │                   │
  │                   │ ←────────         │
  │                   │   (料理)          │
  │  ←────────         │                   │
  │   (レスポンス)     │                   │
  │ 「お待たせしました」│                   │

Webサイトを見る場合:

  1. あなた(ブラウザ):「https://tonari-it.com のページを見せてください」(リクエスト)

  2. サーバー:「はい、こちらがページのデータ(HTML)です」(レスポンス)

  3. ブラウザ:受け取ったHTMLを画面に表示

GASでも同じことができます:

// GASから「このページを見せて」とリクエスト
const response = UrlFetchApp.fetch('https://tonari-it.com');

// サーバーから返ってきたデータ(レスポンス)を取得
const html = response.getContentText();
console.log(html);  // HTMLが表示される

重要なポイント:

  • HTTP通信は必ず「リクエスト」→「レスポンス」の順番

  • リクエストなしにレスポンスは来ない

  • GASは「リクエストを送る側」になれる


GASでHTTP通信を行う

GASでは、UrlFetchAppというサービスを使ってHTTP通信を行います。

UrlFetchAppサービスとは、HTTPリクエスト&レスポンスを提供するサービスです。


HTTPリクエストを行う

基本構文:

UrlFetchApp.fetch(url, params)

引数:

  • url:アクセスしたいURL(文字列)

  • params:オプション設定(オブジェクト)※省略可

戻り値:
HTTPResponseオブジェクト


リクエストの種類(HTTPメソッド)

HTTP通信には、主に2つの「メソッド」があります。

1. GETリクエスト

用途:
Webページのデータを要求するとき

例:

  • ブラウザでWebページを閲覧する

  • 検索結果を表示する

  • APIからデータを取得する

イメージ:

あなた:「このページを見せてください」
サーバー:「はい、どうぞ」

2. POSTリクエスト

用途:
情報をWebサーバーに送信するとき

例:

  • フォームで情報を送信する

  • ログインする

  • データを登録する

イメージ:

あなた:「このデータを受け取ってください」
サーバー:「受け取りました」

初学者の方へ:
最初はGETリクエスト(データを取得)から理解しましょう。POSTリクエスト(データを送信)は、後半で学びます。


HTTPResponseオブジェクト

HTTPResponseとは、HTTPレスポンスを表すオブジェクトです。

主なメソッド:

メソッド 説明 戻り値 getHeaders() ヘッダー情報を取得 オブジェクト getResponseCode() ステータスコードを取得 数値 getContentText() レスポンスの本文を取得 文字列


実際に試してみよう(演習7-01)

function myFunction7_01() {
  const url = 'https://tonari-it.com';
  const response = UrlFetchApp.fetch(url);
  
  console.log(response.getHeaders());
  console.log(response.getResponseCode());
  console.log(response.getContentText().slice(0, 300));
}

処理の流れ:

  1. UrlFetchApp.fetch(url)でリクエストを送信

  2. responseにHTTPResponseオブジェクトが返される

  3. 各メソッドで情報を取得してログ出力

ポイント:

  • slice(0, 300):最初の300文字だけ取り出す(全部表示すると長すぎるため)

  • getContentText():HTMLのソースコードが返される

実行すると:

  • ヘッダー情報(サーバーの情報など)

  • ステータスコード:200(成功)

  • HTML本文の最初の300文字

が表示されます。


ステータスコード

ステータスコードとは、リクエストの結果を表す3桁の数値です。

主なステータスコード:

コード 意味 説明 200 OK 成功 301 Moved Permanently ページが移動した 400 Bad Request リクエストが不正 404 Not Found ページが見つからない 500 Internal Server Error サーバーエラー

覚え方:

  • 200番台:成功

  • 300番台:リダイレクト

  • 400番台:クライアント(あなた)のエラー

  • 500番台:サーバーのエラー


エラーが発生する場合(演習7-02)

function myFunction7_02() {
  const url = 'https://tonari-it.com/not-exists';  // 存在しないページ
  const response = UrlFetchApp.fetch(url);
  
  console.log(response.getResponseCode());
  console.log(response.getContentText().slice(0, 300));
}

実行すると:
エラーが発生してスクリプトが止まります。

なぜ?
存在しないページにアクセスしたため、404エラーが発生します。

問題点:
エラーが発生すると、プログラムがそこで止まってしまう。これでは困ります。

解決策:
エラーを「キャッチ」して、適切に処理する必要があります。


try...catch文:エラーをキャッチする

try...catch文とは、例外(エラー)をキャッチして処理を行う構文です。これを「例外処理」といいます。

構文:

try {
  // エラーが発生するかもしれない処理
} catch (e) {
  // エラーが発生したときに実行する処理
}

動き:

  1. tryブロックの処理を実行

  2. エラーが発生したら、catchブロックに移動

  3. eにErrorオブジェクトが格納される

  4. エラーが発生しなかったら、catchブロックはスキップ


Errorオブジェクト

Errorオブジェクトとは、例外を表すJavaScriptの組み込みオブジェクトです。

主なプロパティ:

  • name:エラーの種類(例:Exception)

  • message:エラーメッセージ(例:Request failed for https://... returned code 404.)


実際に試してみよう(演習7-03)

function myFunction7_03() {
  const url = 'https://tonari-it.com/not-exists';
  
  try {
    const response = UrlFetchApp.fetch(url);
    console.log(response.getContentText().slice(0, 300));
  } catch (e) {
    console.log('例外が発生しました: ' + e.name);
    console.log(e.message);
  }
}

実行すると:

例外が発生しました: Exception
Request failed for https://tonari-it.com/not-exists returned code 404.

ポイント:

  • エラーが発生しても、スクリプトは止まらない

  • catchブロックで、エラー情報をログ出力できる

  • エラーメッセージから、何が問題かわかる


演習7-04:エラーをスプレッドシートに記録

演習7-03について、例外を検知したら、スプレッドシートに以下を記入するスクリプトを作成しましょう。

  • A1セル:「例外が発生しました: 」 + エラー名

  • A2セル:エラーメッセージ

解答例:

function myFunction7_04() {
  const url = 'https://tonari-it.com/not-exists';
  const sheet = SpreadsheetApp.getActiveSheet();
  
  try {
    const response = UrlFetchApp.fetch(url);
    console.log(response.getContentText().slice(0, 300));
  } catch (e) {
    sheet.getRange('A1').setValue('例外が発生しました: ' + e.name);
    sheet.getRange('A2').setValue(e.message);
  }
}

実務での使い方:

  • APIアクセスが失敗したときに、エラーログを記録

  • 定期実行で失敗したときに、通知を送る

  • エラーの原因を後で確認できるようにする


第1部のまとめ:HTTP通信の基本

学んだこと

1. HTTP通信とは

  • インターネットを経由した通信の仕組み

  • リクエスト(お願い)とレスポンス(返事)の往復

  • すべてのWebサービスがこれで動いている

2. UrlFetchApp.fetch()

const response = UrlFetchApp.fetch(url);
  • GASでHTTP通信を行う基本メソッド

  • URLを指定すると、そのページのデータを取得できる

3. HTTPメソッド

  • GET:データを取得(「見せて」)

  • POST:データを送信(「受け取って」)

4. HTTPResponseオブジェクト

response.getContentText()    // 本文を取得
response.getResponseCode()   // ステータスコードを取得
response.getHeaders()        // ヘッダーを取得

5. ステータスコード

  • 200:成功

  • 404:ページが見つからない

  • 500:サーバーエラー

6. エラーハンドリング

try {
  // HTTP通信
} catch (e) {
  // エラー処理
}

重要なポイント

外部サービスは不安定

  • ネットワークエラーが起きる

  • サーバーがダウンすることもある

  • だからtry...catchは必須

実務での鉄則

  • HTTP通信を使うときは、必ずtry...catchでエラー処理

  • ステータスコードを確認する

  • エラーログを記録する

次は、POSTリクエストとJSONを学びます。データを「送信」して「受信」する方法です。


第2部:POSTリクエストとJSON

このセクションでできるようになること

  • POSTリクエストでデータを送信する

  • JSONとは何かを理解する

  • JSON.stringify()でオブジェクトを文字列に変換

  • JSON.parse()で文字列をオブジェクトに変換

  • APIから返ってきたJSONデータを扱う

実務での例: 「外部APIにデータを送信して、結果をスプレッドシートに記録する」 → これがPOSTリクエストとJSONで実現できます。

なぜJSONが重要?

ほとんどのWeb APIは、データのやり取りにJSONを使います。

  • 天気API → JSONで天気情報を返す

  • 郵便番号API → JSONで住所情報を返す

  • Slack API → JSONでメッセージを送受信

JSONを理解しないと、APIを使えません。今回しっかり習得しましょう。


POSTリクエスト

GETリクエストは「データをください」でしたが、POSTリクエストは「このデータを受け取ってください」です。

イメージ:

あなた → サーバー
「名前:Bob、電話:090-0000、コメント:よろしく!」

サーバー → あなた
「受け取りました!」

実際の例:

  • お問い合わせフォーム

  • 会員登録

  • ログイン


POSTリクエストの書き方

構文:

const params = {
  method: 'post',
  payload: data  // 送信するデータ(オブジェクト)
};

UrlFetchApp.fetch(url, params);

ポイント:

  • method: 'post'でPOSTリクエストを指定

  • payloadに送信したいデータをオブジェクトで指定


httpbin.orgで練習する

httpbin.orgとは、HTTP通信のテストができるサービスです。

今回は、以下のURLを使います:

https://httpbin.org/post

このURLにPOSTリクエストを送ると、送ったデータをそのまま返してくれます。練習に最適です。


実際に試してみよう(演習7-05)

function myFunction7_05() {
  const url = 'https://httpbin.org/post';
  const params = {
    method: 'post',
    payload: {
      custname: 'Bob',
      custtel: '0900000',
      comments: 'よろしく!'
    }
  };
  
  const response = UrlFetchApp.fetch(url, params);
  console.log(response.getContentText());
}

処理の流れ:

  1. payloadにデータを設定

  2. method: 'post'でPOSTリクエストを指定

  3. UrlFetchApp.fetch()でリクエスト送信

  4. レスポンスを受け取ってログ出力

実行すると:
たくさんの情報が返ってきます。その中に、送ったデータが含まれています。


JSON形式

レスポンスを見ると、こんな形式のデータが返ってきます:

{
  "form": {
    "comments": "\u3088\u308d\u3057\u304f\uff01",
    "custname": "Bob",
    "custtel": "0900000"
  },
  ...
}

気づきましたか?

  • 日本語が\uXXXXという形式になっている(Unicode文字)

  • オブジェクトのような形式

これがJSON形式です。


JSONとは

JSON = JavaScript Object Notation
「JavaScriptのオブジェクト記法」という意味です。

JSONの特徴:

  • データを交換するための形式

  • JavaScriptのオブジェクトに似ている

  • でも、文字列です!(これが最重要)

重要な理解:

// JavaScriptのオブジェクト(データ型:オブジェクト)
const obj = {name: 'Bob', age: 25};
console.log(typeof obj);  // "object"

// JSON(データ型:文字列)
const json = '{"name":"Bob","age":25}';
console.log(typeof json);  // "string"

見た目は似ていますが、JSONは文字列です。

なぜ文字列なのか?

データをやり取りするとき、文字列にしないと送れないからです。

  • HTTP通信でデータを送るとき → 文字列にする必要がある

  • ファイルに保存するとき → 文字列にする必要がある

なぜJSONを使う?

  • 異なるプログラム言語間でデータを交換できる

  • Webサービス間でデータをやり取りする標準的な形式

  • ほぼすべてのWeb APIがJSONを使っている

実務でのJSON:

GAS → APIにリクエスト → APIからJSONで返ってくる → JSONを解析 → データ活用

JSONを理解しないと、APIから返ってきたデータを使えません。


JSONオブジェクト

JSONオブジェクトとは、JSONを操作する機能を提供するJavaScriptの組み込みオブジェクトです。

主なメソッド:

メソッド 説明 例 JSON.stringify(value) オブジェクト→JSON文字列 JSON.stringify({name: 'Bob'}) JSON.parse(text) JSON文字列→オブジェクト JSON.parse('{"name":"Bob"}')

覚え方:

  • stringify:オブジェクトを「文字列化」する

  • parse:文字列を「解析」してオブジェクトにする


実際に試してみよう(演習7-06)

function myFunction7_06() {
  // オブジェクト → JSON文字列
  const value = {name: 'Bob', age: 32};
  const text = JSON.stringify(value);
  console.log(`${text}: [${typeof text}]`);
  
  // JSON文字列 → オブジェクト
  const obj = JSON.parse(text);
  console.log(`${obj}: [${typeof obj}]`);
}

実行結果:

{"name":"Bob","age":32}: [string]
[object Object]: [object]

ポイント:

  • JSON.stringify()で、オブジェクトが文字列になる

  • JSON.parse()で、文字列がオブジェクトに戻る

  • typeofで型を確認できる


POSTリクエストのレスポンスを処理する

JSONを理解したので、POSTリクエストのレスポンスを正しく処理できます。

実際に試してみよう(演習7-07):

function myFunction7_07() {
  const url = 'https://httpbin.org/post';
  const params = {
    method: 'post',
    payload: {
      custname: 'Bob',
      custtel: '090-0000',
      comments: 'よろしく!'
    }
  };
  
  const response = UrlFetchApp.fetch(url, params);
  const text = response.getContentText();  // JSON文字列を取得
  const obj = JSON.parse(text);             // オブジェクトに変換
  const formData = obj.form;                // formプロパティを取得
  
  console.log(formData.custname);   // Bob
  console.log(formData.custtel);    // 090-0000
  console.log(formData.comments);   // よろしく!
}

処理の流れ:

  1. POSTリクエストを送信

  2. レスポンスをJSON文字列として取得

  3. JSON.parse()でオブジェクトに変換

  4. オブジェクトのプロパティにアクセス

これが重要:
API連携では、この流れが基本パターンです。


演習7-08:データをスプレッドシートに書き込む

演習7-07のPOSTリクエストのレスポンスで取得したJSONのcustname、custtel、commentsのプロパティと値の組をスプレッドシートのB1:C3セルに入力するスクリプトを作成しましょう。

解答例:

function myFunction7_08() {
  const url = 'https://httpbin.org/post';
  const params = {
    method: 'post',
    payload: {
      custname: 'Bob',
      custtel: '090-0000',
      comments: 'よろしく!'
    }
  };
  
  const response = UrlFetchApp.fetch(url, params);
  const obj = JSON.parse(response.getContentText());
  const formData = obj.form;
  
  // データを二次元配列で作成
  const data = [
    ['custname', formData.custname],
    ['custtel', formData.custtel],
    ['comments', formData.comments]
  ];
  
  // スプレッドシートに書き込み
  const sheet = SpreadsheetApp.getActiveSheet();
  sheet.getRange('B1:C3').setValues(data);
}

ポイント:

  • プロパティ名と値を二次元配列に格納

  • setValues()で一度に書き込み


第2部のまとめ:POSTとJSON

学んだこと

1. POSTリクエスト

const params = {
  method: 'post',
  payload: {データ}
};
UrlFetchApp.fetch(url, params);
  • GETは「見せて」、POSTは「受け取って」

  • データを送信するときに使う

2. JSON(最重要)

// オブジェクト → JSON文字列
const json = JSON.stringify({name: 'Bob'});

// JSON文字列 → オブジェクト
const obj = JSON.parse('{"name":"Bob"}');
  • JSONは文字列(オブジェクトではない)

  • データ交換の標準形式

  • ほぼすべてのAPIがJSONを使う

3. JSON.stringify()

  • オブジェクトを文字列化

  • APIにデータを送るときに使う

4. JSON.parse()

  • 文字列をオブジェクトに変換

  • APIから返ってきたJSONを使うときに必須

重要なポイント

JSONは「文字列」

  • 見た目はオブジェクトに似ている

  • でも実際は文字列

  • だからJSON.parse()が必要

実務でのパターン

// 1. APIにリクエスト
const response = UrlFetchApp.fetch(url);

// 2. JSON文字列を取得
const jsonText = response.getContentText();

// 3. JSONをオブジェクトに変換(これ必須!)
const data = JSON.parse(jsonText);

// 4. データを使う
console.log(data.name);

次は、実践的なAPIを使います。郵便番号から住所を取得する、実務で使えるテクニックです。


第3部:API - 外部サービスを活用する

このセクションでできるようになること

  • APIとは何かを理解する

  • 郵便番号APIを使って住所を自動取得

  • JSONレスポンスからデータを抽出

  • スプレッドシートのカスタム関数を作成

  • 実務で使える自動化ツールを作る

実務での例: 「顧客リストに郵便番号だけある。住所を1件ずつ調べて入力するのは大変...」 → 郵便番号APIで一瞬で解決できます!

今回の目標:
スプレッドシートに「=ZIPCODE("1000001")」と入力すると、自動で「東京都千代田区千代田」と表示される機能を作ります。

これができれば、実務で即戦力です。


APIとは

API = Application Programming Interface
「アプリケーションをプログラムで操作する仕組み」です。

身近な例:

  • 天気予報API:天気情報を取得

  • 郵便番号API:郵便番号から住所を取得

  • 翻訳API:テキストを翻訳

  • Slack API:メッセージを投稿

APIの便利さ:

  • 手作業でやっていたことを自動化

  • 大量のデータを一瞬で処理

  • 複数のサービスを連携


Web APIとは

Web APIとは、Webの仕組み(HTTP通信)を使ったAPIです。

イメージ:

あなた → API
「郵便番号 783-0060 の住所を教えて」

API → あなた
「高知県南国市蛍が丘です」

特徴:

  • 各サービスで決められたURL(リクエストURL)にアクセス

  • データをJSON形式で受け取る

  • HTTPリクエストで操作する


APIが用意されているサービス

無料で使えるAPI(例):

  • 郵便番号検索API

  • 天気予報API

  • 為替レートAPI

  • 祝日API

有料APIや認証が必要なAPI(例):

  • Google Maps API

  • Slack API

  • ChatGPT API

  • LINE API

今日は、無料で使える「郵便番号検索API」を使います。


郵便番号検索API

提供元:
zipcloud (http://zipcloud.ibsnet.co.jp/doc/api)

機能:
郵便番号を送ると、住所を返してくれる

リクエストURL:

https://zipcloud.ibsnet.co.jp/api/search?zipcode={zipcode}

例:東京都千代田区(郵便番号:100-0000)

https://zipcloud.ibsnet.co.jp/api/search?zipcode=1000000

注意点:

  • ハイフン(-)は入れない

  • 7桁の数字のみ


実際に試してみよう(演習7-09)

function myFunction7_09() {
  const url = 'https://zipcloud.ibsnet.co.jp/api/search?zipcode=7830060';
  const response = UrlFetchApp.fetch(url);
  const text = response.getContentText();
  const obj = JSON.parse(text);
  console.log(obj);
}

実行結果(一部):

{
  status: 200,
  message: null,
  results: [
    {
      zipcode: '7830060',
      prefcode: '39',
      address1: '高知県',
      address2: '南国市',
      address3: '蛍が丘',
      ...
    }
  ]
}

JSONの構造:

  • status:ステータスコード(200=成功)

  • message:エラーメッセージ(成功時はnull)

  • results:結果の配列

    • address1:都道府県名

    • address2:市区町村名

    • address3:町域名


APIのJSON定義を理解する

郵便番号APIのレスポンスから、必要なデータを取り出すには:

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

// ステータスコード
obj.status

// メッセージ
obj.message

// 都道府県名
obj.results[0].address1

// 市区町村名
obj.results[0].address2

// 町域名
obj.results[0].address3

なぜresults[0]?

  • resultsは配列

  • 通常は1件の結果なので、最初の要素(インデックス0)を取得


実際に試してみよう(演習7-10)

function myFunction7_10() {
  const url = 'https://zipcloud.ibsnet.co.jp/api/search?zipcode=7830060';
  const response = UrlFetchApp.fetch(url);
  
  const obj = JSON.parse(response.getContentText());
  console.log(`ステータスコード: ${obj.status}`);
  
  const result = obj.results[0];
  console.log(`都道府県名: ${result.address1}`);
  console.log(`市区町村名: ${result.address2}`);
  console.log(`町域名: ${result.address3}`);
}

実行結果:

ステータスコード: 200
都道府県名: 高知県
市区町村名: 南国市
町域名: 蛍が丘

ポイント:

  • obj.results[0]で最初の結果を取得

  • それをresultという変数に格納

  • 各プロパティにアクセスして住所を取得


演習7-11:スプレッドシート関数を作る

引数に郵便番号7桁を指定すると、都道府県名+市区町村名+町域名を返すスプレッドシート関数ZIPCODEを作成してみましょう。

解答例:

function ZIPCODE(zipcode) {
  // ハイフンを削除して7桁にする
  const zip = String(zipcode).replace(/-/g, '');
  
  const url = `https://zipcloud.ibsnet.co.jp/api/search?zipcode=${zip}`;
  
  try {
    const response = UrlFetchApp.fetch(url);
    const obj = JSON.parse(response.getContentText());
    
    if (obj.status === 200 && obj.results) {
      const result = obj.results[0];
      return `${result.address1}${result.address2}${result.address3}`;
    } else {
      return 'エラー: 郵便番号が見つかりません';
    }
  } catch (e) {
    return 'エラー: ' + e.message;
  }
}

使い方(スプレッドシート):

A1セル: 783-0060
B1セル: =ZIPCODE(A1)

結果: 高知県南国市蛍が丘

ポイント:

  • String(zipcode).replace(/-/g, '')でハイフンを削除

  • テンプレート文字列でURLを動的に生成

  • try...catchでエラーハンドリング

  • ステータスコードを確認してからデータを取得

これが実務での使い方です!
スプレッドシートのセルに郵便番号を入力するだけで、自動で住所が表示されます。


アクセスキー・トークン

多くのAPIは、アクセスキートークンが必要です。

アクセスキー・トークンとは、APIを使用する際の「許可証」です。

なぜ必要?

  • 誰が使っているか識別するため

  • 使用量を制限するため

  • 有料プランを管理するため

  • セキュリティを守るため

例:

const apiKey = 'YOUR_API_KEY';
const url = `https://api.example.com/data?key=${apiKey}`;

注意点:

  • APIキーは秘密情報

  • コードに直接書かない(スクリプトプロパティに保存)

  • GitHubなどに公開しない

郵便番号APIは:
アクセスキーが不要なので、初心者でも簡単に使えます。


まとめ:今日学んだこと

第1部:HTTP通信とUrl Fetchサービス

  • HTTP通信は「リクエスト」と「レスポンス」

  • UrlFetchApp.fetch(url)でリクエスト送信

  • HTTPResponseオブジェクトでレスポンスを受け取る

  • try...catchでエラーハンドリング

  • ステータスコードでリクエストの結果を確認

第2部:POSTリクエストとJSON

  • POSTリクエストでデータを送信

  • method: 'post'とpayloadを指定

  • JSONはデータ交換の標準形式

  • JSON.stringify():オブジェクト → JSON文字列

  • JSON.parse():JSON文字列 → オブジェクト

第3部:API

  • APIは外部サービスをプログラムで操作する仕組み

  • Web APIはHTTP通信を使う

  • リクエストURL + パラメータでデータを取得

  • レスポンスをJSON形式で受け取る

  • スプレッドシート関数として活用できる


発展:実務での活用例

今日学んだ知識を使うと、こんなことができます:

例1:Slackに自動通知

function sendSlackNotification(message) {
  const webhookUrl = 'YOUR_SLACK_WEBHOOK_URL';
  const payload = {
    text: message
  };
  
  const params = {
    method: 'post',
    contentType: 'application/json',
    payload: JSON.stringify(payload)
  };
  
  UrlFetchApp.fetch(webhookUrl, params);
}

// 使い方
sendSlackNotification('処理が完了しました!');

例2:天気情報を取得してスプレッドシートに記録

function getWeather() {
  const apiKey = 'YOUR_API_KEY';
  const city = 'Tokyo';
  const url = `https://api.openweathermap.org/data/2.5/weather?q=${city}&appid=${apiKey}&units=metric&lang=ja`;
  
  try {
    const response = UrlFetchApp.fetch(url);
    const data = JSON.parse(response.getContentText());
    
    const sheet = SpreadsheetApp.getActiveSheet();
    const row = [
      new Date(),
      data.name,
      data.weather[0].description,
      data.main.temp,
      data.main.humidity
    ];
    
    sheet.appendRow(row);
  } catch (e) {
    console.log('エラー: ' + e.message);
  }
}

例3:複数の郵便番号を一括変換

function convertZipCodes() {
  const sheet = SpreadsheetApp.getActiveSheet();
  const zipCodes = sheet.getRange('A2:A10').getValues();  // A2:A10に郵便番号
  
  const addresses = [];
  
  for (const row of zipCodes) {
    const zipcode = String(row[0]).replace(/-/g, '');
    const url = `https://zipcloud.ibsnet.co.jp/api/search?zipcode=${zipcode}`;
    
    try {
      const response = UrlFetchApp.fetch(url);
      const obj = JSON.parse(response.getContentText());
      
      if (obj.status === 200 && obj.results) {
        const result = obj.results[0];
        addresses.push([`${result.address1}${result.address2}${result.address3}`]);
      } else {
        addresses.push(['エラー']);
      }
      
      Utilities.sleep(100);  // APIへの連続アクセスを避ける
    } catch (e) {
      addresses.push(['エラー: ' + e.message]);
    }
  }
  
  sheet.getRange(2, 2, addresses.length, 1).setValues(addresses);  // B2以降に書き込み
}

ポイント:

  • Utilities.sleep(100):100ミリ秒待機(APIへの連続アクセスを避ける)

  • エラーハンドリングで、一部が失敗しても処理を続行


学習のコツ

1. APIドキュメントを読む習慣
各APIには「ドキュメント」があります。リクエストURL、パラメータ、レスポンスの形式が書かれています。最初は難しく感じますが、慣れれば読めるようになります。

2. JSONの構造を理解する
console.log(obj)でオブジェクト全体を表示して、構造を確認しましょう。ドット記法でどうアクセスするか、少しずつ理解できます。

3. 小さく試す
いきなり複雑なAPIを使わず、まずは郵便番号APIのような簡単なものから。成功体験を積み重ねましょう。

4. エラーハンドリングを忘れない
APIは外部サービスなので、いつ失敗するかわかりません。必ずtry...catchを使いましょう。

5. レート制限に注意
多くのAPIには「1日○○回まで」という制限があります。ループで大量にアクセスすると、制限に引っかかることがあります。


全体のまとめ:HTTP通信・API入門

今日学んだこと

第1部:HTTP通信

  • リクエストとレスポンスの仕組み

  • UrlFetchApp.fetch()の使い方

  • GETとPOSTの違い

  • ステータスコード(200, 404, 500)

  • try...catchでエラーハンドリング

第2部:JSON

  • JSONは「文字列」(オブジェクトではない)

  • JSON.stringify():オブジェクト → 文字列

  • JSON.parse():文字列 → オブジェクト

  • APIとのデータ交換に必須

第3部:API

  • 外部サービスをプログラムで操作

  • 郵便番号APIで実践

  • カスタム関数の作成

  • 一括処理の実装

できるようになったこと

✅ 外部Webサイトからデータを取得
✅ APIを使って外部サービスと連携
✅ JSONデータを解析して活用
✅ スプレッドシートにカスタム関数を追加
✅ 実務で使える自動化ツールを作成

実務での活用

今日学んだスキルで、こんなことができます:

  1. 郵便番号から住所を自動入力

    • 顧客リストの作成が楽に

    • 入力ミスを防ぐ

  2. 天気情報の自動取得

    • 毎朝の天気をスプレッドシートに記録

    • トリガーで自動実行

  3. Slack/ChatWorkへの自動通知

    • スプレッドシートの更新を通知

    • エラー発生時のアラート

  4. 外部データベースとの連携

    • 在庫情報の取得

    • 価格情報の更新

重要なポイント

1. エラーハンドリングは必須

try {
  const response = UrlFetchApp.fetch(url);
  // 処理
} catch (e) {
  console.log('エラー: ' + e.message);
}

2. JSONは必ず解析する

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

3. APIドキュメントを読む

  • リクエストURL

  • パラメータ

  • レスポンスの形式

4. レート制限に注意

  • 連続アクセスは避ける

  • Utilities.sleep()で待機

学習のコツ

  1. APIドキュメントを読む習慣
    最初は難しいですが、慣れれば読めるようになります

  2. JSONの構造を理解する
    console.log()で確認しながら進める

  3. 小さく試す
    簡単なAPIから始めて、成功体験を積む

  4. エラーハンドリングを忘れない
    外部サービスはいつ失敗するかわからない

  5. レート制限に注意
    大量アクセスは制限に引っかかる

次のステップ

今回の内容を復習したら:

  • 他のAPIも試してみる(天気API、為替APIなど)

  • 自分の業務で使えるAPIを探す

  • 複数のAPIを組み合わせる

GASの可能性は無限大です!
HTTP通信とAPIを習得したあなたは、もう初心者ではありません。実務で使える強力なツールを作れるようになりました。


ハッシュタグ:#ノンプロ研 #GAS初心者講座

最後に

HTTP通信・API、お疲れさまでした!

今日は「GASの可能性が広がる」回でした:

  • スプレッドシートの中だけでなく、外の世界とつながる

  • 天気、郵便番号、翻訳、通知...様々なサービスと連携できる

  • 手作業でやっていたことを、一瞬で自動化できる

最初は難しく感じるかもしれません:

  • 「HTTP通信って何?」

  • 「JSONって文字列なの?オブジェクトなの?」

  • 「APIのドキュメント、読めない...」

でも大丈夫。これは誰もが通る道です。

実際に手を動かしてみてください:

  • 郵便番号APIを使ってみる

  • 自分でスプレッドシート関数を作ってみる

  • 他のAPIも試してみる

これを繰り返すうちに、自然と「API連携」の感覚が身につきます。

あなたはもう「API連携」ができる人です:
HTTP通信の基本、JSONの扱い、エラーハンドリング。この基本ができれば、あとは応用するだけです。


いいなと思ったら応援しよう!