LoginSignup
1
1

GASでスプレッドシートからOpenAI APIを実行する

Last updated at Posted at 2024-02-11

スプレッドシートでGoogle App Script(GAS)を使ってOpenAI Text Generation APIを呼ぶと便利です。

OpenAI APIキーを取得して、以下のようなコードをシートのApp Scriptに記述するだけで使えるようになります。

var OPENAI_API_KEY = "sk-xxxxxxxxxxxxxxxx";

// JSDocの記法の一部がスプレッドシートのオートコンプリートに反映される
/**
 * GPTを呼び出すカスタム関数
 *
 * @param {string} input GPTへの入力文字列
 * @param {model} model モデル名。デフォルトは"gpt-3.5-turbo"
 * @param {boolean} useCache キャッシュを使用するかどうか。長い入力を使う時はキャッシュを無効化する必要がある
 * @return GPTで生成した結果
 * @customfunction
 */
function GPT(input, model, useCache) {
    if (model === void 0) { model = "gpt-3.5-turbo"; }
    if (useCache === void 0) { useCache = true; }
    // キャッシュから取得
    var cache = CacheService.getScriptCache();
    if (useCache) {
        try {
            var cachedResult = cache.get(input);
            if (cachedResult) {
                return cachedResult;
            }
        }
        catch (e) {
            if (e.message.includes("Argument too large: key")) {
                throw new Error("キャッシュの取得に失敗しました。入力を短くするか、キャッシュを無効にしてください。");
            }
            else {
                throw e;
            }
        }
    }
    // OpenAI Chat Completion APIで生成
    var URL = "https://api.openai.com/v1/chat/completions";
    var headers = {
        "Content-Type": "application/json",
        "Authorization": "Bearer ".concat(OPENAI_API_KEY)
    };
    var body = {
        model: model,
        // max_tokens: 100,
        messages: [{ role: "user", content: input }]
    };
    var response = UrlFetchApp.fetch(URL, {
        method: "post",
        headers: headers,
        payload: JSON.stringify(body)
    });
    var result = JSON.parse(response.getContentText()).choices[0].message.content;
    // キャッシュに保存
    if (useCache) {
        cache.put(input, result, 21600);
    }
    return result;
}

これで、=GPT()という関数が使えるようになります。

image.png

ScriptCacheで同じ内容でAPIが連続して叩かれないようにしています。キャッシュの有効期限は6時間(21,600秒)なので注意しましょう。

お好みでmax_tokenやtemperature等をパラメータで指定できるようにしてください。

clasp版

google/claspを使ってTypeScriptで記述する場合は以下のような感じです。

GASではfetchがUrlFetchAppになる所と、importが使えない点などに気をつければ、あとは普通だと思います。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1