OpenAIのapi機能をgasで試してみた

概要

前回取得したAPI KEYを利用してみます。

yo4-su.hatenablog.jp

 

OPenAIのAPIgoogleのGASで使用します。

手順は以下の通り 

 

 

1. APIキーの連携

google ドライブに移動します。

drive.google.com

 

【新規】→【google スプレッドシート】 をクリックし、スプレッドシートを開きます。

google drive

 

無題のスプレッドシートの個所をクリックし、任意の名前を付けます。

スプレッドシート

 

拡張機能】→【Apps Script】をクリックすると、Apps Scriptが開きます。

スプレッドシート

 

Apps Scriptを開いたら、左端の【設定】マークをクリックします。

Apps Script

設定画面の一番下にある【スクリプト プロパティを追加】をクリックします。

スクリプトの追加

 

 

プロパティの欄にAPIキーの名前を任意に設定し、値にOpenAIで取得したAPIキーを貼り付け、【スクリプトプロパティを保存】を押して完了です。

プロパティ名は何ででも問題ないです。

API KEY

 

2. サンプルコードの生成

サンプルコードはChatGPT上で作成します。

ChatGPTに移動して、「スプレッドシートでOpenAIのAPIKEYを使用するスクリプト書いて」と入力してみるとサンプルコード書いてくれました。

chatgpt.com

 

code生成

注意書きとして一番下に「ChatGPT の回答は必ずしも正しいとは限りません。重要な情報は確認するようにしてください。」 と表記がありますが、試しに実行してみます。

 

エディタをクリックし、functionの部分を更新します。

あと、タイトルをプロジェクト1に変更します。

edit

 

記入後、実行を押すと、承認画面になるので、承認します。

承認

途中、以下のような画面が出てくるので、【詳細】→【プロジェクト1に移動】を

実行します。

ok

最後に【続行】をクリックします。

 

続行

 

 

3. 実行結果

横浜市の人口を聞いてみました。

人口

結果、「2023年の時点で、横浜市の人口は約375万人です。ただし、正確な数字は年によって変動するため、最新の情報は横浜市の公式ウェブサイトや最新の統計資料を参照することをお勧めします。」 となりました。トークン数が64、料金は0.0288

 

結果

東京タワーも聞いてみました。

東京タワー

 

ただし、gpt-5では動作しませんでした。。

gpt-5-nanoとかもダメでした。

 

実行スクリプト

// スプレッドシート用 GPT 関数
function GPT(prompt, maxTokens) {
  if (!maxTokens) maxTokens = 500; // 第2引数がなければデフォルト500

  const apiKey = PropertiesService.getScriptProperties().getProperty("OPENAI_API_KEY");

  const payload = {
  //  model: "gpt-5",
   model: "gpt-4o-mini",
    messages: [
      { role: "system", content: "あなたは親切なアシスタントです。" },
      { role: "user", content: prompt }
    ],
    max_completion_tokens: maxTokens
  };

  const options = {
    method: "post",
    contentType: "application/json",
    headers: { Authorization: "Bearer " + apiKey },
    payload: JSON.stringify(payload),
    muteHttpExceptions: true
  };

  const response = UrlFetchApp.fetch(url, options);
  const json = JSON.parse(response.getContentText());

  // 応答テキストを取得
  let answer = "";
  if (json.choices && json.choices[0] && json.choices[0].message) {
    answer = json.choices[0].message.content || "応答なし";
  } else {
    answer = "応答なし";
  }

  // トークン数と概算料金を計算(1トークン = 0.00045円想定)
  let tokens = 0, cost = 0;
  if (json.usage && json.usage.completion_tokens) {
    tokens = json.usage.completion_tokens;
    cost = (tokens * 0.00045).toFixed(6); // 小数6桁表示
  }

  // 横並びで返す(回答、トークン数、料金)
  return [[answer, tokens, cost]];
}
/* -----codeの行番号----- */