ChatGPTとGoogleスプレッドシートでスプラトゥーンのQA表を作る

# ChatGPTのAPIを触ってみよう

## はじめに

ChatAPIのAPIを試す場合、色々な方法が考えられるが、チャットボットの実装となるとさらにクライアント（SlackやLINE）などとのつなぎ込みも必要となるため、比較的実装が簡単なGoogleスプレッドシートでなにか作ってみることにしました。

手始めに、A列に書いた質問に対する答えをB列に書いてもらうスクリプトを作成することにした。このくらいならすぐ作れそうです。

## GASの自動生成

そういえば、このくらいのスクリプトであればChatGPT自身が生成できそうなので、ざっくりと仕様を伝えてみたところ、それらしいものが出力されました。

### 質問

```
Google Spreadsheetで、A列に書いた質問をChatGPTのAPIに投げ、回答をB列に出力するGASスクリプトを書きなさい。
```

### ChatGPT(GPT-4)の回答

```
Google Apps Scriptを使ってGoogle SpreadsheetにChatGPTからの回答を取得するためのスクリプトを以下に示します。これは、A列に質問があり、B列に回答を取得するように設定されています。まず、OpenAIのAPIキーを取得してください。

1. スクリプトエディタを開く
Google スプレッドシートを開いて、「拡張機能」>「Apps Script」を選択して、スクリプトエディタを開きます。

2. スクリプトを貼り付ける
以下のスクリプトをエディタにコピー＆ペーストしてください。
```
```Javascript
const OPENAI_API_KEY = 'your_openai_api_key_here';
const SHEET_NAME = 'Sheet1'; // シート名を必要に応じて変更してください

function getGPTResponses() {
  const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = spreadsheet.getSheetByName(SHEET_NAME);
  const numRows = sheet.getLastRow();
  
  for (let row = 1; row <= numRows; row++) {
    const question = sheet.getRange(row, 1).getValue();
    
    if (question) {
      const response = fetchGPTResponse(question);
      sheet.getRange(row, 2).setValue(response);
    }
  }
}

function fetchGPTResponse(prompt) {
  const url = 'https://api.openai.com/v1/engines/davinci-codex/completions';
  const headers = {
    'Authorization': 'Bearer ' + OPENAI_API_KEY,
    'Content-Type': 'application/json'
  };
  const options = {
    method: 'post',
    headers: headers,
    payload: JSON.stringify({
      'prompt': prompt,
      'max_tokens': 50, // 必要に応じて回答の長さを変更
      'n': 1,
      'stop': null,
      'temperature': 0.8
    }),
    muteHttpExceptions: true
  };
  
  try {
    const response = UrlFetchApp.fetch(url, options);
    const jsonResponse = JSON.parse(response.getContentText());
    return jsonResponse.choices[0].text.trim();
  } catch (error) {
    console.error('Error fetching GPT response:', error);
    return 'Error fetching GPT response';
  }
}
```
```
3. APIキーを設定する
your_openai_api_key_hereを、取得したOpenAI APIキーに置き換えてください。

4. スクリプトを実行
スクリプトエディタのメニューバーで、「関数を選択」ドロップダウンリストからgetGPTResponsesを選択し、「▶実行」ボタンをクリックしてスクリプトを実行します。

5. 完了
スクリプトが実行されると、A列の質問に対する回答がB列に出力されます。
```

## 修正

構文的な間違いは存在しなかった。ただし、ChatGPTは2021年までの知識しかないため、davinci-codexのコードが出力されている。そのためURLを以下のように変更した。

```javascript
  const url = 'https://api.openai.com/v1/chat/completions';
```

また、使用モデルを指定しなければならないのと、プロンプトの渡しかたが変更になっているため以下の通り修正しました。

### 修正前
```javascript
      'prompt': prompt,
      'max_tokens': 50, // 必要に応じて回答の長さを変更
```
### 修正後
```javascript
      // 'prompt': prompt,
      'model': 'gpt-3.5-turbo',
      messages: [{'role': 'user', 'content': prompt}],
      'max_tokens': 50, // 必要に応じて回答の長さを変更
```

メッセージの取り出し方が変更されているので修正

### 修正前
```javascript
    return jsonResponse.choices[0].text.trim();
```

### 修正後

```javascript
    return jsonResponse.choices[0].message.content;
```

## 実行

早速、シート（シート名を`Sheet1`に変更してください）に質問を埋め、スクリプトを実行してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64722/e8ba2de6-be47-8aa3-6b03-6caf952e4d40.png)

それっぽい答えが帰ってきました（富士山より北岳のほうが高い、という話は嘘でしたが……）

質問が短文だと面白くないので、ChatGPTにわたすメッセージ部分を以下のように変え、スプラトゥーン専用の質問エンジンに変えてみました（2021年ではスプラトゥーン３はまだ発売されていないので、スプラトゥーン２を指定しました）

```javascript
     messages: [
        {'role': 'user', 'content': 'あなたはプロゲーマーで、ゲームの攻略本を執筆している人です。'},
        {'role': 'user', 'content': 'スプラトゥーン２について困っていることを書きます。３センテンスくらいの長さで対策を教えてください。ルールはナワバリバトル、使っているブキはスプラシューターです'},
        {'role': 'user', 'content': prompt}
        ],
```

今度はスプラトゥーンで困っていることを列挙して再実行してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64722/2ab692d2-f4e9-24b1-53b3-644655762ce6.png)

やはりおかしい部分がちらほらあるものの、大まかには前提に沿った回答が帰ってくるようになりました。

## さいごに

想像以上に面白い答えが帰ってきたため、他のお題も試してみたくなりました。また、一問一答ではなく、課題をブレイクダウンしてそれぞれの対策を書き出してもらうようにするともう少し実用的になるのではないかと感じました。