B3S
menu close

雑記

GeminiAPI × GAS で文章生成ジェネレーター作ってみた


わら

公開日:2025/06/27


 

最近になって、ようやくGeminiを触ってみました。
せっかくなので、Gemini APIを使って何か作れないかと思い、試験的に「文章生成ジェネレーター」を作ってみました。

目次

APIキーを取得する方法

APIキーを取得する方法は、大きく分けて2つあります。

方法A:Google Cloud Platform 方法B:Google AI Studio
クレジットカード登録 原則として必要 不要
設定の複雑さ やや複雑(プロジェクト作成、請求先設定など)
簡単(ログインしてボタンを押すだけ)
得られるAPIキー 同じもの(無料枠も同じ) 同じもの(無料枠も同じ)
おすすめな人 本格的にCloudの他サービスも使う企業
手軽にAPIを試したい個人・開発者

「Google Cloud Platform」はクレジットカードの登録が必要だったり、設定が複雑とのことなので、
今回は「Google AI Studio」を使います。

 

Google AI Studioを使いましょう

ステップ1:Google AI Studioにアクセスする

ウェブブラウザで、以下のURLにアクセスします。
https://aistudio.google.com/
Googleアカウントでのログインを求められたら、普段お使いのアカウントでログインしてください。

ステップ2:APIキーを作成する

画面の右上にある「API キーを取得」というボタンをクリックします。
開いた画面で、「新しいAPIキーを作成」というボタンをクリックします。
すぐにAPIキー(長い文字列)が生成されます。右側にあるコピーアイコンをクリックして、キーをコピーし、メモ帳などに貼り付けておきましょう。

 

Gemini × GASで「SNS投稿ジェネレーター」を作る

今回は、SNSで投稿する文章を生成してくれるシステムを作ります。

  1. スプレッドシートのメニューから「拡張機能」>「Apps Script」を選択します。
  2. 新しいタブでスクリプトエディタが開きます。既存のコード(function myFunction() {…})は全て削除してください。
  3. APIキーを安全に保管する
    • 【重要】APIキーをコードに直接書き込むのは危険です。**以下の手順で安全な場所に保管します。
      1. スクリプトエディタの左側メニューにある歯車アイコン(プロジェクトの設定)をクリックします。
      2. 「スクリプト プロパティ」のセクションにある「スクリプト プロパティを追加」をクリックします。
      3. プロパティに「GEMINI_API_KEY」、値に先ほどコピーしたあなたのAPIキーを貼り付け、「スクリプト プロパティを保存」をクリックします。
  4. 以下のコードを全てコピーして、空のスクリプトエディタ画面に貼り付けてください。コードを貼り付けたら、フロッピーディスクのアイコン(プロジェクトを保存)をクリックして保存します。
/**
 * スプレッドシートを開いたときにカスタムメニューをUIに追加します。
 */
function onOpen() {
  SpreadsheetApp.getUi()
    .createMenu('? Geminiメニュー')
    .addItem('キャッチコピーとハッシュタグを生成', 'generateContents')
    .addToUi();
}

/**
 * シートの情報を基に、Gemini APIを呼び出してキャッチコピーとハッシュタグを生成し、シートに書き込みます。
 */
