GASのLanguageAppで文章を
無料で自動翻訳する方法

LanguageApp(GASに標準搭載された翻訳サービス)を使えば、APIキーの発行も課金設定もなしで、スプレッドシートの文章をコードから自動翻訳できます。基本の使い方から一括翻訳・HTML翻訳・上限対策まで、動くコードで解説します。

|対象: GAS / LanguageApp / 翻訳

Table of Contents

LanguageAppとは(APIキー不要の翻訳)

LanguageAppは、GAS(Google Apps Script)に最初から組み込まれている翻訳用のサービスです。Google Cloudの Translation APIとは別物で、APIキーの発行やクレジットカードの登録は不要。LanguageApp.translate()を呼ぶだけで、その場で機械翻訳が使えます。

APIキー不要

認証設定なしで、スクリプトを書いたらすぐ翻訳できる

追加料金なし

GASの無料枠で使える。ただし1日の実行上限あり

多言語対応

英語・中国語・韓国語などGoogle翻訳と同じ言語に対応

自動言語判定

翻訳元の言語を空にすると何語かを自動で判別

手軽な反面、訳文の口調や専門用語を細かく指定する用途には向きません。その使い分けは最後のセクションで整理します。

基本の使い方 translate()

使い方はシンプルです。第1引数に原文、第2引数に翻訳元の言語コード、第3引数に翻訳先の言語コードを渡します。 言語コードはja(日本語)、en(英語)のようなISO言語コードで指定します。

function basicTranslate() {
  // LanguageApp.translate(原文, 翻訳元の言語, 翻訳先の言語)
  const en = LanguageApp.translate("こんにちは、お世話になっております。", "ja", "en");
  Logger.log(en); // Hello, thank you for your continued support.

  const ja = LanguageApp.translate("Please find the attached invoice.", "en", "ja");
  Logger.log(ja); // 添付の請求書をご確認ください。
}

戻り値は翻訳後の文字列です。訳文はそのまま変数に入れて、セルへの書き込みやメール本文の組み立てに使えます。

翻訳元の言語を自動判定する

何語で書かれているか分からないデータを扱うときは、第2引数(翻訳元の言語)に空文字""を渡します。すると翻訳元の言語を自動判定してから翻訳先の言語へ訳します。問い合わせフォームに多国籍のユーザーから届く文章などに便利です。

function autoDetectTranslate() {
  // 翻訳元に空文字 "" を渡すと言語を自動判定する
  const inputs = [
    "Bonjour tout le monde",   // フランス語
    "Guten Tag",               // ドイツ語
    "안녕하세요",               // 韓国語
  ];

  inputs.forEach((text) => {
    const ja = LanguageApp.translate(text, "", "ja");
    Logger.log(text + " -> " + ja);
  });
}

スプレッドシートの列を一括翻訳する

実務でよくあるのが「A列の原文を、B列にまとめて翻訳したい」というケースです。getValues()で原文を一括取得し、翻訳結果を配列に貯めてsetValues()で一度に書き戻します。すでに訳済みの行はスキップして、翻訳の呼び出し回数を節約します。

// A列の原文(日本語)を翻訳し、B列に英訳を書き込む
function translateColumn() {
  const sheet = SpreadsheetApp.getActive().getSheetByName("翻訳");
  const lastRow = sheet.getLastRow();
  if (lastRow < 2) return;

  // 1行目はヘッダー。A2 から最終行までを一括取得
  const sources = sheet.getRange(2, 1, lastRow - 1, 1).getValues();
  const existing = sheet.getRange(2, 2, lastRow - 1, 1).getValues();

  const results = sources.map((row, i) => {
    const text = String(row[0]).trim();
    // 原文が空、またはすでに訳済みならスキップ(上限の節約)
    if (!text || existing[i][0]) return [existing[i][0]];
    const translated = LanguageApp.translate(text, "ja", "en");
    return [translated];
  });

  // まとめて書き戻す(1セルずつ書くより高速)
  sheet.getRange(2, 2, results.length, 1).setValues(results);
}

1セルずつsetValue()するより、配列にまとめて最後に一括書き込みするほうが大幅に速くなります。

1つの原文を複数言語へ翻訳する

商品説明やお知らせを、英語・中国語・韓国語などへ同時に展開したいこともあります。 翻訳先の言語コードを配列にしておき、1行ごとに全言語へ訳して横方向に並べれば、多言語カタログを一度に作れます。

// 1つの原文を複数の言語へ一括翻訳し、横方向に並べる
function translateToMultipleLanguages() {
  const sheet = SpreadsheetApp.getActive().getSheetByName("多言語");
  const targets = ["en", "zh", "ko"]; // B:英語 C:中国語 D:韓国語
  const lastRow = sheet.getLastRow();
  if (lastRow < 2) return;

  const sources = sheet.getRange(2, 1, lastRow - 1, 1).getValues();

  const results = sources.map((row) => {
    const text = String(row[0]).trim();
    if (!text) return targets.map(() => "");
    return targets.map((lang) => LanguageApp.translate(text, "ja", lang));
  });

  sheet.getRange(2, 2, results.length, targets.length).setValues(results);
}

