TEXTBOOK SECTION / AI LEARNING

GASからmicroCMSの記事を取得する

AI活用概論の「GASとmicroCMSで作るシンプルなポートフォリオ」より、GASからmicroCMSの記事を取得するを解説。生成AI、AI活用、DX、業務改善を実践しながら学べるオンライン教材です。

3GASとmicroCMSで作るシンプルなポートフォリオ概論 / AI活用 / ChatGPT / Gemini / Claude / 基礎から学ぶ

OVERVIEW

この節で学べること

概要を表示する
項目内容
教材名AI活用概論
GASとmicroCMSで作るシンプルなポートフォリオ
GASからmicroCMSの記事を取得する
カテゴリ概論 / AI活用 / ChatGPT / Gemini / Claude / 基礎から学ぶ
学習内容生成AI、AI活用、DX、業務改善を実践しながら理解するための教材です。

TABLE OF CONTENTS

目次

CONTENT

ここから

この節では、Google Apps ScriptからmicroCMSのContent APIへアクセスし、ポートフォリオの記事データを取得します。

記事一覧と記事詳細の取得処理は、Code.gsに記述します。


GASプロジェクトを作成する

Googleドライブを開き、Google Apps Scriptのプロジェクトを作成します。

Googleドライブ
→ 新規
→ その他
→ Google Apps Script

プロジェクト名は、内容が分かるように設定します。

ポートフォリオ

初期状態では、コード.gsというファイルが作成されます。本教材では、これをCode.gsとして扱います。


Code.gsの役割

Code.gsは、Webアプリのサーバー側の処理を担当します。

主な役割は次のとおりです。

  • microCMSの接続情報を取得する
  • microCMSへAPIリクエストを送る
  • 記事一覧を取得する
  • 記事を1件取得する
  • HTMLテンプレートへ記事データを渡す
  • 一覧ページと詳細ページを切り替える

microCMSのAPIキーをHTML側へ書かず、Code.gsから通信することで、ブラウザへAPIキーが公開されることを防ぎます。


BLOG_CONFIGで設定値の名前を管理する

最初に、スクリプトプロパティで使用する名前を定義します。

const BLOG_CONFIG = Object.freeze({
  serviceIdProperty: 'MICROCMS_SERVICE_ID',
  apiKeyProperty: 'MICROCMS_API_KEY',
  endpointProperty: 'MICROCMS_ENDPOINT',
});

BLOG_CONFIGには、実際のサービスIDやAPIキーではなく、スクリプトプロパティのキー名を登録しています。

例えば、次のコードはMICROCMS_API_KEYという名前のスクリプトプロパティを参照するために使用します。

BLOG_CONFIG.apiKeyProperty

Object.freeze()を使用することで、実行中に設定値が誤って書き換えられることを防ぎます。


スクリプトプロパティを登録する

microCMSの接続情報は、GASのスクリプトプロパティに保存します。

Apps Scriptの左側から、次の画面を開きます。

プロジェクトの設定
→ スクリプト プロパティ
→ スクリプト プロパティを追加

次の3件を登録します。

MICROCMS_SERVICE_ID

microCMSのサービスIDを登録します。

プロパティ:
MICROCMS_SERVICE_ID

値:
portfolio

MICROCMS_API_KEY

microCMSで作成した、GET権限のみを持つAPIキーを登録します。

プロパティ:
MICROCMS_API_KEY

値:
microCMSで取得したAPIキー

MICROCMS_ENDPOINT

第2節で作成したAPIのエンドポイントを登録します。

プロパティ:
MICROCMS_ENDPOINT

値:
blogs

APIキーは秘密情報です。Index.htmlDetail.htmlには記述しません。


PropertiesServiceで設定値を取得する

スクリプトプロパティは、PropertiesServiceを使って取得します。

function getMicroCmsConfig() {
  const properties =
    PropertiesService.getScriptProperties();

  const serviceId = String(
    properties.getProperty(
      BLOG_CONFIG.serviceIdProperty,
    ) ?? '',
  ).trim();

  const apiKey = String(
    properties.getProperty(
      BLOG_CONFIG.apiKeyProperty,
    ) ?? '',
  ).trim();

  const endpoint = String(
    properties.getProperty(
      BLOG_CONFIG.endpointProperty,
    ) ?? '',
  ).trim();

  if (!serviceId || !apiKey || !endpoint) {
    throw new Error(
      'microCMSのスクリプトプロパティが設定されていません。',
    );
  }

  return {
    serviceId,
    apiKey,
    endpoint,
  };
}

getProperty()を使うと、指定した名前の値を取得できます。

properties.getProperty('MICROCMS_SERVICE_ID');

値が登録されていない場合はnullが返るため、空文字へ変換してから確認しています。

?? ''

さらに、値の前後に不要な空白が入っていても問題が起きないように、trim()を使用しています。


microCMSのAPI URLを組み立てる

microCMSの記事一覧を取得するURLは、次の形式です。

<https://サービスID.microcms.io/api/v1/エンドポイント>

