GASで商品リストからAIで
商品説明文を自動生成する方法

スプレッドシートに並べた商品名と特徴をClaude APIに渡し、キャッチコピーと商品説明文をまとめて自動生成する方法を、動くコードで解説します。

|対象: GAS / Claude API / EC商品コピー

Table of Contents

商品説明文の自動生成でできること

ネットショップの運営では、商品ごとの説明文づくりが大きな手間になります。商品名と簡単な特徴だけ用意しておけば、あとは GAS(Google Apps Script、Googleのサービスを自動化できるスクリプト環境)が Claude API を呼び出し、キャッチコピー・説明本文・特徴の箇条書きをまとめて生成できます。

大量商品の初稿を一括生成

数百点の商品でも、スプレッドシートに並べておけば未生成の行だけまとめて処理できる

トーンを揃える

プロンプトで文体や文字数を指定でき、担当者ごとのばらつきを抑えられる

たたき台として使う

ゼロから書くより、生成された下書きを直す方が速い

サーバー費用ゼロ

GASとスプレッドシートだけで動くため、追加のサーバーは不要

この記事では、スプレッドシートの商品リストを1行ずつ処理し、生成結果を隣の列に書き戻すところまでを実装します。

スプレッドシートの準備とAPIキーの保管

まず「商品リスト」という名前のシートを用意し、次のように列を決めます。入力するのは A〜C 列だけで、D〜F 列は生成結果の書き込み先です。

内容
A商品名(入力)
B特徴・スペック(入力)
Cトーン指定(任意・入力)
Dキャッチコピー(自動生成)
E説明本文(自動生成)
F特徴3点(自動生成)

次に Claude API のAPIキーを安全に保管します。キーをコードに直書きすると共有時に漏れる危険があるため、GASのPropertiesService(スクリプトごとに値を保存できる領域)に入れ、コードからはキー名で読み出します。

// 一度だけ実行してAPIキーをスクリプトプロパティに保存する
function saveApiKey() {
  PropertiesService.getScriptProperties()
    .setProperty("CLAUDE_API_KEY", "sk-ant-xxxxxxxx"); // 保存後この行は消す
}

// コードからはキー名で読み出す
function getApiKey() {
  const key = PropertiesService.getScriptProperties()
    .getProperty("CLAUDE_API_KEY");
  if (!key) throw new Error("APIキーが未設定です。saveApiKeyを先に実行してください。");
  return key;
}

Claude APIを呼び出す基本関数

GASに標準搭載のUrlFetchApp.fetch()でClaude APIにリクエストを送ります。プロンプト(AIへの指示文)を渡すと生成テキストを返す共通関数にしておくと、あとで使い回せます。muteHttpExceptions: trueを付けると、エラー時もレスポンス本文を読めるので原因を掴みやすくなります。

// Claude APIにテキストを送り、返答文字列を受け取る共通関数
function callClaude(prompt) {
  const url = "https://api.anthropic.com/v1/messages";
  const payload = {
    model: "claude-haiku-4-5", // 軽量・低コスト。精度重視なら claude-sonnet-5 に差し替え
    max_tokens: 1024,
    messages: [{ role: "user", content: prompt }],
  };

  const options = {
    method: "post",
    contentType: "application/json",
    headers: {
      "x-api-key": getApiKey(),
      "anthropic-version": "2023-06-01",
    },
    payload: JSON.stringify(payload),
    muteHttpExceptions: true, // エラー時も例外にせず本文を受け取る
  };

  const res = UrlFetchApp.fetch(url, options);
  const code = res.getResponseCode();
  if (code !== 200) {
    throw new Error("APIエラー " + code + ": " + res.getContentText());
  }

  const json = JSON.parse(res.getContentText());
  return json.content[0].text; // 生成されたテキスト本文
}

モデルはmodelフィールドの文字列を差し替えるだけで変更できます。まずは軽量・低コストなclaude-haiku-4-5で試し、表現の質を上げたい場合はclaude-sonnet-5に切り替えるのがおすすめです。

説明文を生成するプロンプトとJSONの受け取り

キャッチコピー・本文・箇条書きを別々のセルに書き分けたいので、AIにはJSON形式で返してもらいます。プロンプトに出力フォーマットを明示するのがコツです。 「事実にない機能・数値は書かない」と釘を刺しておくと、いわゆるハルシネーション(もっともらしい嘘)を減らせます。

// 商品情報から、JSON形式で説明文一式を生成するプロンプトを作る
function buildPrompt(name, features, tone) {
  return [
    "あなたはECサイトの商品コピーライターです。",
    "以下の商品について、日本語の商品説明を作成してください。",
    "",
    "商品名: " + name,
    "特徴・スペック: " + features,
    "トーン: " + (tone || "丁寧でわかりやすく"),
    "",
    "次のJSON形式だけを出力してください(前後に説明文やコードブロックは不要)。",
    "{",
    '  "catch": "20文字以内のキャッチコピー",',
    '  "body": "150〜250文字の商品説明本文",',
    '  "points": ["特徴を表す短い箇条書きを3つ"]',
    "}",
    "",
    "事実にない機能・効能・数値は書かないでください。",
  ].join("\n");
}

// 返答からJSON部分だけを安全に取り出す
function parseResult(text) {
  const start = text.indexOf("{");
  const end = text.lastIndexOf("}");
  if (start === -1 || end === -1) throw new Error("JSONが見つかりません: " + text);
  return JSON.parse(text.slice(start, end + 1));
}