HTMLタグを保ったまま翻訳する

HTMLメールのテンプレートをそのまま翻訳すると、タグまで訳されてリンクや装飾が壊れることがあります。 第4引数に{ contentType: "html" }を渡すと、タグ構造は保ったまま、中のテキストだけを翻訳します。

function translateHtmlMail() {
  const html =
    '<p>Dear <strong>customer</strong>,</p>' +
    '<p>Your order has shipped. <a href="https://example.com">Track it here</a>.</p>';

  // contentType: "html" でタグ構造を保ったまま中身だけ翻訳
  const translated = LanguageApp.translate(html, "en", "ja", {
    contentType: "html",
  });

  Logger.log(translated);
  // <a> や <strong> のタグはそのまま、テキスト部分だけ日本語になる
}

contentTypeを省略した場合はプレーンテキストとして扱われます。装飾付きの文章を扱うときはhtmlの指定を忘れないようにしましょう。

上限対策とClaude APIとの使い分け

LanguageAppには1日あたりの翻訳回数・文字数に無料の実行上限があります。大量のデータを扱うと途中で上限に達することがあるため、 同じ原文の再翻訳を避ける工夫が有効です。原文をキーにしてCacheService(一時保存の仕組み)へ結果を残しておけば、繰り返し出てくる文言の翻訳は1回で済みます。

// 同じ原文の再翻訳を避けて、1日の上限を節約する
function translateWithCache(text, source, target) {
  const cache = CacheService.getScriptCache();
  const key = [source, target, text].join("|");

  const cached = cache.get(key);
  if (cached !== null) return cached; // 既訳があればAPIを呼ばない

  const translated = LanguageApp.translate(text, source, target);
  cache.put(key, translated, 21600); // 6時間(最大値)保存
  return translated;
}

function useCachedTranslate() {
  Logger.log(translateWithCache("ありがとうございます", "ja", "en"));
  Logger.log(translateWithCache("ありがとうございます", "ja", "en")); // 2回目はキャッシュから
}

LanguageAppが向く場面

短文の下訳、社内向けの参考訳、ざっくり内容を把握したいだけの一括翻訳など。無料で手軽に回せるのが強みです。

Claude APIが向く場面

顧客向けの文面、専門用語の統一、敬語や口調の指定、文脈を踏まえた自然な訳が必要な場面。 まずLanguageAppで下訳し、重要な文だけ生成AIで仕上げる併用も現実的です。 詳しくはClaude APIでの翻訳記事を参照してください。

まとめ

GASのLanguageAppは、APIキーなし・無料で使える手軽な翻訳サービスです。translate()の3引数を押さえれば基本の翻訳ができ、自動言語判定・複数言語への一括翻訳・HTML翻訳まで対応できます。 1日の上限にはキャッシュと訳済みスキップで備え、品質が重要な場面ではClaude APIと使い分けるのが実務的です。

よくある質問

APIキーは不要で、追加料金もかかりません。LanguageAppはGASに標準で組み込まれているサービスで、LanguageApp.translate()を呼ぶだけで翻訳できます。Google Cloud TranslationのAPIキー発行や課金設定は必要ありません。ただし1日あたりの翻訳回数・文字数には無料の実行上限があります。

第2引数の言語コードに空文字("")を渡すと、翻訳元の言語を自動判定してくれます。例えば LanguageApp.translate(text, "", "ja") とすれば、英語でも中国語でも自動で判別して日本語に翻訳します。何語か分からない混在データを扱うときに便利です。

定型的な短文を大量に、無料でざっと訳したいならLanguageAppが手軽です。一方で、専門用語の統一・敬語や口調の指定・文脈を踏まえた自然な訳が必要ならClaude APIが向いています。まずLanguageAppで下訳し、重要な文だけClaude APIで仕上げるといった併用も現実的です。

第4引数に { contentType: "html" } を指定すると、HTMLタグを翻訳対象から除外し、テキスト部分だけを翻訳します。<a>や<strong>などのタグ構造を保ったまま中身の文言だけ訳せるため、HTMLメールのテンプレート翻訳などに使えます。

CacheServiceやスプレッドシートの隣の列に翻訳結果を保存し、すでに訳した文はスキップする仕組みにすると、無駄な翻訳呼び出しを減らせます。原文をキーにキャッシュしておけば、同じ文言が繰り返し出てきても翻訳は1回で済みます。

LanguageAppは機械翻訳のため、専門用語や固有名詞、長い複文では精度が落ちることがあります。一文を短く区切る、用語だけ事前・事後に置換する、といった前処理・後処理で改善できます。品質が重要な場面では、Claude APIなどの生成AIによる翻訳への切り替えを検討してください。

翻訳・多言語対応の自動化を
相談する。

スプレッドシートの一括翻訳、多言語カタログ生成、AI翻訳との併用など、翻訳まわりの業務自動化をGAS開発でご相談いただけます。

AI×GAS自動化を見る