例えば、サービスIDがtomoya-portfolio、エンドポイントがblogsの場合は、次のURLになります。

<https://tomoya-portfolio.microcms.io/api/v1/blogs>

コードでは、スクリプトプロパティから取得した値を使ってURLを作成します。

const url = [
  `https://${config.serviceId}.microcms.io`,
  `/api/v1/${config.endpoint}`,
].join('');

UrlFetchApp.fetch()でAPI通信を行う

GASから外部APIへアクセスするには、UrlFetchApp.fetch()を使用します。

const response = UrlFetchApp.fetch(url, {
  method: 'get',
  headers: {
    'X-MICROCMS-API-KEY': apiKey,
  },
  muteHttpExceptions: true,
});

今回使用している設定は次のとおりです。

設定内容
methodHTTPメソッドをGETにする
headersmicroCMSのAPIキーを送信する
muteHttpExceptionsHTTPエラー時もレスポンスを受け取る

muteHttpExceptionstrueにすると、401や404などのエラーが返った場合でも、ステータスコードやレスポンス本文を確認できます。


X-MICROCMS-API-KEYヘッダーを設定する

microCMSのContent APIへアクセスするには、リクエストヘッダーへAPIキーを設定します。

headers: {
  'X-MICROCMS-API-KEY': apiKey,
},

APIキーは、次の流れで利用されます。

スクリプトプロパティ
  ↓ PropertiesServiceで取得
Code.gs
  ↓ HTTPヘッダーへ設定
microCMS Content API

ブラウザから直接microCMSへアクセスしていないため、閲覧者にAPIキーは渡りません。


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

API通信後は、レスポンスのステータスコードを確認します。

const statusCode = response.getResponseCode();

一般的なステータスコードは次のとおりです。

ステータス意味
200取得成功
400リクエスト内容が正しくない
401APIキーが正しくない
403APIキーに必要な権限がない
404サービスIDやエンドポイントが正しくない
500サーバー側でエラーが発生した

成功時のステータスコードは、通常200番台です。

if (statusCode < 200 || statusCode >= 300) {
  console.error(response.getContentText());

  throw new Error(
    `microCMSへの接続に失敗しました。HTTP ${statusCode}`,
  );
}

エラー時には、microCMSから返された内容を実行ログへ出力します。


API通信処理を関数としてまとめる

API通信を複数の場所から使えるように、fetchMicroCms()としてまとめます。

function fetchMicroCms(url, apiKey) {
  const response = UrlFetchApp.fetch(url, {
    method: 'get',
    headers: {
      'X-MICROCMS-API-KEY': apiKey,
    },
    muteHttpExceptions: true,
  });

  const statusCode = response.getResponseCode();

  if (statusCode < 200 || statusCode >= 300) {
    console.error(response.getContentText());

    throw new Error(
      `microCMSへの接続に失敗しました。HTTP ${statusCode}`,
    );
  }

  return response;
}

記事一覧と記事詳細の両方で、この関数を再利用します。


JSONレスポンスを解析する

microCMSから取得したデータは、JSON形式の文字列です。

記事一覧では、次のようなデータが返されます。

{
  "contents": [
    {
      "id": "sample-article",
      "title": "受付管理アプリ",
      "description": "受付状況を管理するアプリです。"
    }
  ],
  "totalCount": 1,
  "offset": 0,
  "limit": 100
}

GASで扱えるオブジェクトへ変換するには、JSON.parse()を使用します。

function parseJsonResponse(response) {
  try {
    return JSON.parse(
      response.getContentText('UTF-8'),
    );
  } catch (error) {
    console.error(error);

    throw new Error(
      'microCMSのレスポンスを解析できませんでした。',
    );
  }
}

getContentText('UTF-8')でレスポンス本文を文字列として取得し、JSON.parse()でJavaScriptのオブジェクトへ変換しています。


getArticles()で記事一覧を取得する

記事一覧は、getArticles()で取得します。

function getArticles() {
  const config = getMicroCmsConfig();

  const url = [
    `https://${config.serviceId}.microcms.io`,
    `/api/v1/${config.endpoint}`,
    '?limit=100',
    '&orders=-publishedDate',
    '&fields=id,title,description,thumbnail,publishedDate',
  ].join('');

  const response = fetchMicroCms(
    url,
    config.apiKey,
  );

  const parsed = parseJsonResponse(response);

  if (!Array.isArray(parsed.contents)) {
    throw new Error(
      'microCMSの記事一覧レスポンスが正しくありません。',
    );
  }

  return parsed.contents;
}

limit

limit=100

最大100件の記事を取得します。

orders

orders=-publishedDate

publishedDateの新しい順に並べます。

先頭の-は降順を表します。

fields

fields=id,title,description,thumbnail,publishedDate

一覧ページで必要なフィールドだけを取得します。

本文のcontentは一覧ページでは使用しないため、取得対象に含めていません。必要なデータだけを取得することで、レスポンスを小さくできます。


getArticle()で記事を1件取得する