AIが前後によけいな文章を付けることがあるため、最初の{から最後の}までを切り出してからパースすると安定します。

シート全体を一括生成する(スキップ・リトライ)

商品リストを1行ずつ走査し、説明本文の列(E列)がまだ空の行だけ生成します。生成済みの行をスキップすることで、再実行しても既存の文章を上書きせず、無駄なAPIコストも避けられます。

// シート全体を走査し、未生成の行だけ説明文を作る
// 列: A=商品名 B=特徴 C=トーン D=キャッチ E=説明本文 F=特徴3点
function generateDescriptions() {
  const sheet = SpreadsheetApp.getActive().getSheetByName("商品リスト");
  const values = sheet.getDataRange().getValues();

  for (let row = 1; row < values.length; row++) { // 0行目はヘッダー
    const name = values[row][0];
    const already = values[row][4]; // E列(説明本文)
    if (!name || already) continue; // 商品名なし or 生成済みはスキップ

    try {
      const prompt = buildPrompt(name, values[row][1], values[row][2]);
      const result = parseResult(callClaudeWithRetry(prompt));

      sheet.getRange(row + 1, 4).setValue(result.catch);          // D列
      sheet.getRange(row + 1, 5).setValue(result.body);           // E列
      sheet.getRange(row + 1, 6).setValue(result.points.join("\n")); // F列
    } catch (e) {
      sheet.getRange(row + 1, 5).setValue("生成失敗: " + e.message);
    }

    Utilities.sleep(500); // レート制限対策に短い待機
  }
}

API側の一時的なエラー(アクセス集中を示す 429 やサーバー側の 5xx)は、少し待ってから再試行すると成功することが多いため、リトライ処理でくるんでおきます。

// 一時的なエラー(429/5xx)に備えて数回リトライする
function callClaudeWithRetry(prompt, maxRetries) {
  const retries = maxRetries || 3;
  for (let i = 0; i < retries; i++) {
    try {
      return callClaude(prompt);
    } catch (e) {
      const transient = /(^|\s)(429|5\d\d)(\s|:)/.test(e.message);
      if (!transient || i === retries - 1) throw e;
      Utilities.sleep(1000 * (i + 1)); // 1秒→2秒→3秒と待機を延ばす
    }
  }
}

カスタムメニューから実行する

スクリプトエディタを開かなくても実行できるよう、スプレッドシートにカスタムメニューを追加します。onOpen()はシートを開いたときに自動で走る特別な関数です。追加後にシートを開き直すと、上部に「AI商品説明」メニューが表示されます。

// スプレッドシートを開いたときにカスタムメニューを追加
function onOpen() {
  SpreadsheetApp.getUi()
    .createMenu("AI商品説明")
    .addItem("未生成の行を一括生成", "generateDescriptions")
    .addToUi();
}

商品を追加するたびに手動で実行してもよいですし、件数が多い場合は時間主導トリガーで夜間に自動生成する運用にもできます。

実務での注意点

1. 公開前に人がチェックする

AIは事実にない機能やサイズを書くことがあり、景品表示法や薬機法など表現の規制に触れる場合もあります。生成物はあくまで下書きと位置づけ、担当者が確認してから公開しましょう。

2. APIの利用料に注意する

Claude APIは送受信するトークン量に応じて課金されます。生成済みの行をスキップする作りにして、必要な商品だけ処理するのがコスト管理の基本です。

3. 大量処理は分割実行を検討する

商品数が多いとGASの6分実行時間制限に達することがあります。1回あたりの処理件数を区切り、続きをトリガーで再開する分割実行と組み合わせると安定します。

まとめ

GASとClaude APIを組み合わせれば、スプレッドシートの商品リストからキャッチコピーと説明文の初稿を自動生成できます。JSONでの受け取り・生成済み行のスキップ・リトライを押さえておけば、再実行にも強い実用的な仕組みになります。 生成物は下書きとして扱い、人の確認を挟む運用にすることで、品質と安全性を保ちながら商品ページ作成の手間を大きく減らせます。

よくある質問

不要です。GASに標準搭載のUrlFetchApp.fetch()でHTTPリクエストを送れるため、外部ライブラリを追加せずにClaude APIを呼び出せます。APIキーと送信するJSONを用意するだけで動きます。

公開前の人による確認をおすすめします。AIは事実にない機能やサイズを書いてしまうことがあり、景品表示法や薬機法など表現の規制に触れる場合もあります。生成物は「下書き」と位置づけ、担当者がチェックしてから公開する運用が安全です。

変えられます。プロンプトに「200文字程度」「丁寧語で」「20代向けにカジュアルに」といった条件を差し込めば、商品カテゴリや媒体に合わせて出し分けできます。スプレッドシートの列にトーン指定を持たせ、行ごとにプロンプトへ埋め込む方法が実用的です。

生成済みの列が空のときだけ処理する条件分岐を入れておけば、再実行しても既存の説明文は上書きされません。作り直したい商品だけセルを空にして再実行する運用にすると、無駄なAPI呼び出しとコストも抑えられます。

商品数が多いとGASの6分実行時間制限に達することがあります。1回の実行で処理する件数を区切り、続きは時間主導トリガーで再開する分割実行にすると安定します。APIのレート制限対策として、行ごとに短いスリープを挟むのも有効です。

AI×GASで業務の自動化を
相談する。

商品説明文の生成以外にも、問い合わせ分類・要約・翻訳など、Claude APIとGASを組み合わせた自動化をご相談いただけます。

AI×GAS自動化を見る