GASでスプレッドシートの文章を
AIで自動翻訳する方法

スプレッドシートに並んだ英文や外国語のテキストを、UrlFetchApp(GASから外部APIを呼ぶ標準機能)とClaude API(Anthropic社の生成AI)を組み合わせ、 指定した言語へ自動翻訳して隣の列に書き込む方法を、そのまま動くコードで解説します。

|対象: GAS / スプレッドシート / Claude API / 業務自動化

Table of Contents

なぜ翻訳をGAS×AIで自動化するのか

結論から言うと、スプレッドシートに並んだ多量のテキスト翻訳は、 GAS(Google Apps Script。Googleサービスを操作する無料のプログラム実行環境)とAIで自動化できます。 原文の列を用意しておけば、AIが1行ずつ翻訳して隣の列に書き込んでくれるので、 コピペして翻訳ツールに貼り、戻して……という手作業がなくなります。

スプレッドシートにはGOOGLETRANSLATE()という標準の翻訳関数もあります。手軽さでは十分ですが、文体や用語の扱いは指定できません。 Claude APIなどのAI翻訳は、次のような「指示できる翻訳」が強みです。

文体を指定できる

「丁寧なビジネス文体で」など、用途に合わせたトーンに整えられる

用語ルールを守れる

「製品名は訳さない」「専門用語はカタカナに」といった指定ができる

多言語に対応

翻訳先の言語を指示で変えるだけで、英語以外にも同じコードで対応

後処理まで自動

翻訳結果をそのまま隣の列に書き込み、検索・集計にも使える

この記事では、A列の原文を読み取り、Claude APIで翻訳してB列へ書き込む、という流れを実装します。 翻訳済みのセルは自動でスキップするので、途中で止まっても再実行するだけで続きから埋められます。

準備:APIキーの保管と翻訳シートの用意

必要なのは2つです。1つ目は翻訳シート。A列に原文、B列を翻訳の書き込み先とし、1行目はヘッダー(原文 / 翻訳など)にしておきます。シート名はここでは「翻訳」とします。2つ目はClaude APIのキーです。 このキーは料金が発生する権限そのものなので、コードに直書きしてはいけません。GASの「スクリプトプロパティ」(PropertiesServiceで読み書きする、スクリプト単位の設定保存領域)に入れ、コードからはキー名で読み出します。

// 一度だけ実行してAPIキーを安全に保存する
function saveApiKey() {
  // 実行後、この関数のキー文字列は削除しておく
  PropertiesService.getScriptProperties()
    .setProperty("ANTHROPIC_API_KEY", "sk-ant-xxxxxxxx");
}

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

saveApiKeyを一度だけ実行したら、キー文字列はコードから消しておきましょう。共有スプレッドシートでは、 編集権限を持つ人にスクリプトも見えます。直書きを避けるのはそのためです。以降はどの関数からもgetApiKey()で安全に取り出せます。

Claude APIで翻訳する関数を作る

まずはテキストと翻訳先の言語を渡すと、訳文を返す関数を作ります。品質を安定させるコツは、 プロンプト(AIへの指示文)で出力の形式とルールを明示することです。「訳文だけを出力」「前置きは書かない」と指定しておくと、余計な注釈が混ざらず、 そのままセルに書き込める訳文が返ります。

// テキストを指定言語に翻訳して返す
// targetLang 例: "日本語", "英語", "中国語(簡体字)"
function translateText(text, targetLang) {
  const url = "https://api.anthropic.com/v1/messages";

  const prompt =
    "次の文章を" + targetLang + "に翻訳してください。\n" +
    "・訳文だけを出力し、前置きや注釈は書かない。\n" +
    "・自然で読みやすいビジネス文体にする。\n" +
    "・固有名詞や製品名は無理に訳さない。\n\n" +
    "文章:\n" + text;

  const payload = {
    model: "claude-haiku-4-5",
    max_tokens: 1000,
    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());
  }

  return JSON.parse(res.getContentText()).content[0].text.trim();
}

返答はcontent配列の先頭textに入ります。muteHttpExceptions: trueを付けると、エラー時も例外で止まらず自分でステータスコードを確認できます。モデルは軽量なclaude-haiku-4-5から始め、訳文の品質をさらに上げたいときに高性能なclaude-opus-4-8へ差し替えるだけで切り替えられます。

エラーに強くする:リトライと指数バックオフ

外部APIは、一時的な混雑や通信の不調で失敗することがあります。特にセルを大量に処理すると、 短時間に呼び出しが集中して一時的なエラー(レート制限)が返ることがあります。そこで、失敗したら 少し待ってから再試行する仕組みを入れます。待ち時間を1秒・2秒・4秒と倍にしていく方式を 「指数バックオフ」と呼びます。

// 一時的なエラー時に少し待って再試行する
function translateWithRetry(text, targetLang, maxRetry) {
  maxRetry = maxRetry || 3;

  for (let i = 0; i < maxRetry; i++) {
    try {
      return translateText(text, targetLang);
    } catch (e) {
      // 最後の試行で失敗したら、そのまま呼び出し元に投げる
      if (i === maxRetry - 1) throw e;
      // 待ち時間を1秒・2秒・4秒と伸ばす(指数バックオフ)
      Utilities.sleep(1000 * Math.pow(2, i));
    }
  }
}

こうしておくと、一時的な失敗は自動で回復し、それでもダメなら最後にエラーを投げて処理を止めます。 翻訳の本体はこのtranslateWithRetry()を呼ぶようにすれば、安定性がぐっと上がります。

シートの原文列をまとめて翻訳する