記事詳細では、記事IDを指定して1件だけ取得します。

function getArticle(articleId) {
  if (!/^[a-zA-Z0-9_-]+$/.test(articleId)) {
    throw new Error(
      '記事IDの形式が正しくありません。',
    );
  }

  const config = getMicroCmsConfig();

  const url = [
    `https://${config.serviceId}.microcms.io`,
    `/api/v1/${config.endpoint}/`,
    encodeURIComponent(articleId),
  ].join('');

  const response = fetchMicroCms(
    url,
    config.apiKey,
  );

  return parseJsonResponse(response);
}

記事IDを指定したAPI URLは、次の形式です。

<https://サービスID.microcms.io/api/v1/blogs/記事ID>

例えば、記事IDがsample-articleの場合は次のようになります。

<https://portfolio.microcms.io/api/v1/blogs/sample-article>

詳細取得では、本文を含む記事データ全体が返されます。


記事IDを検証する理由

URLから受け取る値をそのままAPI URLへ使用すると、想定していない文字列が渡される可能性があります。

そのため、記事IDに使用できる文字を制限します。

if (!/^[a-zA-Z0-9_-]+$/.test(articleId)) {
  throw new Error(
    '記事IDの形式が正しくありません。',
  );
}

この正規表現では、次の文字だけを許可します。

  • 半角英字
  • 半角数字
  • ハイフン
  • アンダースコア

URLへ組み込む際には、さらにencodeURIComponent()を使用します。

encodeURIComponent(articleId)

testConnection()で接続を確認する

Webアプリとして公開する前に、microCMSから記事を取得できるか確認します。

function testConnection() {
  const articles = getArticles();

  console.log(
    JSON.stringify(articles, null, 2),
  );

  return articles.length;
}

Apps Scriptエディタの上部でtestConnectionを選択し、実行します。

関数を選択
→ testConnection
→ 実行

初回実行時には、GASが外部サービスへアクセスするための権限確認が表示されます。

正常に接続できると、実行ログにmicroCMSの記事データが表示されます。

[
  {
    "id": "sample-article",
    "title": "受付管理アプリ",
    "description": "受付状況を管理するアプリです。",
    "thumbnail": {
      "url": "<https://images.microcms-assets.io/>..."
    },
    "publishedDate": "2026-07-13T00:00:00.000Z"
  }
]

戻り値には、取得できた記事数が表示されます。


接続できない場合の確認事項

HTTP 401の場合

microCMSへの接続に失敗しました。HTTP 401

次を確認します。

  • MICROCMS_API_KEYが正しいか
  • APIキーの前後に空白が入っていないか
  • 別サービスのAPIキーを登録していないか

HTTP 403の場合

次を確認します。

  • APIキーにGET権限があるか
  • 対象APIへのアクセスが許可されているか

HTTP 404の場合

次を確認します。

  • MICROCMS_SERVICE_IDが正しいか
  • MICROCMS_ENDPOINTblogsになっているか
  • microCMSにAPIが作成されているか

記事が0件の場合

次を確認します。

  • microCMSにコンテンツが登録されているか
  • コンテンツが下書きではなく公開済みか
  • 公開日時が未来になっていないか

処理の流れ

記事一覧を取得する流れは次のとおりです。

getArticles()
  ↓
getMicroCmsConfig()
  ↓
PropertiesServiceから設定値を取得
  ↓
API URLを作成
  ↓
fetchMicroCms()
  ↓
UrlFetchApp.fetch()で通信
  ↓
HTTPステータスを確認
  ↓
parseJsonResponse()
  ↓
JSONをオブジェクトへ変換
  ↓
記事一覧を返す

記事詳細の場合は、getArticle(articleId)から同じ通信処理を利用します。


到達目標

この節では、Google Apps ScriptのスクリプトプロパティからmicroCMSの接続情報を取得し、Content APIを呼び出せることを目標とします。

また、getArticles()で記事一覧、getArticle()で記事詳細を取得し、testConnection()で接続状態を確認できるようになります。

次ページ

https://app.notion.com/p/332b4ab5d13681d0acbedeebd02a42f0?v=2c7b4ab5d136802d9a64000c46ee24e8&source=copy_link

FAQ

よくある質問

GASからmicroCMSの記事を取得するは医療関係者向けだけの内容ですか。
医療分野の例が含まれる場合もありますが、医療関係者だけに限定した内容ではありません。生成AI、AI活用、DX、業務改善、プロトタイプ開発など、一般的なAI学習の事例として読める内容です。
AI初心者でも読めますか。
はい。AIをこれから学ぶ方、数学が苦手な方、仕事でAIを使いたい方にも読み進めやすいように、教材の章と節の流れに沿って整理しています。
サムネイル画像は必ず表示されますか。
はい。教材にcoverUrlが設定されている場合はその画像を表示し、未設定の場合は代替サムネイル画像を表示します。
AI活用概論のほかの章も読めますか。
はい。教材トップから章立てを確認でき、前後の節へもページ下部のナビゲーションから移動できます。