function generateContents() {
  // --- 1. スプレッドシートから情報を取得 ---
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  const sns = sheet.getRange('B3').getValue();
  const theme = sheet.getRange('B4').getValue();
  const target = sheet.getRange('B5').getValue();
  const point = sheet.getRange('B6').getValue();
  const tone = sheet.getRange('B7').getValue();

  // 商材/テーマが入力されているかチェック
  if (!theme) {
    SpreadsheetApp.getUi().alert('「商材/テーマ」(セルB4) を入力してください。');
    return; // 処理を中断
  }
  
  // --- 2. Geminiに送る指示(プロンプト)を作成 ---
  const prompt = `
あなたはプロのSNSマーケターです。
以下の情報をもとに、SNS投稿用のキャッチコピー案とハッシュタグ案を具体的に提案してください。

# 投稿情報
- SNSの種類:${sns}
- 商材/テーマ:${theme}
- ターゲット:${target}
- 伝えたいこと:${point}
- 希望するトーン:${tone}

# 出力形式
## キャッチコピー案 (5つ)
・
・
・
・
・

## ハッシュタグ案 (10個)
# # #
`;

  // --- 3. Gemini APIを呼び出す準備 ---
  // スクリプトプロパティから安全にAPIキーを取得
  const apiKey = PropertiesService.getScriptProperties().getProperty('GEMINI_API_KEY');
  if (!apiKey) {
    SpreadsheetApp.getUi().alert('APIキーが設定されていません。スクリプトエディタの「プロジェクトの設定」からスクリプトプロパティ「GEMINI_API_KEY」を設定してください。');
    return; // 処理を中断
  }
  
  const url = `https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-flash-latest:generateContent?key=${apiKey}`;
  
  const payload = {
    "contents": [{
      "parts": [{
        "text": prompt
      }]
    }]
  };
  
  const options = {
    'method': 'post',
    'contentType': 'application/json',
    'payload': JSON.stringify(payload),
    'muteHttpExceptions': true // エラーが発生してもスクリプトを止めずに情報を取得する
  };

  // --- 4. API実行と結果の書き込み ---
  // 実行中であることをユーザーに知らせる
  sheet.getRange('B11').setValue('生成中...');
  sheet.getRange('B12').setValue('生成中...');
  SpreadsheetApp.flush(); // シートの表示を即時更新

  try {
    const response = UrlFetchApp.fetch(url, options);
    const responseCode = response.getResponseCode();
    const responseBody = response.getContentText();

    if (responseCode === 200) {
      const result = JSON.parse(responseBody);
      // 安全にテキストを抽出
      const generatedText = result.candidates[0].content.parts[0].text;
      
      // 生成されたテキストを「キャッチコピー」と「ハッシュタグ」に分割
      const catchphraseMatch = generatedText.match(/## キャッチコピー案(?: \(5つ\))?([\s\S]*?)## ハッシュタグ案/);
      const hashtagMatch = generatedText.match(/## ハッシュタグ案(?: \(10個\))?([\s\S]*)/);
      
      const catchphrases = catchphraseMatch ? catchphraseMatch[1].trim() : 'キャッチコピー部分の取得に失敗しました。';
      const hashtags = hashtagMatch ? hashtagMatch[1].trim() : 'ハッシュタグ部分の取得に失敗しました。';

      // 結果をセルに書き込む
      sheet.getRange('B11').setValue(catchphrases);
      sheet.getRange('B12').setValue(hashtags);

    } else {
      // APIからエラーが返された場合
      sheet.getRange('B11').setValue('APIエラー');
      sheet.getRange('B12').setValue(`コード: ${responseCode}\n詳細: ${responseBody}`);
      SpreadsheetApp.getUi().alert(`APIリクエストでエラーが発生しました。(コード: ${responseCode})\n詳細はセルE6を確認してください。APIキーやモデル名が正しいか確認してください。`);
    }

  } catch (e) {
    // 通信エラーなど、API呼び出し自体に失敗した場合
    sheet.getRange('B11').setValue('実行エラー');
    sheet.getRange('B12').setValue(e.toString());
    SpreadsheetApp.getUi().alert('スクリプトの実行中にエラーが発生しました。\n' + e.toString());
  }
}

 

【実行】承認と動作確認

  1. スプレッドシートを再読み込みしてください。すると、メニューバーに「? Geminiメニュー」という新しい項目が表示されます。
  2. 初回実行時の「承認」
    1. B4〜B8セルに投稿したい内容を入力します。
    2. 「? Geminiメニュー」>「キャッチコピーとハッシュタグを生成」をクリックします。(↑私は「実行」ボタンに置き換えました)
    3. 初めて実行する際に「承認が必要です」というダイアログが表示されます。「続行」をクリックします。
    4. 自分のGoogleアカウントを選択します。
    5. 「このアプリは Google で確認されていません」 という警告画面が表示されますが、ご自身が作成した安全なスクリプトなので問題ありません。左下の「詳細」をクリックし、「(プロジェクト名)(安全でないページ)に移動」をクリックします。
    6. 最後に「許可」をクリックします。
  3. 動作確認
    1. 承認が終わると、スクリプトが実行されます。B11〜B12の「生成結果」の欄に「生成中…」と表示され、十数秒待つと、Geminiが考えたキャッチコピー案とハッシュタグ案が自動で入力されれば成功です!

期待できること

今回はSNS投稿ジェネレーターとして作成しましたが、普通に使えるぐらい性能に問題なかったので、今後は色々な使い方に期待できそうです。

低コストでの実現:

GASの無料利用枠とGemini APIの無料枠を活用することで、非常に安価に、あるいは無料で運用を開始できます。

Gemini APIの多機能性:

要約だけでなく、翻訳、ブレインストーミング、文章のトーン調整、アイデア出しなど、多様なAI処理を組み込めます。

業務効率化の拡張性:

用途別のフォーマット(プロンプト)を用意することで、SNS投稿、メールマガジン作成、文章校正、議事録の清書など、様々な定型業務を効率化できます。また、生成された文章の履歴を残しておけば、過去のものと比較することも可能。

トリガー機能による「完全自動化」

  • 定時実行: 「毎日朝9時に最新ニュースを要約してチャットに投稿する」「毎週月曜日に週次レポートのドラフトを自動生成する」といった定期的なタスクを自動化できます。
  • イベントドリブン実行: 「スプレッドシートの特定のセルが更新されたら」「フォームが送信されたら」といったイベントをきっかけに、文章生成処理を自動で実行できます。

注意点

※無料APIは、基本的にAI学習対象となっているため機密情報、個人情報の取扱には十分注意しましょう。