GASで名簿の氏名から
AIでふりがなを自動生成する方法

CSVで取り込んだ名簿の漢字氏名に、AI(Claude API)でひらがなの読み仮名を自動で付ける方法を、動くコードで解説します。姓と名を分けて受け取り、20件ずつのバッチで効率よく処理します。

|対象: GAS / スプレッドシート / Claude API

Table of Contents

PHONETIC関数では読めない名簿がある

スプレッドシートにはPHONETIC(セルの入力時に使ったIME変換情報から読みを取り出す関数)があります。ただしこれは「セルに手入力したときの変換履歴」を読む仕組みです。 CSVインポートや他システムから貼り付けた氏名には変換情報が無く、結果が空欄になってしまいます。

こうした「読み情報を持たない漢字氏名」に対しては、AIで文字そのものから読みを推定するのが有効です。 名簿の宛名ラベル・五十音順の並べ替え・CRMへの取り込みなど、ふりがな列が必要な場面は多くあります。

五十音順の並べ替え

漢字のままでは正しく並ばない名簿を、読み仮名で自然な順に並べられる

宛名・帳票の印刷

ふりがな付きのラベルや名札を自動生成できる

CRM・会員DBへの登録

読み仮名を必須項目とするシステムへの取り込みに使える

電話対応メモ

難読な名字の読み方を事前に把握しておける

APIキーを安全に保管する

まずClaude APIのキーを用意します。コードに直接書くと共有時に漏れる恐れがあるため、PropertiesService(スクリプトごとの設定値を安全に保管する仕組み)のスクリプトプロパティに保存します。

// スクリプトプロパティにAPIキーを保存しておく(初回1回だけ実行)
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に渡し、姓と名の読みを分けたJSONで受け取ります。 AIの返答には前後に説明文が付くことがあるため、[から]までを切り出してからJSON.parseする点がポイントです。

// 氏名の配列を渡し、ふりがなの配列を受け取る
function fetchFurigana(names) {
  const prompt =
    "次の日本人の氏名それぞれに、ひらがなの読み仮名を付けてください。\n" +
    "姓と名の読みを分け、最も自然な読み方を1つ選んでください。\n" +
    "余計な説明は出力せず、JSON配列だけを返してください。\n" +
    "形式: [{\"index\":0,\"sei\":\"やまだ\",\"mei\":\"たろう\"}]\n\n" +
    "氏名リスト:\n" +
    names.map((n, i) => i + ": " + n).join("\n");

  const payload = {
    model: "claude-sonnet-4-20250514",
    max_tokens: 1024,
    messages: [{ role: "user", content: prompt }],
  };

  const res = UrlFetchApp.fetch("https://api.anthropic.com/v1/messages", {
    method: "post",
    contentType: "application/json",
    headers: {
      "x-api-key": getApiKey(),
      "anthropic-version": "2023-06-01",
    },
    payload: JSON.stringify(payload),
    muteHttpExceptions: true,
  });

  if (res.getResponseCode() !== 200) {
    throw new Error("API error: " + res.getContentText());
  }

  const text = JSON.parse(res.getContentText()).content[0].text;
  return JSON.parse(extractJson(text));
}

// レスポンスからJSON配列部分だけを取り出す(前後の余計な文字対策)
function extractJson(text) {
  const start = text.indexOf("[");
  const end = text.lastIndexOf("]");
  return text.slice(start, end + 1);
}

20件ずつのバッチ処理で一括生成する

1件ずつAPIを呼ぶと通信回数が増え、実行時間もコストもかさみます。20件をまとめて1回のリクエストで送るバッチ処理にします。 ふりがな列(B列)がすでに埋まっている行はスキップするので、途中で止まっても再実行すれば続きから処理できます。

// A列=氏名 / B列=せい / C列=めい を想定
function generateFuriganaAll() {
  const sheet = SpreadsheetApp.getActive().getSheetByName("名簿");
  const last = sheet.getLastRow();
  if (last < 2) return;

  const values = sheet.getRange(2, 1, last - 1, 3).getValues();
  const BATCH = 20;

  // ふりがな未入力の行だけを対象にする
  const targets = [];
  values.forEach((row, i) => {
    const name = String(row[0]).trim();
    const done = String(row[1]).trim() !== "";
    if (name && !done) targets.push({ rowIndex: i, name: name });
  });

  for (let s = 0; s < targets.length; s += BATCH) {
    const chunk = targets.slice(s, s + BATCH);
    const result = fetchFuriganaWithRetry(chunk.map((t) => t.name));

    result.forEach((r) => {
      const target = chunk[r.index];
      if (!target) return;
      values[target.rowIndex][1] = r.sei || "";
      values[target.rowIndex][2] = r.mei || "";
    });

    Utilities.sleep(500); // 連続呼び出しの間隔をあける
  }

  sheet.getRange(2, 1, values.length, 3).setValues(values);
}

