Googleスプレッドシートにフリガナを自動で書き込むGASスクリプト

Googleスプレッドシートにフリガナを自動で書き込むGASスクリプト

Yahoo! Japanの形態素解析APIを活用し、スプレッドシート上の氏名などに対応するフリガナ(半角カタカナ)を自動で書き込むGoogle Apps Scriptです。対象の列を指定すれば、対応する列に読み仮名が一括で出力されます。API連携・文字変換・エラーハンドリングの実装も含まれており、実務での利用にも対応できます。

全体構成と処理の流れ

const CLIENT_ID = 'dj0xxxxxxxxxxxxxxxxxxxxxxxxx'; // Client ID
const URL = 'https://jlp.yahooapis.jp/MAService/V2/parse?appid=' + CLIENT_ID;

function writeFuriganaToSheets() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  processSheet(ss.getSheetByName('決済代金'), 7, 'G', 'O');
  processSheet(ss.getSheetByName('施設'), 7, 'F', 'P');
}

スプレッドシート対象範囲の処理

function processSheet(sheet, startRow, nameCol, furiganaCol) {
  const lastRow = sheet.getLastRow();
  const nameRange = sheet.getRange(nameCol + startRow + ':' + nameCol + lastRow);
  const names = nameRange.getValues();

  const result = [];

  for (let i = 0; i < names.length; i++) {
    let name = names[i][0];

    if (!name || typeof name !== 'string') {
      result.push(['']);
      continue;
    }

    name = name.replace(/ /g, ' ');
    const res = yahooAnalysis(name);
    const json = JSON.parse(res.getContentText());

    if (!json.result || !json.result.tokens) {
      result.push(['']);
      continue;
    }

    const readings = json.result.tokens.map(token => token[1]).filter(Boolean).join('');
    const halfKana = hiraganaToHalfWidthKatakana(readings);
    result.push([halfKana]);
  }

  sheet.getRange(furiganaCol + startRow + ':' + furiganaCol + (startRow + result.length - 1)).setValues(result);
}

Yahoo! JAPANの形態素解析APIを呼び出す関数

function yahooAnalysis(queryText) {
  const headers = {
    'Content-Type': 'application/json',
  };

  const payload = {
    'id': 'furigana-req',
    'jsonrpc': '2.0',
    'method': 'jlp.maservice.parse',
    'params': {
      'q': queryText
    }
  };

  const options = {
    'method': 'post',
    'headers': headers,
    'payload': JSON.stringify(payload),
    'muteHttpExceptions': true
  };

  return UrlFetchApp.fetch(URL, options);
}

ひらがなを半角カタカナに変換する処理

function hiraganaToHalfWidthKatakana(input) {
  const katakana = input.replace(/[\u3041-\u3096]/g, ch =>
    String.fromCharCode(ch.charCodeAt(0) + 0x60)
  );

  return toHalfWidthKatakana(katakana);
}

全角カタカナを半角カタカナに変換する処理

function toHalfWidthKatakana(str) {
  const kanaMap = {
    'ガ': 'ガ', 'ギ': 'ギ', 'グ': 'グ', 'ゲ': 'ゲ', 'ゴ': 'ゴ',
    'ザ': 'ザ', 'ジ': 'ジ', 'ズ': 'ズ', 'ゼ': 'ゼ', 'ゾ': 'ゾ',
    'ダ': 'ダ', 'ヂ': 'ヂ', 'ヅ': 'ヅ', 'デ': 'デ', 'ド': 'ド',
    'バ': 'バ', 'ビ': 'ビ', 'ブ': 'ブ', 'ベ': 'ベ', 'ボ': 'ボ',
    'パ': 'パ', 'ピ': 'ピ', 'プ': 'プ', 'ペ': 'ペ', 'ポ': 'ポ',
    'ヴ': 'ヴ',
    'ア': 'ア', 'イ': 'イ', 'ウ': 'ウ', 'エ': 'エ', 'オ': 'オ',
    'カ': 'カ', 'キ': 'キ', 'ク': 'ク', 'ケ': 'ケ', 'コ': 'コ',
    'サ': 'サ', 'シ': 'シ', 'ス': 'ス', 'セ': 'セ', 'ソ': 'ソ',
    'タ': 'タ', 'チ': 'チ', 'ツ': 'ツ', 'テ': 'テ', 'ト': 'ト',
    'ナ': 'ナ', 'ニ': 'ニ', 'ヌ': 'ヌ', 'ネ': 'ネ', 'ノ': 'ノ',
    'ハ': 'ハ', 'ヒ': 'ヒ', 'フ': 'フ', 'ヘ': 'ヘ', 'ホ': 'ホ',
    'マ': 'マ', 'ミ': 'ミ', 'ム': 'ム', 'メ': 'メ', 'モ': 'モ',
    'ヤ': 'ヤ', 'ユ': 'ユ', 'ヨ': 'ヨ',
    'ラ': 'ラ', 'リ': 'リ', 'ル': 'ル', 'レ': 'レ', 'ロ': 'ロ',
    'ワ': 'ワ', 'ヲ': 'ヲ', 'ン': 'ン',
    'ァ': 'ァ', 'ィ': 'ィ', 'ゥ': 'ゥ', 'ェ': 'ェ', 'ォ': 'ォ',
    'ャ': 'ャ', 'ュ': 'ュ', 'ョ': 'ョ', 'ッ': 'ッ',
    'ー': 'ー', '。': '。', '、': '、', '・': '・', '「': '「', '」': '」', ' ': ' '
  };

  return str.split('').map(ch => kanaMap[ch] || ch).join('');
}

フリガナ取得時に発生しうるエラーと条件

// nameが空文字列または非文字列の場合、空白を挿入してスキップ
if (!name || typeof name !== 'string') {
  result.push(['']);
  continue;
}

// APIのレスポンスが無効(tokensが存在しない)場合も空白でスキップ
if (!json.result || !json.result.tokens) {
  result.push(['']);
  continue;
}

サンプル入力と出力例

// 例:G列に「山田 太郎」、F列に「東京大学」と入力されている場合
// 出力(O列・P列)→ ザンダ タロウ、トウキョウダイガク(半角カタカナ)

APIキーに関する注意

Yahoo!デベロッパーセンターから取得したアプリケーションID(CLIENT_ID)をコード中に記述しています。個人利用・公開利用の際は、利用規約に従ってAPIキーの取り扱いを行ってください。