📗

【GAS】スプレッドシート上で「Gemini」を使ってみる。

2024/11/07に公開

この記事では、スプレッドシート上でGemini(Google)を使ってテキスト生成をする「カスタム関数」 を作ります。

今回作るもの

こんな感じで使えるカスタム関数を作ります。

準備:用意するもの

手順

  1. Google App Scriptを作成する
  2. APIキーを設定する
  3. コード.gs にコードを記載する
  4. スプレッドシートから関数を使う

1)Google App Scriptを作成する

まず「拡張機能」にある「App Script」をクリックして、App Scriptを作成します。

2)APIキーを設定する

左のメニューバーから「プロジェクトの設定」を選択します。下の方にある「スクリプト プロパティ」にAPIキーを設定します。

3)コード.gs にコードを記載する

コード.gsに下記コードを貼り付けて保存します。

/**
 * Gemini APIを使用してチャット応答を生成します。
 *
 * @param {string} userPrompt ユーザーからの入力テキスト
 * @param {string} systemPrompt システムプロンプト(省略可)
 * @param {"gemini-1.5-flash"|"gemini-1.5-pro"|"gemini-1.0-pro"} model 使用するモデル
 * @param {number=} temperature 応答のランダム性(0.0-2の範囲、省略可)
 * @param {number=} maxToken 最大トークン数(省略可)
 * @return {string} AIからの応答テキスト
 * @customfunction
 */
function ChatAIGemini(userPrompt="", systemPrompt="", model, temperature, maxToken) {
    // 対応モデル
    const validModels = [
        "gemini-1.5-flash",
        "gemini-1.5-pro",
        "gemini-1.0-pro"
    ];
    // バリデーション
    if (userPrompt === "" || !userPrompt) throw new Error("プロンプトを入力してください");
    if (model === "" || !model) throw new Error("モデルを指定してください");
    if (!validModels.includes(model)) throw new Error(`無効なモデルです。以下から選択してください: ${validModels.join(", ")}`);

    // APIのセットアップ
    const apiKey = PropertiesService.getScriptProperties().getProperty('GEMINI_API_KEY');
    const apiUrl = `https://generativelanguage.googleapis.com/v1beta/models/${model}:generateContent?key=${apiKey}`;
    // メッセージの作成
    const messages = [];
    if (systemPrompt !== "") messages.push({'role': 'user', 'parts': [{'text': systemPrompt}]});
    messages.push({'role': 'user', 'parts': [{'text': userPrompt}]});
    // リクエストの作成
    const headers = {
        'Content-Type': 'application/json',
    };
    // リクエストボディの作成
    const requestBody = {
        'contents': messages
    };
    // generationConfigの作成(指定されたパラメータのみ含める)
    const generationConfig = {};
    if (temperature !== "") generationConfig.temperature = temperature;
    if (maxToken !== "") generationConfig.maxOutputTokens = maxToken;
    if (Object.keys(generationConfig).length > 0) requestBody.generationConfig = generationConfig;
    // リクエストの実行
    const response = UrlFetchApp.fetch(apiUrl, {
        'method': 'POST',
        'headers': headers,
        'payload': JSON.stringify(requestBody)
    });
    // レスポンスの解析
    const responseBody = response.getContentText();
    const responseJson = JSON.parse(responseBody);

    // レスポンスの構造を確認してエラーハンドリング
    if (responseJson.candidates && responseJson.candidates[0] && responseJson.candidates[0].content) {
        const text = responseJson.candidates[0].content.parts[0].text;
        return text;
    } else {
        throw new Error("Geminiからの応答が不正な形式です: " + JSON.stringify(responseJson));
    }
}

4)スプレッドシートから関数を使う

=ChatAIGemini(B2,C2,"gemini-1.5-pro")

参考ページ

Discussion