GASでスプレッドシートの文章を
AIで自動翻訳する方法
スプレッドシートに並んだ英文や外国語のテキストを、UrlFetchApp(GASから外部APIを呼ぶ標準機能)とClaude API(Anthropic社の生成AI)を組み合わせ、 指定した言語へ自動翻訳して隣の列に書き込む方法を、そのまま動くコードで解説します。
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を組み合わせた自動化をご相談いただけます。既存のスプレッドシート運用にもそのまま組み込めます。