見出し画像

ChatGPT APIをGoogleスプレッドシートで使う方法をChatGPTに教えてもらう

ChatGPTをGoogleSpreadSheet上で使えたら便利だなと思い、やり方をChatGPTに教えてもらいながら試してみました。こういう時に今までなら解説記事をググって読みながら試すところですが、ChatGPTがすべて教えてくれました。

事前準備

まずはOpenAIのAPIリファレンスを見てみると、curlを使ったAPIの使い方のサンプルが載っています。

curl https://api.openai.com/v1/chat/completions \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  -d '{
  "model": "gpt-3.5-turbo",
  "messages": [{"role": "user", "content": "Hello!"}]
}'

サンプルからGASのコードを作成

これをGoogleスプレッドシートで実行する方法をChatGPTに聞いてみます。

function getOpenAIResponse() {
  var headers = {
    "Content-Type": "application/json",
    "Authorization": "Bearer YOUR_API_KEY"
  };

  var payload = {
    "model": "gpt-3.5-turbo",
    "messages": [{"role": "user", "content": "Hello!"}]
  };
  
  var options = {
    "method": "post",
    "headers": headers,
    "payload": JSON.stringify(payload)
  };

  var response = UrlFetchApp.fetch("https://api.openai.com/v1/chat/completions", options);
  var data = JSON.parse(response.getContentText());
  
  Logger.log(data);
}

さっそく使えそうなスクリプトを出してくれました!

シートのセルに入出力できるように修正

しかし、このままだとChatGPTへの入力がスクリプト内でベタ書きになっていて、出力がログになっています。スプレッドシートのセルに書いた質問を別のセルに回答してくれた方が便利そうなので、修正をお願いしてみます。

function openaiAPI() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var cell = sheet.getRange("A1"); // 入力するセルを指定
  var content = cell.getValue(); // 入力内容を取得

  var url = "https://api.openai.com/v1/chat/completions";
  var apiKey = "YOUR_API_KEY"; // 自分のAPIキーに置き換える
  var data = {
    "model": "gpt-3.5-turbo",
    "messages": [{"role": "user", "content": content}]
  };
  var options = {
    "method": "post",
    "headers": {
      "Content-Type": "application/json",
      "Authorization": "Bearer " + apiKey
    },
    "payload": JSON.stringify(data)
  };
  var response = UrlFetchApp.fetch(url, options);
  var result = JSON.parse(response.getContentText()).choices[0].text;

  var outputCell = sheet.getRange("B1"); // 結果を出力するセルを指定
  outputCell.setValue(result); // 結果をセルに出力
}

うまく修正してくれました。これならA1セルに質問を入れると、B1セルに回答が出力されそうです!

エラーの修正

ところが実際に実行してみるとエラーになってしまいます。何が悪いのかLogger.log()で入力・出力の値をログに出力してみます。

するとChatGPTからの回答であるresponseには正しく出力されているが、resultがnullになっていてJSONからの結果の抽出がうまく行っていないことがわかります。そこでJSONから正しく抽出する方法をChatGPTに聞いてみます。

元のコードでは choices[0].text で文字列を抽出していましたが、choices[0].message.content が正しいことがわかりました。早速コードを修正して実行してみます。

正しくresponseのJSONから回答が抽出されてresultに格納されました!

シートで動かしてみる

スプレッドシートで図形に関数を割り当ててボタンにして実行できるようにしました。
動かしてみると、A1セルに入れた質問に対して、B1セルに回答が出力されています。

ChatGPTが必ず正しいコードを出力してくれるわけではないですが、うまく使えばサンプルコードを探したり、デバッグしたりの手間がとても省けて便利に使えそうです!

いただいたサポートは記事作成に活用させていただきます