スプレッドシートで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()
という関数が使えるようになります。
ScriptCacheで同じ内容でAPIが連続して叩かれないようにしています。キャッシュの有効期限は6時間(21,600秒)なので注意しましょう。
お好みでmax_tokenやtemperature等をパラメータで指定できるようにしてください。
clasp版
google/claspを使ってTypeScriptで記述する場合は以下のような感じです。
GASではfetchがUrlFetchApp
になる所と、import
が使えない点などに気をつければ、あとは普通だと思います。