いよいよ本体です。A列(原文)とB列(翻訳)をまとめて読み込み、原文があってB列が空の行だけを翻訳して書き込みます。すでに翻訳済みのセルはスキップされるので、 途中で止まっても再実行すれば未処理分だけを埋められます。

// A列の原文を翻訳してB列に書き込む
// シート構成: A=原文, B=翻訳(空のセルだけ処理する)
function translateColumn() {
  const sheet = SpreadsheetApp.getActive().getSheetByName("翻訳");
  const targetLang = "日本語"; // 翻訳先の言語
  const lastRow = sheet.getLastRow();
  if (lastRow < 2) return; // データなし(1行目はヘッダー想定)

  // A列(原文)とB列(翻訳)をまとめて読み込む
  const rows = sheet.getRange(2, 1, lastRow - 1, 2).getValues();

  let count = 0;
  for (let i = 0; i < rows.length; i++) {
    const source = String(rows[i][0]).trim();
    const done = String(rows[i][1]).trim();

    if (!source) continue;   // 原文が空ならスキップ
    if (done) continue;      // すでに翻訳済みならスキップ

    const translated = translateWithRetry(source, targetLang);

    // B列(i行目の実セル位置)に書き込む
    sheet.getRange(i + 2, 2).setValue(translated);
    SpreadsheetApp.flush(); // 途中経過をすぐ画面に反映する

    count++;
    if (count >= 30) break;  // 1回30件までに区切る(実行時間制限対策)
    Utilities.sleep(300);    // 連続呼び出しの間隔をあける
  }
}

getValues()でA・B列を一度にまとめて読み込み、ループの中で1行ずつ判定します。翻訳結果はsetValue()でB列に書き込み、SpreadsheetApp.flush()で途中経過をすぐ画面に反映します。1回の実行は30件までに区切っているので、行が多い場合は 翻訳が残っている状態でもう一度実行すれば続きから進みます。

カスタムメニューとトリガーで実行する

最後に、翻訳をワンクリックで呼び出せるようにします。onOpen()(スプレッドシートを開いたときに自動で走る特別な関数)でメニューを追加すると、 シート上部に「AI翻訳」メニューが出て、そこから翻訳を実行できます。

// シートを開いたときに翻訳メニューを追加する
function onOpen() {
  SpreadsheetApp.getUi()
    .createMenu("AI翻訳")
    .addItem("空のセルを翻訳する", "translateColumn")
    .addToUi();
}

原文が随時追加されるシートなら、時間主導トリガー(決まった間隔で関数を自動実行するGASの仕組み)でtranslateColumnを定期的に回すのも有効です。空のセルだけを翻訳する作りなので、トリガーで繰り返し実行しても 同じ行を二重に翻訳することはありません。1回30件の区切りと合わせれば、件数が多くても 実行時間制限(無料枠で6分)に達しにくくなります。分割実行の詳しい実装は関連記事で解説しています。

まとめ

スプレッドシートとClaude APIをGASでつなぐと、翻訳作業を丸ごと自動化できます。ポイントは4つです。 APIキーはスクリプトプロパティで安全に保管し、翻訳はプロンプトで文体・用語ルールを指定し、 空のセルだけを対象にして再実行に強くし、リトライと件数の区切りでAPI制限と実行時間制限をかわす—— この型を押さえれば、翻訳に限らず、要約・分類・下書き生成といったAI活用にも同じ流れで応用できます。

よくある質問

GOOGLETRANSLATE()はセルに書くだけで使える手軽な翻訳関数ですが、文脈や口調の指定はできません。Claude APIなどのAI翻訳は「丁寧なビジネス文体で」「専門用語はカタカナのままに」といった指示を添えられるため、用途に合わせた訳文に整えられます。手軽さ重視ならGOOGLETRANSLATE、品質やトーンの調整重視ならAI翻訳が向いています。

できます。翻訳先の言語をプロンプト(AIへの指示文)で指定するだけなので、フランス語・中国語・韓国語なども同じコードで扱えます。本文では翻訳先の言語を引数で渡す実装にしているので、セルや設定で言語を切り替えられます。

GASには1回の実行あたり6分(Google Workspaceは30分)の実行時間制限があります。1回あたりの処理件数を区切り、翻訳済みのセルはスキップして、続きは次回の実行で再開する作りにすると安定します。本文でスキップ処理を、関連記事で分割実行の方法を解説しています。

書いてはいけません。APIキーは料金が発生する権限そのものです。共有スプレッドシートのスクリプトに直書きすると、編集権限を持つ他の人にキーが見えてしまいます。GASのスクリプトプロパティ(PropertiesServiceで読み書きする設定保存領域)に保管し、コードからはキー名で読み出してください。

できます。翻訳結果を書き込む列が空のセルだけを対象にすれば、成功済みの行は自動的にスキップされ、失敗した行だけがもう一度処理されます。本文のコードはこの「空のセルだけ翻訳する」方式なので、再実行するだけで未処理分を埋められます。

Claude APIは処理した文字数(トークン)に応じた従量課金です。翻訳は入力・出力とも短いことが多いため、軽量モデルのclaude-haiku-4-5を使えば1セルあたりの費用はごくわずかです。まずは少量で試して1回あたりの消費量を確認し、対象範囲を広げるのがおすすめです。

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

翻訳のほかにも、要約・問い合わせ分類・返信下書きの自動生成など、 AI APIとGASを組み合わせた自動化をご相談いただけます。既存のスプレッドシート運用にもそのまま組み込めます。

AI×GAS自動化の対応範囲を見る