エラー時のリトライを入れる

APIは一時的な混雑(レート制限)や通信エラーで失敗することがあります。 失敗したら少し待って再試行する仕組みを入れておくと、大量処理の途中で全体が止まるのを防げます。 待ち時間は試行のたびに伸ばす(指数バックオフ)と、混雑時に成功しやすくなります。

// 一時的なエラー時に最大3回まで再試行する
function fetchFuriganaWithRetry(names, maxRetry) {
  const limit = maxRetry || 3;
  for (let attempt = 1; attempt <= limit; attempt++) {
    try {
      return fetchFurigana(names);
    } catch (e) {
      Logger.log("試行" + attempt + "回目で失敗: " + e.message);
      if (attempt === limit) throw e;
      Utilities.sleep(1000 * attempt); // 待ち時間を伸ばして再試行
    }
  }
}

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

スクリプトエディタを開かなくても実行できるよう、スプレッドシートに専用メニューを追加します。onOpenはシートを開いたときに自動で動く関数です。

// シートを開いたときにカスタムメニューを追加する
function onOpen() {
  SpreadsheetApp.getUi()
    .createMenu("ふりがなツール")
    .addItem("未入力の行にふりがなを生成", "generateFuriganaAll")
    .addToUi();
}

シートを開き直すと上部に「ふりがなツール」メニューが表示され、ボタン感覚で担当者が実行できます。

カタカナ表記にも対応する

システムによってはふりがなをカタカナで登録します。ひらがなで受け取ってから、GAS側でカタカナに変換すると柔軟です。 ひらがなとカタカナは文字コードが0x60ずれているだけなので、簡単に変換できます。

// ひらがなを全角カタカナに変換する
function toKatakana(hiragana) {
  return String(hiragana).replace(/[\u3041-\u3096]/g, (ch) =>
    String.fromCharCode(ch.charCodeAt(0) + 0x60)
  );
}

実務での注意点

1. 読みは一意に定まらない

「新谷」を「あらや」「しんたに」と読むように、氏名の読みは複数あり得ます。AIは自然な読みを返しますが正解を保証しません。 名簿では生成結果を下書きとして扱い、人が最終確認する運用が安全です。

2. 個人情報の取り扱いに配慮する

氏名は個人情報です。外部APIに送る前に、社内規程や利用規約で外部送信が許されるかを確認してください。テストは仮名データで行うと安心です。

3. 実行時間の上限に注意する

GASには1回あたり6分の実行時間制限があります。件数が多い名簿では、生成済み行をスキップする仕組みと分割実行を組み合わせると安定します。

まとめ

PHONETIC関数では読めないCSV由来の氏名も、Claude APIで文字から読みを推定すればふりがなを自動生成できます。 姓と名を分けたJSONでの受け取り、20件ずつのバッチ処理、生成済み行のスキップ、リトライを組み合わせれば、実務レベルで安定して動きます。 読みが一意に定まらない点だけ注意し、人の確認を挟む前提で運用すると安全です。

よくある質問

スプレッドシートには PHONETIC 関数がありますが、これはセルにIMEで入力した際の変換情報を読み取る仕組みです。CSVインポートや他システムから貼り付けた氏名には変換情報が無いため空欄になります。読み情報を持たないデータには、AIで文字そのものから読みを推定するこの方法が有効です。

「東」を「あずま」「ひがし」と読むように、氏名の読みは一意に定まらないことがあります。AIは統計的に自然な読みを返しますが、間違う可能性はあります。名簿のように正確さが求められる用途では、生成結果はあくまで下書きとして扱い、人が最終確認する運用をおすすめします。

プロンプトで「カタカナで」と指定すれば切り替えられます。ひらがなで受け取ってから、GAS側でひらがなをカタカナに変換する方法もあります。全角カタカナへの変換は文字コードを0x60ずらすことで実現できます。

できますが、1件ずつAPIを呼ぶと通信回数が多くなり時間がかかります。この記事のように20件ずつまとめて1回のリクエストで送るバッチ処理にすると、実行時間とAPIコストの両方を抑えられます。件数が多い場合は生成済み行をスキップする仕組みと併用してください。

直接書くのは避けてください。スクリプトを共有した際にキーが漏れる恐れがあります。PropertiesService のスクリプトプロパティに保存し、コードからは PropertiesService.getScriptProperties().getProperty() で読み込む方法が安全です。

名簿整備・AI連携を
相談する。

ふりがな生成以外にも、住所の正規化・重複削除・帳票出力など、名簿やデータ整備を自動化するGAS×AI開発をご相談いただけます。

AI×GAS自動化を見る